spring多数据源

本文介绍如何通过Atomikos和Spring框架配置跨库事务,并提供具体的XML配置示例及测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先查看Mysql存储引擎 运行show engines

发现以下:

 

MEMORY YES Hash based, stored in memory, useful for temporary tables NO NO NO

FEDERATED NO Federated MySQL storage engine

MyISAM YES Default engine as of MySQL 3.23 with great performance NO NO NO

BLACKHOLE YES /dev/null storage engine (anything you write to it disappears) NO NO NO

MRG_MYISAM YES Collection of identical MyISAM tables NO NO NO

CSV YES CSV storage engine NO NO NO

ARCHIVE YES Archive storage engine NO NO NO

InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES

除了InnoDB之外都不支持事务操作。所以要想支持跨库事务首先表是InnoDB类型的存储

 

运行mysql当前默认的存储引擎:show variables like '%storage_engine%';

显示:

 

 

storage_engine InnoDB

 

运行 具体某一个表的详细信息 show create table hc_info ;

显示:

hc_info

CREATE TABLE `hc_info` (

  `id` int(11) NOT NULL AUTO_INCREMENT,    ........省略

) ENGINE=InnoDB AUTO_INCREMENT=22872 DEFAULT CHARSET=utf8

好了,这就开始下一步操作了。

2:跨库事务只有JTA支持,EJB也是用JTA做到的跨库支持,其实Spring3.0较EJB 在跨库事务更方便。

先用JDBC方式实现:

application.xml内容:

 

<bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean"> 
		<property name="uniqueResourceName"><value>dataSource</value></property> 
		<property name="xaDataSourceClassName"><value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value></property> 
		<property name="xaDataSourceProperties">
		<value>URL=jdbc:mysql://192.168.0.229:3306/huisou;user=root;password=123654</value>
		</property>
		<property name="exclusiveConnectionMode"><value>true</value></property> 
		<property name="connectionPoolSize"><value>3</value></property> 
		<property name="validatingQuery"><value>SELECT 1</value></property> 
	</bean> 
	<bean id="dataSource2" class="com.atomikos.jdbc.SimpleDataSourceBean"> 
		<property name="uniqueResourceName"><value>dataSource2</value></property> 
		<property name="xaDataSourceClassName"><value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value></property> 
		<property name="xaDataSourceProperties">
		<value>URL=jdbc:mysql://192.168.0.229:3306/huisou2;user=root;password=123654</value>
		</property>
		<property name="exclusiveConnectionMode"><value>true</value></property> 
		<property name="connectionPoolSize"><value>3</value></property> 
		<property name="validatingQuery"><value>SELECT 1</value></property> 
	</bean> 
	<!--date source 3  -->
	<bean id="dataSource3" class="com.atomikos.jdbc.SimpleDataSourceBean"> 
		<property name="uniqueResourceName"><value>dataSource3</value></property> 
		<property name="xaDataSourceClassName"><value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value></property> 
		<property name="xaDataSourceProperties">
		<value>URL=jdbc:mysql://192.168.0.229:3306/huisou2_enterprise;user=root;password=123654</value>
		</property>
		<property name="exclusiveConnectionMode"><value>true</value></property> 
		<property name="connectionPoolSize"><value>3</value></property> 
		<property name="validatingQuery"><value>SELECT 1</value></property> 
	</bean> 
	
		<!--date source 4  -->
	<bean id="dataSource4" class="com.atomikos.jdbc.SimpleDataSourceBean"> 
		<property name="uniqueResourceName"><value>dataSource4</value></property> 
		<property name="xaDataSourceClassName"><value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value></property> 
		<property name="xaDataSourceProperties">
		<value>URL=jdbc:mysql://192.168.0.229:3306/huisou2_sale;user=root;password=123654</value>
		</property>
		<property name="exclusiveConnectionMode"><value>true</value></property> 
		<property name="connectionPoolSize"><value>3</value></property> 
		<property name="validatingQuery"><value>SELECT 1</value></property> 
	</bean> 
	<!-- ============================sessionFactory============================ -->
	
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<!-- ========动态读取实体映射文件===== -->
			<property name="mappingLocations">
			<list>
				<value>
					classpath:/com/huisou/auxiliary/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/business/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/core/entity/*.hbm.xml
				</value>
			</list>
			</property>
		<property name="hibernateProperties">
			<value>
			hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
			hibernate.show_sql=true
			hibernate.format_sql=false
			hibernate.query.substitutions=true 1, false 0
			hibernate.jdbc.batch_size=20
			hibernate.connections.autocommit=true;
			<!--  hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
			hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml-->
			</value>
		</property>
		<property name="entityInterceptor">
			<ref local="treeInterceptor" />
		</property>
	</bean>
	<bean id="sessionFactory2"
		class="com.huisou.common.hibernate3.HibernateSessionFactory">
		<property name="dataSource">
			<ref bean="dataSource2" />
		</property>
		<!-- ========动态读取实体映射文件===== -->
			<property name="mappingLocations">
			<list>
				<value>
					classpath:/com/huisou/auxiliary/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/business/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/core/entity/*.hbm.xml
				</value>
			</list>
			</property>
		<property name="hibernateProperties">
			<value>
			hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
			hibernate.show_sql=true
			hibernate.format_sql=false
			hibernate.query.substitutions=true 1, false 0
			hibernate.jdbc.batch_size=20
			hibernate.connections.autocommit=true;
			<!--  hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
			hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml-->
			</value>
		</property>
		<property name="entityInterceptor">
			<ref local="treeInterceptor" />
		</property>
	</bean>
	 
	 
	 <bean id="sessionFactory3"
		class="com.huisou.common.hibernate3.HibernateSessionFactory">
		<property name="dataSource">
			<ref bean="dataSource3" />
		</property>
		<!-- ========动态读取实体映射文件===== -->
			<property name="mappingLocations">
			<list>
				<value>
					classpath:/com/huisou/auxiliary/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/business/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/core/entity/*.hbm.xml
				</value>
			</list>
			</property>
		<property name="hibernateProperties">
			<value>
			hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
			hibernate.show_sql=true
			hibernate.format_sql=false
			hibernate.query.substitutions=true 1, false 0
			hibernate.jdbc.batch_size=20
			hibernate.connections.autocommit=true;
			<!--  hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
			hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml-->
			</value>
		</property>
		<property name="entityInterceptor">
			<ref local="treeInterceptor" />
		</property>
	</bean>
	 
	 
	  <bean id="sessionFactory4"
		class="com.huisou.common.hibernate3.HibernateSessionFactory">
		<property name="dataSource">
			<ref bean="dataSource4" />
		</property>
		<!-- ========动态读取实体映射文件===== -->
			<property name="mappingLocations">
			<list>
				<value>
					classpath:/com/huisou/auxiliary/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/business/entity/*.hbm.xml
				</value>
				<value>
					classpath:/com/huisou/core/entity/*.hbm.xml
				</value>
			</list>
			</property>
		<property name="hibernateProperties">
			<value>
			hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
			hibernate.show_sql=true
			hibernate.format_sql=false
			hibernate.query.substitutions=true 1, false 0
			hibernate.jdbc.batch_size=20
			hibernate.connections.autocommit=true;
			<!--  hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
			hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml-->
			</value>
		</property>
		<property name="entityInterceptor">
			<ref local="treeInterceptor" />
		</property>
	</bean>
	<!-- ==============================声明式事务======================================= -->
	<!--JDBC事务管理器,根据你的情况使用不同的事务管理器,如果工程中有Hibernate,就用Hibernate的事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<!-- 哈哈 -->
	<bean id="transactionManager2"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory2" />
	</bean>
	
	
	<bean id="transactionManager3"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory3" />
	</bean>
	
	<bean id="transactionManager4"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory4" />
	</bean>
	
	<!-- start 实现分布式事务(跨库事务同步) -->
	<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>
	<!-- jta -->
	<bean id="hibernateTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager">
		<ref local="atomikosTransactionManager"/>
		</property>
		<property name="userTransaction">
		<ref local="atomikosUserTransaction"/>
		</property>
	</bean>
	<bean id="hibernateTransactionManager2" class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager2">
		<ref local="atomikosTransactionManager"/>
		</property>
		<property name="userTransaction">
		<ref local="atomikosUserTransaction"/>
		</property>
	</bean>
	<bean id="hibernateTransactionManager3" class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager3">
		<ref local="atomikosTransactionManager"/>
		</property>
		<property name="userTransaction">
		<ref local="atomikosUserTransaction"/>
		</property>
	</bean>
	<bean id="hibernateTransactionManager4" class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager4">
		<ref local="atomikosTransactionManager"/>
		</property>
		<property name="userTransaction">
		<ref local="atomikosUserTransaction"/>
		</property>
	</bean>
	<!-- end 实现分布式事务(跨库事务同步)jta -->
	<!-- 注解多事务管理 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	<tx:annotation-driven transaction-manager="transactionManager2" />
	<tx:annotation-driven transaction-manager="transactionManager3" />
	<tx:annotation-driven transaction-manager="transactionManager4" />
	
	
	<bean id="treeInterceptor"
		class="com.huisou.common.hibernate3.TreeIntercptor" />
	<context:component-scan base-package="com.huisou" />
	
 
		
 

测试代码:

 

Connection conection  = null;
		WebApplicationContext webApplicationContext = org.springframework.web.context.support.WebApplicationContextUtils
		.getRequiredWebApplicationContext(ServletActionContext.getRequest().getSession().getServletContext());
		DataSource dataSource = (DataSource)webApplicationContext.getBean("dataSource2");
		System.out.println("test");
		//SpObserver.putSp("dataSource");
		try {
		 conection = dataSource.getConnection();
		 ResultSet rs = (ResultSet)conection.prepareStatement("select id ,subject from hc_info").executeQuery();
		  while(rs.next()){     
              System.out.println("数据库2  " + rs.getInt(1)+ "\t");     
              System.out.println("数据库2  " + rs.getString(2)+ "\t");     
          }     
		  dataSource = (DataSource)webApplicationContext.getBean("dataSource");
		 conection = dataSource.getConnection();
		 rs = (ResultSet)conection.prepareStatement("select id ,subject from hc_info limit 20").executeQuery();
		  while(rs.next()){     
             System.out.println("数据库1  " + rs.getInt(1)+ "\t");     
             System.out.println("数据库1  " + rs.getString(2)+ "\t");     
         }     
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 

 

下面是JOTM在Spring中的配置
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值