spring+hibernate+atomokis配置多数据源与事务

俺今天无法淡定了,先列个标题,把这几天烦人的东西都整理一遍,免得以后忘记鸟。AIX,我恨你。

   spring+hibernate配置多数据源并统一管理事物,首先确定的是必须使用JTA管理事物,在spring的HibernateTransactionManager类API中已经详细说明了两种transactionManager的不同,quote:JTA (usually through JtaTransactionManager) is necessary for accessing multiple transactional resources within the same transaction. The DataSource that Hibernate uses needs to be JTA-enabled in such a scenario (see container setup)。必须引用JTA,而且数据源必须是支持JTA的XAdatasource。quote百度百科:如果计划使用JTA来划分事务,你将需要一个实现了javax.sql.XADataSource,javax.sql.XAConnection和javax.sql.XAResource接口JDBC的驱动。好了,如果你还是坚持用HibernateTransactionManager的话,可以确定的是,事务不一定会回滚。
   现在在tomcat下用Atomikos实现JTA分布式事务管理,但是数据源只能用免费版的com.atomikos.jdbc.SimpleDataSourceBean,不能用收费版的com.atomikos.jdbc.AtomikosDataSourceBean。但是这个数据源和tomcat使用的时候关闭服务器时有可能引发内存溢出。tomcat6以上会强制解除那个实例,但是会提示你,因为tomcat已经强制移除了,所以除了日志也没啥关系,可以手动去掉那段监听
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
attempts to log objects that have failed to be unregistered by webapps it hosts when they are stopped, and were forcibly unregistered by Tomcat.
   我想说这个数据源貌似使用起来问题蛮多的,日志文件有时候不自动删,内存老溢出,杂七杂八的,反正我现在还在改。程序也有问题哈,内存占用很变态,AIX服务器也很变态,总之都很变态,哥哥我也快变态了。总之想找一个好的实现了XADataSource的数据源,换个JBOSS去试试。
   然后复制一下spring的配置文件,如下
<bean id="pdmDataSource" class="com.atomikos.jdbc.SimpleDataSourceBean">
		<property name="uniqueResourceName">
			<value>pdmDataSource</value>
		</property>
		<property name="xaDataSourceClassName">
			<value>${pdm.jdbc.xaDataSourceClassName}</value>
		</property>
		<property name="xaDataSourceProperties">
			<value>user=${pdm.jdbc.username};password=${pdm.jdbc.password};URL=${pdm.jdbc.url}</value>
		</property>
		<property name="exclusiveConnectionMode">
			<value>true</value>
		</property>   
  		<property name="connectionPoolSize">
  			<value>15</value>
  		</property>   
  		<property name="validatingQuery">
  			<value>SELECT 1</value>
  		</property>
	</bean>
	<bean id="pdmSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref local="pdmDataSource"/>
		</property>
		<property name="mappingDirectoryLocations">
			<list>
			</list>
		</property>
		<property name="mappingResources">
			<list>
				<value>com/ccac/mes/materialmanagement/entity/TSfcMove.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/PubProduct.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/InvdepotDetail.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/Invindepot.hbm.xml</value>
			</list> 
		</property>
		<property name="hibernateProperties">
			<props>   
				<prop key="hibernate.dialect">${pdm.dialect}</prop>   
				<prop key="hibernate.show_sql">false</prop>   
				<prop key="hibernate.hbm2ddl.auto">none</prop>
				<prop key="hibernate.format_sql">false</prop>   
			</props>   
		</property>
	</bean>
	 
	<bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean">
		<property name="uniqueResourceName">
			<value>dataSource</value>
		</property>
		<property name="xaDataSourceClassName">
			<value>${jdbc.xaDataSourceClassName}</value>
		</property>
		<property name="xaDataSourceProperties">
			<value>user=${jdbc.username};password=${jdbc.password};URL=${jdbc.url}</value>
		</property>
		<property name="exclusiveConnectionMode">
			<value>true</value>
		</property>   
  		<property name="connectionPoolSize">
  			<value>15</value>
  		</property>   
  		<property name="validatingQuery">
  			<value>SELECT 1</value>
  		</property>
	</bean>
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
		<property name="mappingDirectoryLocations">
			<list>
				<!-- 项目计划模块 -->
				<value>classpath:com/ccac/mes/projectplan/entity</value>
				<!-- 工程数据模块 -->
				<value>classpath:com/ccac/mes/projectdata/entity</value>
				<!-- 生产资源模块 -->
				<value>classpath:com/ccac/mes/productionresource/entity</value>
				<!-- 自定义用户权限模块 -->
				<value>classpath:com/ccac/mes/factorymodel/entity</value>
				<!-- 物料管理模块 
					<value>classpath:com/ccac/mes/materialmanagement/entity</value>
					-->
				<!-- 生产监控模块 -->
				<value>classpath:com/ccac/mes/productmonitor/entity</value>
				<!-- 生产计划模块 -->
				<value>classpath:com/ccac/mes/productionplan/entity</value>
				<!-- 工作流模块 -->
				<value>classpath:com/ccac/mes/process/entity</value>
				<!-- OA管理模块-->
				<value>classpath:com/ccac/mes/OAmanagement/entity</value>
			</list>
		</property>
		<property name="mappingResources">
			<list>
				<!-- 工作流自带表模块 -->
				<value>jbpm.repository.hbm.xml</value>
				<value>jbpm.execution.hbm.xml</value>
				<value>jbpm.history.hbm.xml</value>
				<value>jbpm.task.hbm.xml</value>
				
				<!-- 物料管理模块 -->
				<value>com/ccac/mes/materialmanagement/entity/InputRecordEffectivity.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/InventoryInputRecord.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/InventoryInputSheet.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/InventoryOutputRecord.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/InventoryOutputSheet.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/Warehouse.hbm.xml</value>
				<value>com/ccac/mes/materialmanagement/entity/WarehousePosition.hbm.xml</value>
			</list> 
		</property>
		<!-- herbernate properties -->
		<property name="hibernateProperties">   
			<props>   
				<prop key="hibernate.dialect">${dialect}</prop>   
				<prop key="hibernate.show_sql">false</prop>   
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.format_sql">false</prop>   
			</props>   
		</property>
	</bean>
	<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> 
  		<property name="forceShutdown">
  			<value>true</value>
  		</property> 
	</bean>
	<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
  		<property name="transactionTimeout">
  			<value>300</value>
  		</property> 
	</bean> 
	<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager">
			<ref local="atomikosTransactionManager"/>
		</property>
		<property name="userTransaction">
			<ref local="atomikosUserTransaction"/>
		</property>
	</bean>
	
     
	[b]<!--这个不能用了啊[/b]
		<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		-->
	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager" ref="transactionManager"/>
		<property name="transactionAttributes">
			<props>
				<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="del*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="revise*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="submit*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="start*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="end*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="change*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="re*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="edit*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="copy*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="input*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="output*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="instance*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="import*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="close*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="operate*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="move*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="workaround*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="rollback*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="cancel*">PROPAGATION_REQUIRED,-Exception</prop>
				
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="authenticate*">PROPAGATION_REQUIRED,readOnly</prop>				
			</props>
		</property>
	</bean>
	
	
	<!-- 定义BeanNameAutoProxyCreator-->
	<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<list>
				<value>*Service</value>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>transactionInterceptor</value> 
			</list>
		</property>     
	</bean>


忘了properties的东西
jdbc.xaDataSourceClassName=oracle.jdbc.xa.client.OracleXADataSource
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=ccacmes
jdbc.password=ccacmes
dialect=org.hibernate.dialect.Oracle10gDialect

你可能感兴趣的:(Hibernate)