Java项目多数据源配置 (转)
由于种种原因,有的时候可能要连接别人的数据库,或者不同的数据库没法自动转换,重构起来数据量又太大了,我们不得不在一个项目中连接多个数据源。从网上找了各种资料,只有这位大神给出的解决方案一下子就成功了。http://www.cnblogs.com/hoojo/p/dynamic_switch_sessionfactory_muliteSessionFactory.html,但是诚如博客最后所指出的,把不同数据库的操作放在一个方法,就会出现事务的问题,这时候需要手动进行事务管理。虽然我也手动操作了数据库,但是在每次服务器重新启动或者用户第一次访问时会有session关闭的问题。会报如下错误:no value for key [org.hibernate.impl.sessionFactory@XXX] bound to thread[XXX],这个错误就是session意外关闭的意思。我一开始没能找到合适的解决方案,只好遇到这个问题就让程序再原样执行一遍,这显然是治标不治本。
以我浅见,似乎是每一个request到达服务器,事务管理就给它一个session查询数据库,如果中途切换数据库,session就会意外关闭。而添加了分布式事务管理,同一个request会再加一个查询数据库的session,供查询另一个数据库,这样可以达到灵活切换数据库的效果。
后来我换了一种问法,提出“session意外关闭怎么办?”,并找了一些关于事务管理的资料,了解到JTA技术可以解决此问题。JTA,即Java Transaction API,用于解决应用程序分布式事务处理。它可以解决在两个或多个网络计算机资源上访问并且更新数据,在此用到其实还有点大材小用。
下面是我的配置文件。这是借助了atomikos实现的分布式事务管理,要引入相关jar包。
1、多数据源连接池配置
<!--数据源1:mySQL数据库-->
<bean id="dataSourceMySQL" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="jdbcUrl" value="${jdbcUrl1}"></property>
<property name="driverClass" value="${driverClass1}"></property>
<property name="user" value="${user1}"></property>
<property name="password" value="${password1}"></property>
<property name="initialPoolSize" value="${initialPoolSize1}"></property>
<property name="minPoolSize" value=""></property>
<property name="maxPoolSize" value="${maxPoolSize1}"></property>
<property name="acquireIncrement" value=""></property>
<property name="maxIdleTime" value=""></property>
</bean>
<!--数据源2:SQLServer数据库-->
<bean id="dataSourceSQLServer" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
<property name="jdbcUrl" value="${jdbcUrl2}"></property>
<property name="driverClass" value="${driverClass2}"></property>
<property name="user" value="${user2}"></property>
<property name="password" value="${password2}"></property>
<property name="initialPoolSize" value="${initialPoolSize2}"></property>
<property name="minPoolSize" value=""></property>
<property name="maxPoolSize" value="${maxPoolSize2}"></property>
<property name="acquireIncrement" value=""></property>
<property name="maxIdleTime" value=""></property>
</bean>
2、配置两个SessionFactory对象,都是org.springframework.orm.hibernate3.LocalSessionFactoryBean类的对象。
<bean id="mySQLSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" lazy-init="false">
<property name="dataSource" ref="dataSourceMySQL"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
<property name="mappingLocations">
<list>
<value>classpath:edu/cau/warning/entity/*.hbm.xml</value>
<value>classpath:edu/cau/base/entity/*.hbm.xml</value>6 17 </list>
</property>
</bean>21 <bean id="sQLServerSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" lazy-init="default">
<property name="dataSource" ref="dataSourceSQLServer"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
<property name="mappingLocations">
<list>35 <value>classpath:edu/cau/base/entity/*.hbm.xml</value>
<value>classpath:edu/cau/diagnosis/entity/*.hbm.xml</value>
</list>
</property>
</bean>
3、SessionFactory配置,DynamicSessionFactoryImpl类是个什么鬼请参考文章开头大神的文章。
<bean id="sessionFactory" class="edu.cau.common.dbaccess.impl.DynamicSessionFactoryImpl">
<property name="defaultTargetSessionFactory" ref="sQLServerSessionFactory"></property>
<property name="targetSessionFactorys">
<map>
<entry value-ref="mySQLSessionFactory" key="mySql"></entry>
<entry value-ref="sQLServerSessionFactory" key="sqlServer"></entry>
</map>
</property>
</bean>
4、配置事务管理。

1 <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
2 <description>UserTransactionManager</description>
3 <property name="forceShutdown">
4 <value>true</value>
5 </property>
6 </bean>
7 <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
8 <property name="transactionTimeout" value="300"></property>
9 </bean>
13 <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager">
14 <property name="transactionManager" ref="atomikosTransactionManager"></property>
15 <property name="userTransaction" ref="atomikosUserTransaction"></property>
16 </bean>

5、配置事务通知等。

<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="myTxManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="*" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>


<!-- aop配置被事务控制的类 -->
<aop:config>
<aop:pointcut id="serviceOperation" expression="bean(*Service)" />
<!-- 扫描以Service结尾的bean -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>

Java项目多数据源配置 (转)的更多相关文章
- Java项目多数据源配置
由于种种原因,有的时候可能要连接别人的数据库,或者不同的数据库没法自动转换,重构起来数据量又太大了,我们不得不在一个项目中连接多个数据源.从网上找了各种资料,只有这位大神给出的解决方案一下子就成功了. ...
- 【JAVA】Spring 数据源配置整理
在Spring中,不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试. 配置数据源 ...
- intellij IDEA软件java项目No SDK配置jdk开发,安装IDEA软件步骤
我们在使用intellij idea开发java项目的时候,我们在创建的时候会发现提示No SDK,影响创建和使用项目,我们需要下载和配置需要的JDK 电脑 1我们使用intellij idea创建j ...
- log4j java项目中的配置
第一步你需要 相关的jar包 第二歩你需要一个关于log4j的配置文件 第三歩 你需要一个检测用的java 文件 导入这两个jar包进你的项目中 commons-logging.jar log4j-1 ...
- java项目其他基础配置
创建完maven项目之后. 1.pom.xml文件配置项目相关的架包. 2.src.main.resources下边 创建文件夹:spring以及mapper. 3.src.main.resource ...
- Java项目依赖的配置过程
我们经常需要把大项目分解成多个小项目,然后使用依赖方式,将其他必须的依赖项目引用到项目中.最常用的方式是希望被依赖的项目能够自动被打包成jar文件,自动部署到依赖的项目中.同时被依赖项目修改后,能够同 ...
- Java项目xml相关配置
一.web.xml //设置会话过期时间,这里单位是分钟 <session-config> <session-timeout>30</session-timeout> ...
- SpringBoot项目多数据源配置
博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507
- coreseek(sphinx)安装1(xml数据源配置和测试)
1.下载coreseek-3.2.14-32版本.网址:http://www.coreseek.cn/products-install/install_on_windows/ (有详细的安装说明) ...
随机推荐
- JAVA中使用Apache HttpComponents Client的进行GET/POST请求使用案例
一.简述需求 平时我们需要在JAVA中进行GET.POST.PUT.DELETE等请求时,使用第三方jar包会比较简单.常用的工具包有: 1.https://github.com/kevinsawic ...
- Nginx 访问日志分析
0:Nginx日志格式配置 # vim nginx.conf ## # Logging Settings ## log_format access '$remote_addr - $remote_us ...
- Java Netty (1)
Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的封装,比NIO更加高级,功能更加强大.可以说发展的路线是IO->NIO->Netty. ServerBoo ...
- SpringMVC对日期类型的转换@ResponseBody返回的DateTime是long类型
目前,多数web开发这都在使用Spring的框架.但是这个框架有个 @ResponseBody 注解返回json时,日期格式默认显示为时间戳. 而我们页面展示的时候一般都是以下格式: yyyy-MM- ...
- js 数组 转为树形结构
题目: source = [{ id: 1, pid: 0, name: 'body' }, { id: 2, pid: 1, name: 'title' }, { id: 3, pid: 2, na ...
- 修改浏览器Cookie
Firefox:安装 Web Developer 插件,装完重启之后会出现一排新的工具栏,点击 Cookies -> Add Cookie… 即可增加/修改一个Cookie了. Opera:Op ...
- sqlserver查询的结果复制到excel替换掉回车换行
从sqlserver查询统计出的结果复制到excel,如果有回车,换行 ,或回车换行 ,复制到excel显示会乱会错版,查询的时候就替换掉回车换行,复制出来就不会乱了 ) ), ),),'') fro ...
- cocos2d-js 3.0 RC0 监听返回键、菜单键、进入后台(home键)、恢复显示等事件
cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyReleased: function(keyCode, eve ...
- 每天五个java相关面试题(7)--线程篇
首先关于线程能够先看我之前这篇博文熟悉一下线程生命周期的图示以及文字说明 好開始了: 1.java 中有几种方法能够实现一个线程? 答:有两种实现方法.各自是继承 Thread类与实现Runnable ...
- PHP5.4 需要添加的configure参数
./configure --prefix=/usr/local/php --with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg --with-p ...