连接池

来源:互联网 发布:mac如何彻底关机 编辑:程序博客网 时间:2024/05/19 20:38

连接池


预先创建一组连接,用的时候取出,用完后放入连接池;
连接池(集合)
实现思路:
1.指定初始化连接数目
(App启动的时候,就执行创建)
2.指定最大连接数目
3.指定当前使用连接个数
代码实现:
1.MyPool.java连接池类
2.指定全局参数:初始化数目 最大连接数 当前连接 连接池集合
3.构造函数,循环创建3个连接
4.写一个创建连接的方法
5.获取连接
池中有连接,直接拿;
没有的话,需要判断是否超出最大连接数
6.释放连接

代理

代理:如果对接口中的某个指定方法的功能进行扩展,而不想实现接口里的所有方法,可以使用动态代理的方式

当关闭连接的时候,要把连接放入连接池。当调用Connection接口的close方法的时候,希望触发pool.addLast(con)操作,把连接放入连接池;
解决方式:

    1.静态代理    2.动态代理

java使用代理模式,静态动态代理

如何对connection生成代理
Proxy
static Object newProxyInstance(
ClassLoader loader, 当前使用的类加载器
Class

    private Connection ceateConnection(){        Class.forName("com.mysql.jdbc.Driver");        Connection con=DriverManagement.getConnection("jdbc:mysql:///test","user","password");        Connection proxy=(Connection)Proxy.newProxyInstance(            con.getClass().getClassLoader(),   //类加载器            con.getClass().getInterfaces(),    //目标对象实现的接口            new InvocationHandler(){//当执行这个Connection接口中的所有方法都会执行上述这一段代码,我们只需要对close方法进行处理,即methodName=close方法的时候,把连接放入连接池。                public Object invoke(Object proxy,Method method,Object[] args){                        Object result=null;                        //当前执行方法的方法名字                        String methodName=method.getName();                        if("close".equals(methodName)){                            System.out.println("begin:当前执行close方法开始");                            pool.addLast(con);                                                              System.out.println("连接已经放入连接池");                        }else{                        }                        //调用目标对象方法                        method.invoke(con,args);                        return result;                }        }        )    }

当具体目标是一个类的时候,可以

Class.forName(“com.mysql.jdbc.Driver”);
final Connection con=DriverManager.getConnection(“jdbc:mysql:///test”,”user”,
)
con.getClass().getInterfaces() 当目标对象是一个具体的类的时候
new Class[]{Connection.class}, //目标对象实现的接口

DBCP连接池

硬编码方式

    BasicDataSource dataSource=new BasicDataSource();        //连接池参数设置,初始化连接数、最大连接数、连接字符串、驱动、用户、密码BasicDataSource dataSource=new BasicDataSource();dataSource.setUrl("jdbc:mysql://localhost:3306/test");dataSource.setDriverClassName("com.mysql.jdbc.Driver");        dataSource.setUsername("root");        dataSource.setPassword("qqaazz");        dataSource.setInitialSize(3);        dataSource.setMaxTotal(6);        dataSource.setMaxIdle(3000);

properties加载

import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp2.BasicDataSource;import org.apache.commons.dbcp2.BasicDataSourceFactory;//加载property配置文件        Properties prop=new Properties();        InputStream in=APP_DBCP.class.getResourceAsStream("db.properties");        prop.load(in);          DataSource dataSource=BasicDataSourceFactory.createDataSource(prop);//      DataSource dataSource=BasicDataSourceFactory.createDataSource(prop);        Connection connection=dataSource.getConnection();        connection.prepareStatement("delete from student where id=4").executeUpdate();

C3P0连接池

核心类:CombopoolDataSource ds;
使用:下载,引入jar文件