为啥我们的 Spring/Hibernate/JDBC/Websphere 系统中的连接过早关闭?

Posted

技术标签:

【中文标题】为啥我们的 Spring/Hibernate/JDBC/Websphere 系统中的连接过早关闭?【英文标题】:Why are connections closing prematurely in our Spring/Hibernate/JDBC/Websphere system?为什么我们的 Spring/Hibernate/JDBC/Websphere 系统中的连接过早关闭? 【发布时间】:2013-05-31 18:17:48 【问题描述】:

在用户请求使用在 WAS8 上运行的 Spring+Hibernate+JDBC 期间,我们遇到了一个偶发的会话关闭问题。它以前发生过,然后消失了,现在它再次抬起头,总是随机的。我想验证这不是应用程序问题,以便我可以质疑我们的管理员并能够正确地说这不是应用程序问题。如果其他人遇到过这个问题,也很感兴趣。

春天:3.2.2 休眠:4.1.12 Websphere:v8

首先,我将列出我的假设。据我了解,WAS 处理数据源的连接池。从这些池中,hibernate/spring 请求连接创建它自己的逻辑连接,它通过它执行。然后,当它“关闭”连接/会话时,它不会关闭物理连接,而是将其释放回处理连接何时/是否应该实际关闭的池。

我们在应用程序中的所有事务都使用@Transactional 注释,并且在某些情况下使用只读。我们 @AutowiredSessionFactory 进入我们的 DAO 的超级类,当获得会话时,我们调用 sessionFactory.getCurrentSession()

bean定义代码:

<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource">
        <ref local="wasDataSource" />
    </property>
</bean>

<bean id="wasDataSource" class="org.springframework.jdbc.datasource.WebSphereDataSourceAdapter">
    <property name="targetDataSource">
        <bean class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="java:comp/env/jdbc/HostDS" />
        </bean>
    </property>
    <property name="isolationLevel">
        <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
            <property name="staticField">
                <value>java.sql.Connection.TRANSACTION_READ_UNCOMMITTED</value>
            </property>
        </bean>
    </property>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="entityInterceptor">
        <bean class="com.***.intranet.inp.model.AuditTrailInterceptor" />
    </property>
    <property name="annotatedPackages">
        <list>
            <value>com.***.intranet.inp.model</value>
        </list>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.***.intranet.inp.model</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.default_schema">$db.schema</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

<tx:annotation-driven transaction-manager="transactionManager" />

hibernate.properties文件代码:

hibernate.dialect = com.***.intranet.inp.hibernate.DB2ZosDialect<br>
hibernate.cache.region.factory_class = org.hibernate.cache.EhCacheRegionFactory<br>
hibernate.cache.use_second_level_cache = true<br>
hibernate.cache.use_query_cache = true<br>
hibernate.connection.pool_size = 30 (matches the datasource pool size)

【问题讨论】:

您是否有堆栈跟踪记录何时因连接关闭而出错?您还在运行哪个 WAS8 的 FixPack? @TerrellPlotzki 管理控制台在 ND 8.0.0.6 显示应用程序,所以我认为这意味着 fixpack 8?鉴于要遵循的堆栈跟踪的长度,只知道我错误的信息太多而不是太少,:) @TerrellPlotzki taplar.com/temp/stacktrace01.txt 【参考方案1】:

事实证明,该问题与应用于 DB2 的修复包有关,该修复包导致了套接字连接问题。 DBA 将其回滚或为他们的修复找到了修复,呵呵,现在问题不再出现了。

不知道现在该做什么,因为我是 *** 的新手。我要关闭线程还是什么?不知道。

【讨论】:

以上是关于为啥我们的 Spring/Hibernate/JDBC/Websphere 系统中的连接过早关闭?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 list-tail 会引发异常?为啥我们没有关于 cdr 的闭包属性?

为啥我们必须输入 vim ~/.vimrc 而为啥不只输入 vim ~.vimrc? [关闭]

为啥我们没有 UIBarMetricsLandscapePad?

为啥我们不能在 TypeScript 类中定义一个 const 字段,为啥静态只读不起作用?

为啥我们需要`cacheRedirects`?

为啥我们需要单子?