数据库连接池
池参数(所有池参数都有默认值):
初始大小:10个
最小空闲连接数:3个
增量:一次创建的最小单位(5个)
最大空闲连接数:12个
最大连接数:20个
最大的等待时间:1000毫秒
四大连接参数
连接池也是使用四大连接参数来完成创建连接对象!
实现的接口
连接池必须实现:javax.sql.DataSource接口!
连接池返回的Connection对象,它的close()方法与众不同!调用它的close()不是关闭,而是把连接归还给池!代表该链接不被占用了。
数据库连接池
连接池的概念
用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
JDBC数据库连接池接口(DataSource)
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
自定义连接池(CloudPool)
分析:CloudPool需要有一个List,用来保存连接对象。在CloudPool的构造器中创建5个连接对象放到List中!当用人调用了CloudPool的getConnection()时,那么就从List拿出一个返回。当List中没有连接可用时,抛出异常。
我们需要对Connection的close()方法进行增强,所以我们需要自定义CloudConnection类,对Connection进行装饰!即对close()方法进行增强。因为需要在调用close()方法时把连接“归还”给池,所以CloudPool类需要拥有池对象的引用,并且池类还要提供“归还”的方法。
CloudPool.java
public class CloudPool implementsDataSource {private static Properties props = newProperties();private List list = new ArrayList();static{
InputStream in= CloudPool.class.getClassLoader()
.getResourceAsStream("dbconfig.properties");try{
props.load(in);
Class.forName(props.getProperty("driverClassName"));
}catch(Exception e) {throw newRuntimeException(e);
}
}public CloudPool () throwsSQLException {for (int i = 0; i < 5; i++) {
Connection con=DriverManager.getConnection(
props.getProperty("url"), props.getProperty("username"),
props.getProperty("password"));
CloudPool conWapper= new CloudConnection(con, this);
list.add(conWapper);
}
}public voidadd(Connection con) {
list.add(con);
}public Connection getConnection() throwsSQLException {if(list.size() > 0) {return list.remove(0);
}throw new SQLException("没连接了");
}}
public class CloudConnection extendsConnectionWrapper {privateItcastPool pool;publicCloudConnection(Connection con, CloudPool pool) {super(con);this.pool =pool;
}
@Overridepublic void close() throwsSQLException {
pool.add(this);
}
}