Spring提供了TransactionProxyFactoryBean作为动态代理的生成工厂,该工厂产生目标bean的动态AOP事务代理。事务代理根据所配置的事务属性自动管理事务操作。该事务代理对事务的透明管理依赖于一个在ApplicationContext范围全局可见的PlatformTransactionManager。Spring提供两个默认的事务管理器实现:DataSourceTransactionManager和JtaTransactionManager。前者只能支持单个jdbc数据源,后者可以支持多个数据源,可以做分布式事务管理。一般由容器提供支持JTA的事务管理器实现,Spring的JtaTransactionManager会自动通过JNDI检测TransactionManager或UserTransaction的存在,也可以在配置中指定JNDI的设置。如果想不依赖于容器实现分布式事务管理,可以采用开源的事务管理器实现JOTM。事务管理器必须要知道被管理的DataSource的位置,如果是DataSourceTransactionManager,在事务管理器配置中直接指定JDBC数据源的引用,如果是JtaTransactionManager,容器负责告知事务管理器需要管理的数据源。不管是哪一种情况,都需要在Dao中配置与事务管理器相对应的数据源。
解决方案 »
- 视频路径中文无法播放!
- Cannot retrieve mapping for action /....在线等待。。。。
- Spring JDBC 类型转换问题
- 如何解决多类继承的问题?
- 各位大大,servicemix读写mysql的问题
- 关于Hibernate的配置
- 为什么不能隔日冲正?
- jboss下开发ejb,客户端查找ejb时候,context.lookup()函数的参数到底应该怎样写?
- TOMCAT 中 连数据库
- weblogic发布
- 究竟是用Struts的连接池好还是用tomcat的连接池好?还有struts的SQL Server连接池怎么配置啊?在线给分
- dom4j中转换xml的简单问题,都有分!
<property name="jndiName value="java:comp/env/jdbc/myds1"/>
</bean> <bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/myds2"/>
</bean> <bean id="mySessionFactory1" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource1"/>
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
</bean> <bean id="mySessionFactory2" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource2"/>
<property name="mappingResources">
<list>
<value>inventory.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
</props>
</property>
</bean> <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/> <bean id="myProductDao" class="product.ProductDaoImpl">
<property name="sessionFactory" ref="mySessionFactory1"/>
</bean> <bean id="myInventoryDao" class="product.InventoryDaoImpl">
<property name="sessionFactory" ref="mySessionFactory2"/>
</bean> <bean id="myProductServiceTarget" class="product.ProductServiceImpl">
<property name="productDao" ref="myProductDao"/>
<property name="inventoryDao" ref="myInventoryDao"/>
</bean> <bean id="myProductService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="myTxManager"/>
<property name="target" ref="myProductServiceTarget"/>
<property name="transactionAttributes">
<props>
<prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
<prop key="someOtherBusinessMethod">PROPAGATION_REQUIRES_NEW</prop>
<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
</bean></beans>
那么我可以写一个方法,该方法中有对这两个数据源的操作,然后我门利用spring 对这个方法进行事物控制,
只不过这个时候,我们用的是JtaTransactionManager。
Error creating bean with name 'transactionManager' defined in class path resource [gov/cd12366/bridge/spring/applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.transaction.TransactionSystemException: JTA UserTransaction is not available at JNDI location [java:comp/UserTransaction]; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
org.springframework.transaction.TransactionSystemException: JTA UserTransaction is not available at JNDI location [java:comp/UserTransaction]; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
- Application context definition for JPetStore's business layer.
- Contains bean references to the transaction manager and to the DAOs in
- dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--
配置数据源
注意: 用org.apache.commons.dbcp.BasicDataSource, 要引入 apache commons
的commons-collections-3.1.jar, commons-dbcp-1.2.1.jar, commons-pool-1.2.jar三个包-->
<bean id="dataSourceInfo" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://91.20.19.22:1433;DatabaseName=digger</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>tax</value>
</property>
</bean>
<bean id="dataSourceBridge" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://localhost:1433;DatabaseName=cdgsbridge</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>1</value>
</property>
</bean> <!-- 配置sessionFactory, 注意这里引入的包的不同-->
<bean id="sessionFactoryInfo"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSourceInfo" />
</property>
<property name="mappingResources">
<list>
<value>gov/cd12366/bridge/domain/Login.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="sessionFactoryBridge"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSourceBridge" />
</property>
<property name="mappingResources">
<list>
<value>gov/cd12366/bridge/domain/Login.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- 配置transactionManager, 注意这里引入的包的不同 -->
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
</bean>
<bean id="LoginDAOInfo" class="gov.cd12366.bridge.persistence.dao.LoginDAO">
<property name="sessionFactory">
<ref local="sessionFactoryInfo" />
</property>
</bean>
<bean id="LoginDAOBridge" class="gov.cd12366.bridge.persistence.dao.LoginDAO">
<property name="sessionFactory">
<ref local="sessionFactoryBridge" />
</property>
</bean>
<bean id="CopyDataServer" class="gov.cd12366.bridge.server.CopyDataServer">
<property name="LoginDAOInfo" ref="LoginDAOInfo"/>
<property name="LoginDAOBridge" ref="LoginDAOBridge"/>
</bean>
<!-- 配置事务代理,对LoginDAO的insert,和get方法进行不同的事务配置 -->
<bean id="CopyDataServerProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="CopyDataServer" />
</property>
<property name="transactionAttributes">
<props>
<prop key="copy">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean></beans>
试着指定userTransactionName看看,如下
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" >
<property name="userTransactionName">
<value>weblogic/transaction/UserTransaction</value>
</property>
</bean>
- Application context definition for JPetStore's business layer.
- Contains bean references to the transaction manager and to the DAOs in
- dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--
配置数据源
注意: 用org.apache.commons.dbcp.BasicDataSource, 要引入 apache commons
的commons-collections-3.1.jar, commons-dbcp-1.2.1.jar, commons-pool-1.2.jar三个包
<bean id="dataSourceInfo" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://91.20.19.22:1433;DatabaseName=digger</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>tax</value>
</property>
</bean>
-->
<!--配置事务管理-->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction"><ref local="jotm"/></property>
</bean>
<!--使用jotm配置数据库连接-->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
<bean id="innerDataSourceInfo" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager"><ref local="jotm"/></property>
<property name="driverName"><value>net.sourceforge.jtds.jdbc.Driver</value></property>
<property name="url"><value>jdbc:jtds:sqlserver://localhost:1433;DatabaseName=digger</value></property>
</bean>
<bean id="dataSourceInfo" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource"><ref local="innerDataSourceInfo"/></property>
<property name="transactionManager"><ref local="jotm"/></property>
<property name="user"><value>sa</value></property>
<property name="password"><value>1</value></property>
<property name="minCon"><value>1</value></property>
<property name="maxCon"><value>5</value></property>
</bean>
<bean id="innerDataSourceBridge" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager"><ref local="jotm"/></property>
<property name="driverName"><value>net.sourceforge.jtds.jdbc.Driver</value></property>
<property name="url"><value>jdbc:jtds:sqlserver://localhost:1433;DatabaseName=cdgsbridge</value></property>
</bean>
<bean id="dataSourceBridge" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource"><ref local="innerDataSourceBridge"/></property>
<property name="transactionManager"><ref local="jotm"/></property>
<property name="user"><value>sa</value></property>
<property name="password"><value>1</value></property>
<property name="minCon"><value>1</value></property>
<property name="maxCon"><value>5</value></property>
</bean> <!-- 配置sessionFactory, 注意这里引入的包的不同-->
<bean id="sessionFactoryInfo"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSourceInfo" />
</property>
<property name="mappingResources">
<list>
<value>gov/cd12366/bridge/domain/Login.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="sessionFactoryBridge"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSourceBridge" />
</property>
<property name="mappingResources">
<list>
<value>gov/cd12366/bridge/domain/Login.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean> <bean id="LoginDAOInfo" class="gov.cd12366.bridge.persistence.dao.LoginDAO">
<property name="sessionFactory">
<ref local="sessionFactoryInfo" />
</property>
</bean>
<bean id="LoginDAOBridge" class="gov.cd12366.bridge.persistence.dao.LoginDAO">
<property name="sessionFactory">
<ref local="sessionFactoryBridge" />
</property>
</bean>
<bean id="CopyDataServer" class="gov.cd12366.bridge.server.CopyDataServer">
<property name="LoginDAOInfo" ref="LoginDAOInfo"/>
<property name="LoginDAOBridge" ref="LoginDAOBridge"/>
</bean>
<!-- 配置事务代理,对LoginDAO的insert,和get方法进行不同的事务配置 -->
<bean id="CopyDataServerProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="CopyDataServer" />
</property>
<property name="transactionAttributes">
<props>
<prop key="copy">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean></beans>
--
但仍然报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [gov/cd12366/bridge/spring/applicationContext_jotm.xml]: Cannot resolve reference to bean 'jotm' while setting bean property 'userTransaction'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jotm' defined in class path resource [gov/cd12366/bridge/spring/applicationContext_jotm.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.FatalBeanException: Could not instantiate class [org.springframework.transaction.jta.JotmFactoryBean]; constructor threw exception; nested exception is java.lang.ExceptionInInitializerError: null
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jotm' defined in class path resource [gov/cd12366/bridge/spring/applicationContext_jotm.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.FatalBeanException: Could not instantiate class [org.springframework.transaction.jta.JotmFactoryBean]; constructor threw exception; nested exception is java.lang.ExceptionInInitializerError: null
org.springframework.beans.FatalBeanException: Could not instantiate class [org.springframework.transaction.jta.JotmFactoryBean]; constructor threw exception; nested exception is java.lang.ExceptionInInitializerError: null
java.lang.ExceptionInInitializerError
at org.objectweb.jotm.Jotm.<init>(Jotm.java:140)
at org.springframework.transaction.jta.JotmFactoryBean.<init>(JotmFactoryBean.java:82)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:174)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:150)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:52)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:498)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:372)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:238)
20:18:30,609 DEBUG [main] ConfigurationRepository:286 - Build protocol object for protocol name found 'jrmp'.
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:148)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:186)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:764)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:575)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:405)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:238)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:148)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:186)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:764)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:575)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:405)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:238)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:148)
at gov.cd12366.bridge.spring.CustomBeanFactory.getBean(CustomBeanFactory.java:26)
at Test.main(Test.java:74)
Caused by: org.omg.CORBA.INITIALIZE: Error while instantiatingorg.objectweb.carol.rmi.multi.MultiPRODelegate vmcid: 0x0 minor code: 0 completed: No
at javax.rmi.PortableRemoteObject.createDelegateIfSpecified(Unknown Source)
at javax.rmi.PortableRemoteObject.<clinit>(Unknown Source)
... 29 more
Caused by: java.lang.IllegalStateException: Configuration of carol was not done and when trying to initialize it, it fails.
at org.objectweb.carol.util.configuration.ConfigurationRepository.checkInitialized(ConfigurationRepository.java:113)
at org.objectweb.carol.util.configuration.ConfigurationRepository.checkConfigured(ConfigurationRepository.java:126)
at org.objectweb.carol.util.configuration.ConfigurationRepository.getConfigurations(ConfigurationRepository.java:136)
at org.objectweb.carol.rmi.multi.MultiPRODelegate.<init>(MultiPRODelegate.java:73)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
... 31 more
Caused by: org.objectweb.carol.util.configuration.ConfigurationException: Cannot find a protocol with name 'lmi' in the list of available protocols.
at org.objectweb.carol.util.configuration.ConfigurationRepository.init(ConfigurationRepository.java:335)
at org.objectweb.carol.util.configuration.ConfigurationRepository.init(ConfigurationRepository.java:229)
at org.objectweb.carol.util.configuration.ConfigurationRepository.init(ConfigurationRepository.java:397)
at org.objectweb.carol.util.configuration.ConfigurationRepository.checkInitialized(ConfigurationRepository.java:111)
... 40 more