论坛首页 Java企业应用论坛

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

浏览 2695 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-04-24  

项目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连接池之间有什么关联关系?
     

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics