在连接池中的几个十分重要的参数说明:
参数缺省值说明initialSize0线程池启动时初始化的连接数maxActive8最大活动连接数,如果非正整数,则不做限制maxIdle8最大空闲连接数minIdle0最小空闲连接数maxWaitindeFinitely(在没有连接可用时)连接池等待一个数据连接可用时以毫秒计 的最大等待时间,超时以后跑出异常,-1则无限等待
dbcp依赖于commons-pool来存储连接对象。BasicDataSource默认使用GenericObjectPool来管理连接对象。
dbcp中的一些名词概念:
名词说明对象池(ObjectPool接口)可以把它认为是一种容器,用来装池对象的,并且包含了用来创建池对象的工厂对象池对象就是要放到池容器中的对象,理论上可以是任何对象对象池工厂(OBjectPoolFactory接口)用来创建对象池的工厂池对象工厂(PoolableObjectFactory接口)用来创建池对象,将不用的池对象进行钝化(passivateObject),对要使用的池对象(activeObject), 对池对象进行验证(validateObject),对有问题的池对象进行销毁(destroyObject)等工作 使用dbcp的几大步骤: 在src文件中建立properties文件,文件中设置了一些属性通过BasicDataSource创建Connection对象根据Connection对象操作数据库 一下代码采用连接池操作数据库,dbcp.properties文件,这个是配置文件 #连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mytest username=root password=mysql1991 #<!--初始化连接--> dataSource.initialSize=20 #<!--最大空闲连接--> dataSource.maxIdle=20 #<!--最小空闲连接--> dataSource.minIdle=5 #最大连接数量 dataSource.maxActive=100 #是否自动回收超时连接 dataSource.removeAbandoned=true #超时时间(以秒数为单位) #设置超时时间有一个要注意的地方,超时时间=现在的时间-程序中创建Connection的时间, #如果maxActive比较大,比如超过100,那么removeAbandonedTimeout可以设置长一点比如180, #也就是三分钟无响应的连接进行回收,当然应用的不同设置长度也不同。 dataSoure.removeAbandonedTimeout=180 #<!--超时等待时间以毫秒为单位--> #maxWait代表当Connection用尽了,多久之后进行回收丢失连接 dataSource.maxWait=100创建完properties文件后就要用Properties类来解析properties文件,如下: Properties pro = new Properties(); InputStream in = DbcpTest.class.getClassLoader().getResourceAsStream("bcp.properties"); pro.load(in);下面使用连接池技术查询表结构 import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSourceFactory; public class DbcpTest { public static void main(String[] args) throws Exception { // 解析properties文件 Properties p = new Properties(); InputStream in = DbcpTest.class.getClassLoader().getResourceAsStream( "dbcp.properties"); p.load(in); DataSource ds = BasicDataSourceFactory.createDataSource(p); Connection conn = ds.getConnection(); String sql = "select * from t_user"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { String name = rs.getString("name"); String password = rs.getString("password"); System.out.println("用户名:" + name + " 密码:" + password); } if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } }