【问题标题】:Connection pool problem with Spring and programmatic transaction managementSpring和程序化事务管理的连接池问题
【发布时间】:2010-08-17 08:07:17
【问题描述】:

我需要您的帮助来解决 Spring 的连接池问题。 我正在使用带有 Java 1.4 的 Spring(无注释)。

这里是数据源和连接池定义:

<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 连接”,并且所有进程都停止了。我不明白为什么所有线程都被锁定。

在 Spring 应用程序上下文中,所有服务和 DAO 类都定义为单例。

有什么想法吗?

感谢您的帮助。

贝朗热

【问题讨论】:

  • ${database.maxActive} 和 ${database.maxIdle} 解析为什么?
  • 嗨! maxActive=5 和 maxIdle=1。

标签: java multithreading spring transactions connection-pooling


【解决方案1】:

maxActivemaxIdle 使用什么值?如果我知道这些值,我可以给你一个更明确的答案,但同时你也可以尝试将 hibernate.dbcp.maxWait 的值从 100000 更改为 1 并再次测试你的应用程序。

还要确保你没有不小心创建了一些 DAO 方法synchronized

【讨论】:

  • 您好,感谢您的回复!以下是 maxActive 和 maxIdle 的值: database.maxActive=5 database.maxIdle=1 如果我将 hibernate.dbcp.maxWait 的值更改为 1,我收到以下消息:org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object 我的问题是所有进程都停止了,连接没有释放。谢谢
  • 好的,我的意思是把它设置为-1 无限期地等待。但这不应该是问题。您可以创建应用程序的线程转储吗?它可以揭示代码中的哪个位置或哪些锁导致了死锁。
【解决方案2】:

这很奇怪,但我终于解决了我的问题。

这种连接锁定的原因是我在 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 无法识别当前事务并开始一个新事务。它导致了连接锁定...

我通过删除程序化事务管理解决了这个谜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多