c3p0和dbcp连接池同时配置产生的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liaosifa/article/details/84422860
项目1数据库连接池配置
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@192.168.249.50:1521:orcl">
</property>
<property name="username" value="test_0407" />
<property name="password" value="test_0407" />
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="ds" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.dialect">com.eka.util.MyDialect</prop>
<prop key="hibernate.c3p0.min_size">10</prop>
<prop key="hibernate.c3p0.max_size">50</prop>
<!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
<prop key="hibernate.c3p0.timeout">1000</prop>
<!-- 最大的PreparedStatement的数量 -->
<prop key="hibernate.c3p0.max_statements">100</prop>
<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
<prop key="hibernate.c3p0.acquire_increment">2</prop>
<!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
<prop key="hibernate.c3p0.idle_test_period">120</prop>
<!-- 每次都验证连接是否可用 -->
<prop key="hibernate.c3p0.validate">false</prop>
</props>
</property>
</bean>

如果是使用hql则使用c3p0连接池,如果是使用sql,则使用dbcp连接池。


项目2连接池配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@192.168.249.50:1521:orcl">
</property>
<property name="username" value="test_0407" />
<property name="password" value="test_0407" />
</bean>


现在的情况是:
项目1通过webservice调用项目2,项目2在调用中多次跟数据库交互(都是简单的增改,执行速度都是比较快的,调用的方法在job中执行正常,不存在泄露情况)。两个项目使用同一个数据库,数据库oracle连接池最大是150,现在的问题是,如果项目1多次调用项目2之后,项目1就一直处于等待登陆状态(使用pstrace查看锁在查询数据库那里),请各位大大帮忙分析一下!

令如果将项目1和项目2中的dbcp连接池配置调整为:
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@192.168.249.50:1521:orcl"/>
<property name="username" value="test_0407"/>
<property name="password" value="test_0407"/>
<!--maxActive: 最大连接数量-->
<property name="maxActive" value="50"/>
<!--minIdle: 最小空闲连接-->
<property name="minIdle" value="10"/>
<!--maxIdle: 最大空闲连接-->
<property name="maxIdle" value="50"/>
<!--initialSize: 初始化连接-->
<property name="initialSize" value="10"/>
<!-- 连接被泄露时是否打印 -->
<property name="logAbandoned" value="true"/>
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="180"/>
<!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒-->
<property name="maxWait" value="10000"/>
<!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->
<property name="timeBetweenEvictionRunsMillis" value="180000"/>
<!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
<property name="numTestsPerEvictionRun" value="25"/>
<!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程-->
<property name="minEvictableIdleTimeMillis" value="10000"/>
<property name="validationQuery" value="SELECT sysdate FROM DUAL"/>
</bean>


问题得到解决!(不知道是不是暂时被解决)

疑问:1,能否解释一下,出现这种状况的原因,以及为什么这样配置可以解决?
2, dbcp默认连接池中,连接池连接被使用后,什么时候被释放变成空闲线程(是否在调完数据库之后立刻释放),空闲线程释放可以被再次使用? 空闲线程数量会不会大于最大连接池大小,如果大于会发生什么?
3,oracle连接池和dbcp连接池之间有什么关联关系?
展开阅读全文

没有更多推荐了,返回首页