ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 全局事务管理 – Jboss:为您关闭连接

2019-07-03 07:05:53  阅读:294  来源: 互联网

标签:java spring hibernate transactions jboss


我们在jboss 7服务器上部署了一个spring应用程序.

该应用程序使用从jboss到jndi获得的多个数据源.

事务管理也由Java EE容器提供(我们使用Spring JtaTransactionManager)

应用程序体系结构是一个传统的应用程序体系结构,DAO扩展了hibernate模板(使用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]
[...]

>在不使用XA数据源的情况下,有没有办法在这种情况下正确管理连接释放?
>否则可以安全地忽略这些消息,还是表示真正的问题? (日志级别为INFO)

[编辑]

有关配置的一些其他数据:

数据源声明的例子

<!-- JNDI datasource -->
<bean id="customersDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/${shared.datasource}" />
</bean>

相关的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>

我们正在考虑使用hibernate.connection.release_mode,但即使在单个事务中实际只写入一个数据源,它也不总是相同的.

解决方法:

When encountering the annotation, how does the transaction manager
know which datasources will be involved in the transaction ?

只要你有:

<tx:annotation-driven/>

Spring应该使用TransactionInterceptor拦截您的服务方法调用并在JTA事务中包装请求.

Spring没有实际的XA事务管理器,JtaTransactionManager只是需要后端JTA提供程序的外观(如JBoss AS事务管理器).

你仍然需要配置Jboss TM,你可以在following article中看到:

<bean id="jbossTransactionManager" class="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple">
</bean>

When does it effectively retrieve a JDBC connection and on which
datasources ? when does it effectively open a transaction ? (only DAOs
got a reference to the sessionFactory bound to a specific datasource).

事务由JtaTransactionManager触发,它将实际的事务init请求委托给JBoss TM.

所有数据源都必须是XA投诉,您不能将JTA与资源本地DataSource混合使用.某些事务管理器可能使用LastResourceCommit优化,允许您最多登记一个非XA数据源.

在需要数据库连接时,数据源将在当前事务中登记:

DataSource.getConnection()

从这一点开始,此连接将参与当前事务,因此将根据事务结果提交或回滚.

我不认为你应该使用“LocalDataSourceConnectionProvider”,

如果你遵循this example

你需要:

<jta-data-source>java:/WareHouseDS</jta-data-source>

<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />

Hibernate需要知道在哪里为注册的DataSource获取Jboss AS JNDI.

祝你好好实施.

标签:java,spring,hibernate,transactions,jboss
来源: https://codeday.me/bug/20190703/1364516.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有