连接池
预先创建一组连接,用的时候取出,用完后放入连接池;
连接池(集合)
实现思路:
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文件