日期:2014-05-16  浏览次数:20402 次

转帖Apache DBCP连接池使用Tip

使用Apache Commons DBCP配置多个数据库访问使用中有一些经验,小Tip记录下来。?

1.? BasicDataSource配置maxWait参数(单位为ms),在getConnection()得不到Connection时(例如由于连接池用光)超时maxWait毫秒将会抛出异常(例如org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted)。默认不配置该参数,getConnection()方法将等待到有连接可用,通常的情况是,如果连接池用光,此方法将一直等待不返回。?

2. maxActive为连接池大小。maxIdle为连接池内保持的空闲连接最大数, minIdle为连接池保持的空闲连接最小数?

3. 通过BasicDataSource 对象getConnection()获得的Connection,在使用完之后一定要关闭( conn.close() )!? 在短期内频繁访问不关闭Connection的数据库操作方法,将很快把连接池用光(原来错误以为连接池会自动回收Connection的想法是错误的,从连接池出来的Connection,调用conn.close其实不是关闭Connection,而是回收),Connection的自动释放通常需要很长的时间(甚至怀疑能不能自动释放),所以程序里面不关闭的后果就是后来一直得不到Connection。不管是查询还是更新方法都要关闭。?

自己做了个论坛程序,在测试时发现,进行几次与数据库的交互操作后,程序就会无响应。研究后发现,是因为DBCP连接池没有进行正确的配置。通过改变配置后,没有再出现程序无响应的情况发生。?

原来的applicationContext.xml中的DBCP配置如下:?



??? <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">?
??????? <!-- driver for Derby-->?
??????? <property name="driverClassName">?
??????????? <value>org.apache.derby.jdbc.ClientDriver</value>?
??????? </property>?
??????? <property name="url">?
??????????? <value>jdbc:derby://localhost:1527/sample;create=true</value>?
??????? </property>?
??????? <property name="username">?
??????????? <value>ahoo</value>?
??????? </property>?
??????? <property name="password">?
??????????? <value>ahoo</value>?
??????? </property>?
</bean>?


修改后如下:?





??? <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">?
??????? <!-- driver for Derby-->?
??????? <property name="driverClassName">?
??????????? <value>org.apache.derby.jdbc.ClientDriver</value>?
??????? </property>?
??????? <property name="url">?
??????????? <value>jdbc:derby://localhost:1527/sample;create=true</value>?
??????? </property>?
??????? <property name="username">?
??????????? <value>ahoo</value>?
??????? </property>?
??????? <property name="password">?
??????????? <value>ahoo</value>?
??????? </property>?
??????? <!-- 初始化连接 -->