为什么在Spring / Hibernate / JDBC / Websphere系统中连接过早关闭?

时间:2013-05-31 18:17:48

标签: java spring hibernate jdbc websphere

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

  • 春天:3.2.2
  • Hibernate:4.1.12
  • Websphere:v8

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

应用程序中的所有事务都使用@Transactional注释,在某些情况下使用readonly。我们将@Autowired SessionFactory加入到我们的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)

1 个答案:

答案 0 :(得分:0)

事实证明,该问题涉及与应用于DB2的修订包有关,这导致了套接字连接问题。 DBA将其回滚或找到了解决问题的方法,呵呵,现在问题不再发生了。

不知道现在该做什么,因为我是stackoverflow的新手。我是否关闭了线程?说不上。