Spring+hibernate多数据源多sessionFactory配置
主配置文件
<?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-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"default-lazy-init="true" default-autowire="byName"><!-- 使用Spring的Annotation的配置 --><context:annotation-config /><!-- mysql数据源 --><bean id="dataSourceMeMysql" class="org.logicalcobwebs.proxool.ProxoolDataSource"><property name="driver" value="${mysql.jdbc.driverClassName}" /><property name="driverUrl" value="${mysql.jdbc.url}"></property><property name="user" value="${mysql.jdbc.username}"></property><property name="password" value="${mysql.jdbc.password}"></property><property name="maximumConnectionCount" value="${jdbc.maximumConnectionCount}"></property><property name="minimumConnectionCount" value="${jdbc.minimumConnectionCount}"></property><property name="simultaneousBuildThrottle" value="500"></property><!-- 同时最大连接数 --><property name="maximumActiveTime" value="600000" /><!-- 最大激活时间600秒 --><property name="houseKeepingTestSql" value="${jdbc.testSql}"></property><property name="prototypeCount" value="5"></property><property name="trace" value="true"></property><property name="verbose" value="true"></property><property name="alias" value="${mysql.jdbc.alias}" /></bean><!-- 主数据库数据源 --><bean id="dataSourceMainOracle" class="org.logicalcobwebs.proxool.ProxoolDataSource"><property name="driver" value="${oracle.jdbc.driverClassName}" /><property name="driverUrl" value="${oracle.jdbc.url}"></property><property name="user" value="${oracle.jdbc.username}"></property><property name="password" value="${oracle.jdbc.password}"></property><property name="maximumConnectionCount" value="${jdbc.maximumConnectionCount}"></property><property name="minimumConnectionCount" value="${jdbc.minimumConnectionCount}"></property><property name="simultaneousBuildThrottle" value="500"></property><!-- 同时最大连接数 --><property name="maximumActiveTime" value="600000" /><!-- 最大激活时间600秒 --><property name="houseKeepingTestSql" value="${jdbc.testSql}"></property><property name="prototypeCount" value="5"></property><property name="trace" value="true"></property><property name="verbose" value="true"></property><property name="alias" value="${oracle.jdbc.alias}" /></bean><!-- 动态数据源 --><bean id="dynamicDataSource" class="com.java.main.common.core.component.DynamicDataSource"><property name="defaultTargetDataSource" ref="dataSourceMainOracle" /> <!-- 通过key-value的形式来关联数据源 --> <property name="targetDataSources"> <map> <entry value-ref="dataSourceMeMysql" key="dataSourceMeMysql" /> <entry value-ref="dataSourceMainOracle" key="dataSourceMainOracle" /> </map> </property> </bean><!-- sessionFactory --><bean id="sessionFactoryMeMysql" name="sessionFactoryMeMysql" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="dataSource" ref="dynamicDataSource" /><property name="hibernateProperties"><props merge="default"><prop key="hibernate.dialect">${me.mysql.jdbc.dialect}</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop><prop key="hibernate.cache.provider_configuration_file_resource_path">ehcacheMeMysql.xml</prop><prop key="hibernate.cache.use_second_level_cache">true</prop>
<!-- <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> --><prop key="hibernate.cache.region.factory_class">org.hibernate.cache.SingletonEhCacheRegionFactory</prop><prop key="hibernate.cache.use_query_cache">true</prop><prop key="hibernate.hbm2ddl.auto">none</prop><prop key="hibernate.connection.SetBigStringTryClob">true</prop> </props></property><property name="packagesToScan"><list><value>com.java.main.base.model.InterfaceLogMode</value></list></property><property name="annotatedClasses"><list><value>com.java.main.base.model.InterfaceLogMode</value></list></property></bean><bean id="dataSourceFacade" class="org.logicalcobwebs.proxool.ProxoolFacade" destroy-method="shutdown"/><bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true"></bean><!-- 主数据库sessionFactory --><bean id="sessionFactoryMainOracle" name="sessionFactoryMainOracle" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><property name="dataSource" ref="dynamicDataSource" /><property name="hibernateProperties"><props merge="default"><prop key="hibernate.dialect">${main.oracle.jdbc.dialect}</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop><prop key="hibernate.cache.provider_configuration_file_resource_path">ehcacheMainOracle.xml</prop><prop key="hibernate.cache.use_second_level_cache">true</prop>
<!-- <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> --><prop key="hibernate.cache.region.factory_class">org.hibernate.cache.SingletonEhCacheRegionFactory</prop><prop key="hibernate.cache.use_query_cache">true</prop><prop key="hibernate.hbm2ddl.auto">none</prop><prop key="hibernate.connection.SetBigStringTryClob">true</prop> </props></property><property name="packagesToScan"><list><value>com.java.main.base.model.WSSystem</value></list></property><property name="annotatedClasses"><list><value>com.java.main.base.model.WSSystem</value></list></property></bean><!-- 动态SessionFactory --><bean id="sessionFactory" class="com.java.main.common.core.component.DynamicSessionFactoryImpl"><property name="defaultTargetSessionFactory" ref="sessionFactoryMainOracle"/><property name="targetSessionFactorys"><map> <entry value-ref="sessionFactoryMeMysql" key="sessionFactoryMeMysql"/><entry value-ref="sessionFactoryMainOracle" key="sessionFactoryMainOracle"/></map> </property></bean><bean id="transactionManager" class="com.java.main.common.core.component.DynamicTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 配置事务管理 --><tx:annotation-driven transaction-manager="transactionManager" /></beans>
PS:alias别名相同会造成连接池无法正常初始化。导致无法切换成功。
1.重写数据源实现,增加自定义切换数据源功能。
package com.java.main.common.core.component;import java.util.Map;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.jdbc.datasource.lookup.DataSourceLookup;public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return CustomerDataSourceContextHolder.getCustomerType();}@Overridepublic void setTargetDataSources(Map<Object, Object> targetDataSources) {super.setTargetDataSources(targetDataSources);}@Overridepublic void setDataSourceLookup(DataSourceLookup dataSourceLookup) {super.setDataSourceLookup(dataSourceLookup);}
}
package com.java.main.common.core.component;public class CustomerDataSourceContextHolder {public static final String DATA_SOURCE_ME_MYSQL = "dataSourceMeMysql";public static final String DATA_SOURCE_MAIN_ORACLE = "dataSourceMainOracle";private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();public static void setCustomerType(String dbType) {contextHolder.set(dbType);}public static String getCustomerType() {return contextHolder.get();}public static void clearCustomerType() {contextHolder.remove();}}
2.重写sessionFactory
package com.java.main.common.core.component;import org.hibernate.SessionFactory;/*** 动态获取sessionFactory* @author Administrator**/
public interface DynamicSessionFactory extends SessionFactory {SessionFactory getHibernateSessionFactory();
}
创建接口类DynamicSessionFactoryImpl继承sessionFactory,生成getSessionFactory()函数。用来实现自定义切换sessionFactory的功能。
private Map<Object, SessionFactory> targetSessionFactorys;private SessionFactory defaultTargetSessionFactory;@Overridepublic SessionFactory getHibernateSessionFactory() {SessionFactory targetSessionFactory = targetSessionFactorys.get(CustomerSessionFactoryContextHolder.getCustomerType());if (targetSessionFactory != null) {return targetSessionFactory;} else if (defaultTargetSessionFactory != null) {return defaultTargetSessionFactory;}return null;}
package com.java.main.common.core.component;public class CustomerSessionFactoryContextHolder {public static final String SESSION_FACTORY_ME_MYSQL = "sessionFactoryMeMysql";public static final String SESSION_FACTORY_MAIN_ORACLE = "sessionFactoryMainOracle";private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();public static void setCustomerType(String dbType) {contextHolder.set(dbType);}public static String getCustomerType() {return contextHolder.get();}public static void clearCustomerType() {contextHolder.remove();}}
3. 重写HibernateTransactionManager
package com.java.main.common.core.component;import javax.sql.DataSource;import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.SessionFactoryUtils;public class DynamicTransactionManager extends HibernateTransactionManager {/*** */private static final long serialVersionUID = 1177866957145370108L;@Overridepublic DataSource getDataSource() {return SessionFactoryUtils.getDataSource(getSessionFactory());}@Overridepublic SessionFactory getSessionFactory() {DynamicSessionFactory dynamicSessionFactory = (DynamicSessionFactory) super.getSessionFactory(); SessionFactory hibernateSessionFactory = dynamicSessionFactory.getHibernateSessionFactory(); return hibernateSessionFactory; }
}
4.调用测试
CustomerDataSourceContextHolder.setCustomerType(CustomerDataSourceContextHolder.DATA_SOURCE_ME_MYSQL);CustomerSessionFactoryContextHolder.setCustomerType(CustomerSessionFactoryContextHolder.SESSION_FACTORY_ME_MYSQL);interfaceLogDao.save(ifLog);CustomerSessionFactoryContextHolder.clearCustomerType();
Spring+hibernate多数据源多sessionFactory配置相关推荐
- Spring+Hibernate双数据源测试Mysql集群读写分离(转自http://blog.csdn.net/hzw2312/article/details/9083519)
进行测试!环境就是SH框架.当然这只是一个简单的测试! 准备环境就是Spring框架跟Hibernate框架的整合! 然后在Spring配置文件中配置两个数据源.这里我采用的是从c3po数据源配置: ...
- spring + hibernate + 双数据源 动态(或手动)切换
1. 定时检查数据库连接是否可用(手动切换) 昨天生产库一台装有数据库的服务器关机了.虽然另一台服务器上还有服务,但是共用的一个数据库.所以...主服务器挂了另一台也没啥用. 所有为避免再次出 ...
- 在Spring + Hibernate中使用二级缓存配置步骤
在SSH中用二级缓存大概分以下几步: 1.首先在hbm文件里对涉及到的对象设置缓存方式,或根据情况设置自己需要的 2.在ehcache的配置文件里配置一个cache,name为这个类名 3.在appl ...
- struts2+spring+hibernate
---恢复内容开始--- Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sessio ...
- Spring+Hibernate配置多数据源
Spring+Hibernate配置多数据源 转载于:https://www.cnblogs.com/zhujiabin/p/4816453.html
- Spring+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务
一.概念 分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.简言之,同时操作多个数据库保持事务的统一,达到跨库事务的效果. JT ...
- spring mysql 多数据源_spring框架学习【多数据源配置】
在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessi ...
- struts spring hibernate 配置
web.xml <?xml version="1.0" encoding="GBK"?> <web-app xmlns="http: ...
- firebird——Spring hibernate 集成连接配置
-Djava.library.path=.\lib\ firebird版本是2.5, 嵌入式类库是2.2 这些都可以从官网中下载. 我用的是netbeans,在java 项目中新建一个lib文件夹,把 ...
最新文章
- 【Git】Git 本地的撤销修改和删除操作
- 只用2页纸,北大数学校友攻破计算机30年难题!过程浅显直白,看懂仅需线性代数基础...
- 用python画花瓣-Python教程:使用Turtles画出带有花瓣的花
- 在MRC模式下使用SDWebImage
- 服务端第八次上课:mongodb,redis
- CF1478A - Nezzar and Colorful Ball(数学)
- linux不支持32,Visual Studio Code 1.36发布,不再支持Linux 32位
- spring cron表达式(定时器)
- 计算机网络考试成绩分析报告,成绩分析报告范文_成绩分析总结与反思
- 多重操作系统安装全解析
- MySQL error(2014) Commands out of sync; you can't run this command now(情形1)
- sklearn报错 ImportError: No module named externals 问题解决
- 程序之间耦合以及解耦问题探究
- cache性能优化总结
- 有哪些让程序员受益终生的建议
- 百度地图API加载点位
- A.7链表练习题——集合的交差并
- 信捷XD5程序+TG765触摸屏程序,功能为XY双轴排版机,带2个气缸
- 「缠师课后回复精选」第14课: 喝茅台的高潮程序!
- APP性能测试——内存测试
热门文章
- mysql中下列正确的命令是_下面关于在DOS启动MySql的命令中,正确的是() (5.0分)_学小易找答案...
- C#(三十八)之StreamWriter StreamWriter使用方法及与FileStream类的区别
- 代理、网关、隧道、中继
- ajax原理和基础步骤面试怎么答
- 代码随想录算法训练营day7| 454.四数相加II,383. 赎金信 ,15. 三数之和,18. 四数之和
- Qt跨平台Linux5-使用DEFINES来实现条件编译
- c语言代码错误c2059,error C2059: 语法异常:“常量”
- 航天宏图技术赋能天津梁启超纪念馆,用了啥黑科技?
- 9.	Zigbee应用程序框架开发指南 - 属性管理
- 基于单片机的推箱子游戏设_推箱子游戏51单片机课设计(最全).doc