对于ssh开发,一旦出现:
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
这样的错误,是很纠结了。意思是你连接池满了。此时最好能监视当前的连接数,这样调试起来要方便很多。一种方法是查看Oracle数据库的系统表v$session,这张表保存当前的每一个数据库连接。但这里的连接实连接,有时HIbernate的连接池满不是实连接的问题,而是dataSource维护的连接满了。例如,我的Hibernate的dataSource使用Spring管理,配置如下:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
</property>
<property name="username">
<value>xxx</value>
</property>
<property name="password">
<value>xxx</value>
</property>
<property name="maxActive">
<value>100</value>
</property>
<property name="maxWait">
<value>3000</value>
</property>
<property name="maxIdle">
<value>20</value>
</property>
</bean>
注意这里的maxActive参数,它就是数据源的最大连接数,一旦当前连接数达到此阈值,后来的连接请求必须排队。所以一方面可以通过修改此阈值提高系统效率。
言归正传,如果要获取当前的连接数,可以先获取此bean,然后访问他的numActive数据就可以获取当前连接数了。示例代码如下:
BasicDataSource dataSource = (BasicDataSource)SpringTools.getBean("dataSource");
System.out.println(dataSource.getNumActive());
就是这么简单,但是网上却很难找到,呵呵。