Gab*_*ica 5 java jboss spring hibernate transactions
我们在 jboss 7 服务器上部署了一个 spring 应用程序。
该应用程序使用通过 jndi 从 jboss 获取的多个数据源。
事务管理也由 Java EE 容器提供(我们使用 Spring JtaTransactionManager)
应用程序架构是一个传统架构,DAO 扩展了休眠模板(使用 Spring HibernateDaoSupport)。
事务在服务层使用@Transactional注解进行管理。
我的第一个问题是:
当遇到注解时,事务管理器如何知道事务将涉及哪些数据源?
它何时有效地检索 JDBC 连接以及在哪些数据源上检索?它何时有效地开启交易?(只有 DAO 获得了对绑定到特定数据源的 sessionFactory 的引用)。
我们使用的驱动程序不支持分布式 (XA) 事务,在大多数情况下我们不需要多阶段提交,因为只写入一个数据源。无论如何,当我们访问(只读)同一事务中的其他数据源时,我们在日志中收到消息:
INFO [org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager] (http--0.0.0.0-8080-4) IJ000100: Closing a connection for you. Please close them yourself: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@691644c: java.lang.Throwable: STACKTRACE
at org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl.registerConnection(CachedConnectionManagerImpl.java:265)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:495)
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:129)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) [spring-orm-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
[...]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有没有办法在不使用 XA 数据源的情况下正确管理连接释放?
否则可以安全地忽略这些消息还是它们表示真正的问题?(日志级别为 INFO)
[编辑]
关于配置的一些附加数据:
数据源声明示例
<!-- JNDI datasource -->
<bean id="customersDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/${shared.datasource}" />
</bean>
Run Code Online (Sandbox Code Playgroud)
关联的 sessionFactory
<bean id="sharedSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="customersDataSource" />
<property name="configLocation" value="classpath:hibernate.shared.cfg.xml" />
<property name="hibernateProperties">
<props>
<!-- jboss specific transaction management -->
<prop key="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
<prop key="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>
[...]
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
我们正在考虑使用,hibernate.connection.release_mode但即使在单个事务中实际上只写入一个数据源,它也并不总是相同的。
嗯,我正在把鼹鼠山变成一座山。
事实上,对数据源的某些访问超出了事务范围,因为 hibernate 连接释放模式设置为after_transaction连接永不释放。
我刚刚添加了一些缺失的 @Transactional 注释,它解决了问题。
注意:support即使调用者不在事务范围内,传播也会触发连接释放
| 归档时间: |
|
| 查看次数: |
2052 次 |
| 最近记录: |