我需要你的帮助才能解决Spring的连接池问题。 我正在使用Spring with Java 1.4(没有注释)。
这是数据源和连接池定义:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${database.jdbcName}</value>
</property>
<property name="url" value="jdbc:sybase:${database.url}">
</property>
<property name="username">
<value>${database.username}</value>
</property>
<property name="password">
<value>${database.password}</value>
</property>
<property name="maxActive">
<value>${database.maxActive}</value>
</property>
<property name="maxIdle" >
<value>${database.maxIdle}</value>
</property>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SybaseDialect</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.dbcp.maxWait">100000</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
</props>
</property>
...
当所有连接都处于活动状态时,如果系统需要新连接,我会收到一条消息“打开JDBC连接”,并且所有进程都已停止。我不明白为什么所有的线程都被锁定了。
所有服务和DAO类都在Spring应用程序上下文中定义为单例。
有什么想法吗?
感谢您的帮助。
Béranger
答案 0 :(得分:1)
您对maxActive
和maxIdle
使用了什么值?如果我知道这些值,我可以给你一个更明确的答案,但在此期间你也可以尝试将hibernate.dbcp.maxWait
的值从100000
更改为1
并再次测试你的应用程序。< / p>
另外请确保您没有意外地制作了一些DAO方法synchronized
。
答案 1 :(得分:0)
这是一个奇怪的,但我终于解决了我的问题。
这种连接锁定的原因是我在Spring中使用了声明式和编程式事务管理。我认为我的程序化事务管理是错误的。
以下是用于开始交易的代码:
//Return Spring context
ApplicationContext context = ApplicationContextHolder.getContext();
// transactionManager
PlatformTransactionManager transactionManager = (PlatformTransactionManager) context.getBean("txManager");
//Set propagation required
DefaultTransactionDefinition td = new DefaultTransactionDefinition();
td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// Begin
TransactionStatus transactionStatus = transactionManager.getTransaction(td);
如您所见,我将程序化事务设置为“必需”。但是当这些事务在事务上下文中启动时,Spring没有识别当前事务并开始新事务。它导致连接锁定...
我通过删除程序化事务管理解决了这个谜团。