Spring+Hibernate 多数据源不同事务创建
环境:Spring 3.0 ,Hibernate 3.5 ,同类型数据库(DB2)
编前语:此片仅粗略的描述使用Spring和Hibernate采用注入方式管理多数据源在不同事务的情况下使用的方法。
涉及到的文件三个:testDaoImpl (数据库操作文件),applicationContext.xml(Spring主配置文件) ,jdbc.properties (数据库连接和各种数据库相关配置文件)
总体分三步:
3.在需要使用不同数据源的操作实现类中指定新的sessionFactory和transactional
具体使用修改如下(注意:所有配置仅用于多数据源连接测试,并非优化后配置,套用需谨慎!):
1.增加数据库连接配置(该配置文件中包含了cpool的配置和hibernate的配置信息在xml配置中直接调用) jdbc.properties
jdbcq.driverClassName=com.db2.jcc.DB2Driver
jdbcq.url=jdbc:db2://192.168.1.11:50001/DB01:currentSchema=USER1;
jdbcq.username=user1
jdbcq.password=user1
2.在Spring配置中增加新的数据源配置 applicationContext.xml
(前提配置)
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:jdbc.properties</value>
</property>
</bean>
新增数据源:
<bean id="dataSourceQ" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbcq.driverClassName}" />
<property name="jdbcUrl" value="${jdbcq.url}" />
<property name="user" value="${jdbcq.username}" />
<property name="password" value="${jdbcq.password}" />
<property name="autoCommitOnClose" value="true" />
<property name="checkoutTimeout" value="${cpool.checkoutTimeout}" />
<property name="initialPoolSize" value="${cpool.minPoolSize}" />
<property name="minPoolSize" value="${cpool.minPoolSize}" />
<property name="maxPoolSize" value="${cpool.maxPoolSize}" />
<property name="maxIdleTime" value="${cpool.maxIdleTime}" />
<property name="acquireIncrement" value="${cpool.acquireIncrement}" />
<property name="acquireRetryAttempts" value="30" />
<property name="acquireRetryDelay" value="1000" />
<property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}" />
</bean>
sessionFactory配置:
此处实体包是注解方式必须有的,只有在sessionFactory 中进行扫描过的实体包才能在注入该sessionFactory的数据库操作impl中操作。否则会出现找不到对应实体的异常。此处仅扫描用于测试的包。
另外一点需要注意的是如果配置二级缓存那么需要使用不同的配置文件和配置,否则会出现缓存空间已经被使用的异常。当然用于测试可以直接去掉这部分配置
此处新建了另外一个配置文件,同时配置了不同的缓存空间
<!-- 新的sessioinFactory-->
<bean id="sessionFactoryQ"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<!-- 新的数据源-->
<property name="dataSource" ref="dataSourceQ" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<!-- 使用ehcache -->
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<!-- 最优化二级缓存 -->
<prop key="hibernate.cache.use_structured_entries">true</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate-q.xml</prop>
</props>
</property>
<!-- 扫描实体所在包 只扫描业务包-->
<property name="packagesToScan" >
<list>
<value>com.back.entities.test</value>
</list>
</property>
</bean>
事务管理配置:
<!-- 指定事务管理 -->
<bean id="transactionManagerQ" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryQ" />
</bean>
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManagerQ" />
3.在需要使用不同数据源的操作实现类中指定新的sessionFactory和transactional
@Repository
@Transactional("transactionManagerQ")
public class TestDaoImpl implements TestDao { private SessionFactory sessionFactory; @Resource(name="sessionFactoryQ")
public void setSessionFactory(SessionFactory sessionFactoryQ) {
this.sessionFactory = sessionFactoryQ;
}
}
大概就是这样,需要配置和修改的地方都如上已经处理了。因为是注解所以和纯xml配置会有不同的地方。数据库操作的实现类在项目中其实会继承框架的一个实现类,但为了便于看到全貌,所以修改成以上的样子,从而可以看到sessionFactory的设置。
Spring+Hibernate 多数据源不同事务创建的更多相关文章
- JAVA spring hibernate 多数据源配置记录
数据源配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- 关于Spring Boot 多数据源的事务管理
自己的一些理解:自从用了Spring Boot 以来,这近乎零配置和"约定大于配置"的设计范式用着确实爽,其实对零配置的理解是:应该说可以是零配置可以跑一个简单的项目,因为Spri ...
- Spring动态切换数据源及事务
前段时间花了几天来解决公司框架ssm上事务问题.如果不动态切换数据源话,直接使用spring的事务配置,是完全没有问题的.由于框架用于各个项目的快速搭建,少去配置各个数据源配置xml文件等.采用了动态 ...
- spring+hibernate管理多个数据源(非分布式事务)
本文通过一个demo,介绍如何使用spring+hibernate管理多个数据源,注意,本文的事务管理并非之前博文介绍的分布式事务. 这个demo将使用两个事务管理器分别管理两个数据源.对于每一个独立 ...
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式
spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...
- Spring:(三) --常见数据源及声明式事务配置
Spring自带了一组数据访问框架,集成了多种数据访问技术.无论我们是直接通过 JDBC 还是像Hibernate或Mybatis那样的框架实现数据持久化,Spring都可以为我们消除持久化代码中那些 ...
- 使用spring+hibernate+atomikos+tomcat构建分布式事务
本文通过一个demo,介绍如何使用spring+hibernate+atomikos+tomcat构建在一个事务中涉及两个数据源的web应用. demo功能:实现一个能成功提交和回滚的涉及两个数据库数 ...
- atitit.spring hibernate的事务机制 spring不能保存对象的解决
atitit.spring hibernate的事务机制 spring不能保存对象的解决 sessionFactory.openSession() 不能..log黑头马sql语言.. sessionF ...
随机推荐
- LeetCode(194.Transpose File)(awk进阶)
194. Transpose File Given a text file file.txt, transpose its content. You may assume that each row ...
- Spark源码剖析 - SparkContext的初始化(六)_创建和启动DAGScheduler
6.创建和启动DAGScheduler DAGScheduler主要用于在任务正式交给TaskSchedulerImpl提交之前做一些准备工作,包括:创建Job,将DAG中的RDD划分到不同的Stag ...
- tomcat下的Cookie特殊符号问题
案例:在项目中通过Cookie方式临时存放检索条件,不小心在Cookie值中使用了特殊符号"@",导致在服务器端无法正确解析Cookie值.之所以说"不小心", ...
- parseDouble()方法
String a = "269"; double parseDouble = Double.parseDouble(b); System.out.println(“Double a ...
- Webpack2学习记录-1
1.安装前准备 安装 webpack 之前,需要安装 node,这时最新的是 6,npm 是 4.如果有老的 node 项目在跑建议安装下 nvm. 2.建议安装在局部,即在项目下的 node_mod ...
- leetcode 90. subsets
解题思路: 要生成子集,对于vector 中的每个数,对于每个子集有两种情况,加入或不加入. 因此代码: class Solution { public: void subsetG(vector< ...
- [C++]动态规划系列之Warshall算法
/** * * @author Zen Johnny * @date 2018年3月31日 下午8:13:09 * */ package freeTest; /* [动态规划系列:Warshall算法 ...
- 小程序前端防止重复点击请求api的简陋方法
upload: function () { let that = this; let {uploadFlag} = that.data; if (that.data.uploadFlag) { ret ...
- 第21月第4天 leetcode codinginterview c++
1.leetcode Implement strStr(). Returns the index of the first occurrence of needle in haystack, or - ...
- 分页插件通用处理,以asp.net mvc为例
Model: public class PaggerModel { public PaggerModel() { BarSize = ; } public PaggerModel(int total, ...