浏览 2695 次
锁定老帖子 主题:c3p0和dbcp连接池同时配置产生的问题
精华帖 (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连接池之间有什么关联关系? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |