在 WAS8 上运行 Spring+Hibernate+JDBC 的用户请求期间,我们遇到了会话关闭的零星问题。它以前发生过,然后消失了,现在它再次抬起头,总是随机的。我想验证这不是应用程序问题,以便我可以质疑我们的管理员并能够正确地说这不是应用程序问题。如果其他人遇到过这个问题,也很感兴趣。
- 春天:3.2.2
- 休眠:4.1.12
- 网络球体:v8
首先,我将列出我的假设。据我了解,WAS 处理数据源的连接池。从这些池中,hibernate/spring 请求连接创建它自己的逻辑连接,它通过它执行。然后,当它“关闭”连接/会话时,它不会关闭物理连接,而是将其释放回处理连接何时/是否应该实际关闭的池。
我们在应用程序中的所有事务都使用@Transactional 注释,并且在某些情况下使用只读。我们进入我们@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)