Atomikos多数据源配置项目实例

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
	http://www.springframework.org/schema/jee 
	http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd"
	default-lazy-init="true">

	<description>Spring公共配置 </description>

	<!-- 定义受环境影响易变的变量 -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
		<property name="ignoreResourceNotFound" value="true" />
		<property name="locations">
			<list>
				<!-- 标准配置 -->
				<value>classpath*:/application.properties</value>
				<!--
					集群中节点配置 <value>classpath*:/application.cluster.properties</value>
				-->

				<!--
					本地开发环境配置 <value>classpath*:/application.local.properties</value>
				-->

				<!--
					服务器生产环境配置 <value>/pom/application.server.properties</value>
				-->

			</list>
		</property>
	</bean>

	<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
	<context:component-scan base-package="com.wiseweb.pom" />
	
	
	<!-- orable配置 -->
	<!-- <bean id="dataSourceContent" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">      
        <property name="uniqueResourceName">      
            <value>jdbc/dataSourceContent</value>      
        </property>      
        <property name="xaDataSourceClassName">      
            <value>oracle.jdbc.xa.client.OracleXADataSource</value>      
        </property>      
        <property name="xaProperties">
            <props>    
                <prop key="URL">${jdbc.url}</prop>  
                <prop key="user">${jdbc.username}</prop>    
                <prop key="password">${jdbc.password}</prop>    
            </props>          
        </property>          
        <property name="poolSize">      
            <value>5</value>      
        </property>
        <property name="maxPoolSize">
			<value>15</value>
		</property>
    </bean>
    <bean id="dataSourceIndex" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">      
        <property name="uniqueResourceName">      
            <value>jdbc/dataSourceIndex</value>      
        </property>      
        <property name="xaDataSourceClassName">      
            <value>oracle.jdbc.xa.client.OracleXADataSource</value>      
        </property>      
        <property name="xaProperties">      
            <props>    
                <prop key="URL">${jdbc.url}</prop>   
                <prop key="user">${jdbc.username}</prop>    
                <prop key="password">${jdbc.password}</prop>    
            </props>     
        </property>           
        <property name="poolSize">      
            <value>5</value>      
        </property>
        <property name="maxPoolSize">
			<value>15</value>
		</property>
    </bean> -->
    
    
	<!-- 本地数据库配置 -->
	<bean id="dataSourceContent" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">      
        <property name="uniqueResourceName">      
            <value>jdbc/dataSourceContent</value>      
        </property>      
        <property name="xaDataSourceClassName">      
            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>      
        </property>      
        <property name="xaProperties">
            <props>    
                <prop key="serverName">${jdbc.servername}</prop>
                <prop key="portNumber">${jdbc.portnumber}</prop>    
                <prop key="databaseName">${jdbc.databasename}</prop>
                <prop key="user">${jdbc.username}</prop>    
                <prop key="password">${jdbc.password}</prop>    
            </props>          
        </property>          
        <property name="poolSize">      
            <value>5</value>      
        </property>
        <property name="maxPoolSize">
			<value>15</value>
		</property>
        <property name="testQuery">        
			<value>select 1</value>    
		</property>   
    </bean>
    <bean id="dataSourceIndex" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">      
        <property name="uniqueResourceName">      
            <value>jdbc/dataSourceIndex</value>      
        </property>      
        <property name="xaDataSourceClassName">      
            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>      
        </property>      
        <property name="xaProperties">      
            <props>    
                <prop key="serverName">${jdbc.servername_index}</prop>    
                <prop key="portNumber">${jdbc.portnumber_index}</prop>    
                <prop key="databaseName">${jdbc.databasename_index}</prop>    
                <prop key="user">${jdbc.username_index}</prop>    
                <prop key="password">${jdbc.password_index}</prop>    
            </props>     
        </property>           
        <property name="poolSize">      
            <value>5</value>      
        </property>
        <property name="maxPoolSize">
			<value>15</value>
		</property>
        <property name="testQuery">        
			<value>select 1</value>    
		</property>        
    </bean>


	<!-- 数据源配置,使用应用内的DBCP数据库连接池 
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		 Connection Info 
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />

		 Connection Pooling Info 
		<property name="maxIdle" value="${dbcp.maxIdle}" />
		<property name="maxActive" value="${dbcp.maxActive}" />
		<property name="defaultAutoCommit" value="false" />
		<property name="timeBetweenEvictionRunsMillis" value="3600000" />
		<property name="minEvictableIdleTimeMillis" value="3600000" />
	</bean>

	--><!-- 数据源配置,使用应用服务器的数据库连接池 -->
	<!--
		<jee:jndi-lookup id="dataSource"
		jndi-name="java:comp/env/jdbc/ExampleDB" />
	-->

	<!-- Hibernate配置 
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="namingStrategy">
			<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.cache.use_second_level_cache">${hibernate.use_second_level_cache}</prop>
				<prop key="hibernate.cache.use_query_cache">${hibernate.use_query_cache}</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
			</props>
		</property>
		<property name="packagesToScan" value="com.wiseweb.pom.entity" />
	</bean>

	-->
	<!-- Hibernate配置 -->
	<!-- 本地数据库Hibernate配置 -->
    <bean id="sessionFactoryContent" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSourceContent" />
        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
            </props>
        </property>
        <property name="packagesToScan" value="com.wiseweb.pom.entity" />
    </bean>
    <!-- 远程数据库Hibernate配置 -->
    <bean id="sessionFactoryIndex" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSourceIndex" />
        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
            </props>
        </property>
        <property name="packagesToScan" value="com.wiseweb.pom.entity" />
    </bean>
    
	<!-- 事务管理器配置,单数据源事务
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
 	-->
 	
 	<!-- ActiveMQ JMS服务 -->
	<!--创建连接工厂-->
    <bean id="connectionFactory"
        class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://127.0.0.1:61616"></property>
    </bean>
    <!-- 声明ActiveMQ队列消息目标-->
    <!-- <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
    	<constructor-arg index="0" value="wiseweb.queue"></constructor-arg>
    </bean> -->
    <!-- 声明ActiveMQ主题消息目标 -->
    <bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg index="0" value="wiseweb.topic"></constructor-arg>
    </bean>
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"></property>
        <property name="defaultDestination" ref="destination"></property>
        <property name="receiveTimeout" value="10000"></property>
    </bean>
    <!-- 消息监听适配器 -->
    <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
    	<property name="delegate">
    		<bean class="com.wiseweb.pom.jms.listener.MessageListener"></bean>
    	</property>
    	<property name="defaultListenerMethod" value="receiveMessage"></property>
    	<property name="defaultResponseDestination" ref="destination"></property>
    </bean>
    <!-- 监听容器 -->
    <!-- <bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    	<property name="connectionFactory" ref="connectionFactory"></property>
    	<property name="destination" ref="destination"></property>
    	<property name="messageListener" ref="messageListenerAdapter"></property>
    </bean> -->
    <bean id="messageSender" class="com.wiseweb.pom.jms.MessageSender">
    	<property name="jmsTemplate" ref="jmsTemplate"></property>
    </bean>
    
	<!-- 事务管理器配置,多数据源JTA事务-->
    <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"/>
    </bean>   
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="atomikosTransactionManager" />
        <property name="userTransaction" ref="atomikosUserTransaction"/>
        <property name="allowCustomIsolationLevels" value="true"/>
    </bean>

	<!-- 使用annotation定义事务 -->
	<tx:annotation-driven transaction-manager="transactionManager"
		proxy-target-class="true" />

	<!-- 加载网站类型 -->


	<bean id="groupMap" class="java.util.TreeMap">
		<constructor-arg>
			<map>
				<entry key="1" value="新闻" />
				<entry key="2" value="论坛" />
				<entry key="3" value="博客" />
				<entry key="4" value="微博" />
				<entry key="5" value="纸媒" />
		   <!-- <entry key="6" value="视频" />--> 
		   		<entry key="7" value="外媒" />
		   <!-- <entry key="8" value="广播" />
				<entry key="9" value="电视" />
				<entry key="10" value="空间" />
				<entry key="11" value="微信" />-->
			</map>
		</constructor-arg>
	</bean>

	<bean id="staticValue" class="com.wiseweb.util.StaticValue"
		lazy-init="false">
		<property name="groupMap">
			<ref bean="groupMap" />
		</property>
	</bean>

	<bean id="hibernateDaoImple" class="com.wiseweb.pom.dao.HibernateGeneralDao">
		<property name="sessionFactory" ref="sessionFactoryContent"></property>
	</bean>

	<!-- 配置定时器 -->
	<bean id="scheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	</bean>
	<bean id="quartzTimerUtil" class="com.wiseweb.util.sms.QuartzTimerUtil">
		<property name="scheduler" ref="scheduler" />
	</bean>
	<bean id="startAllTimer" class="com.wiseweb.util.sms.StartAllTimer">
		<property name="scheduler" ref="scheduler" />
		<property name="hibernateDaoImple" ref="hibernateDaoImple"></property>
	</bean>
	<!-- 配置定时器结束 -->
</beans>


dao层

package com.wiseweb.pom.dao.account;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.stereotype.Component;
import org.springside.modules.orm.hibernate.HibernateDao;

import com.wiseweb.pom.entity.Company;
/**
 * HibernateDao中的Company是实体类
 * @author Benjamin
 *
 */
@Component
public class CompanyDao  extends HibernateDao<Company, Long>
{   
	//选择applicationContext中名为sessionFactoryContent的sessionFactory注入,实现多数据源访问
	@Override
	@Resource(name = "sessionFactoryContent")
    public void setSessionFactory(SessionFactory sessionFactory) {
        // TODO Auto-generated method stub
        super.setSessionFactory(sessionFactory);
    }
}

实体类entity

package com.wiseweb.pom.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;


@Entity
@Table(name="wise_company")
public class Company implements Serializable{
	/**
	 * 
	 */
	private Long id ;
	private static final long serialVersionUID = 1L;
	private String name ;
	private Integer grade ;
	private Long parentId ;
	private Integer nodeType ;
	private Integer orderType ;
	private Integer flag ;
	private Company fCompany ;
	private List<Department> departments = new ArrayList<Department>() ;
	private Long companyNum ;
	private Long childNum ;
	private List<Company> childCompanys = new ArrayList<Company>() ;
	@Column(name="name", nullable=false, length=45)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Column(name="grade", nullable=false)
	public Integer getGrade() {
		return grade;
	}
	public void setGrade(Integer grade) {
		this.grade = grade;
	}
	@Column(name="parent_id", nullable=false)
	public Long getParentId() {
		return parentId;
	}
	public void setParentId(Long parentId) {
		this.parentId = parentId;
	}
	@Column(name="node_type", nullable=false)
	public Integer getNodeType() {
		return nodeType;
	}
	public void setNodeType(Integer nodeType) {
		this.nodeType = nodeType;
	}
	@Column(name="order_type")
	public Integer getOrderType() {
		return orderType;
	}
	public void setOrderType(Integer orderType) {
		this.orderType = orderType;
	}
	@Column(name="flag", nullable=false)
	public Integer getFlag() {
		return flag;
	}
	public void setFlag(Integer flag) {
		this.flag = flag;
	}
	@OneToMany(mappedBy="company",cascade = {CascadeType.ALL})
	public List<Department> getDepartments() {
		return departments;
	}
	public void setDepartments(List<Department> departments) {
		this.departments = departments;
	}
	@Transient
	public Company getFCompany() {
		return fCompany;
	}
	public void setFCompany(Company fCompany) {
		this.fCompany = fCompany;
	}
	@Id
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	@Transient
	public Long getCompanyNum() {
		return companyNum;
	}
	public void setCompanyNum(Long companyNum) {
		this.companyNum = companyNum;
	}
	@Transient
	public List<Company> getChildCompanys() {
		return childCompanys;
	}
	public void setChildCompanys(List<Company> childCompanys) {
		this.childCompanys = childCompanys;
	}
	@Transient
	public Long getChildNum() {
		return childNum;
	}
	public void setChildNum(Long childNum) {
		this.childNum = childNum;
	}
	
	
}

下面最重要的是service层,必须要加上@Transactional不然会报the XA resource is currently involved in a local (non-XA) transaction的错误。

@Component
@Transactional
public class AccountManager {
	...
}


最后就可以通过指定不通的sessionFactory访问不同的数据库了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值