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 ...
随机推荐
- linux 内核模块makefile通用模板
ifneq ($(KERNELRELEASE),)# 在 mylist 后面添加需要编译的模块数量 mylist=hello.o a.o# 为每一个模块添加所需的文件 hello-objs := ma ...
- HDU 1027(数字排列 STL)
题意是求 n 个数在全排列中的第 m 个序列. 直接用 stl 中的 next_permutation(a, a+n) (这个函数是求一段序列的下一个序列的) 代码如下: #include <b ...
- [Android] Android Studio 修改Gradle使用国内源
Gradle 仓库中心的项目,下载速度又比较慢, 网上查询了下, 使用阿里云的Maven镜像仓库 在 project 的 build.gradle中修改如下: allprojects { reposi ...
- 网络编程之Socket & ServerSocket
网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...
- Python实现代理模式
from abc import ABCMeta, abstractmethod NOT_IMPLEMENTED = "You should implement this." cla ...
- 上传文件服务与web服务分离
业务场景:1. 后端服务为java web应用,使用tomcat容器,多实例集群化部署.2. 前端使用nginx作为后端应用的反向代理. 业务需求:现在需要在java web应用端上传文件,同时还要能 ...
- hadoop的基本概念 伪分布式hadoop集群的安装 hdfs mapreduce的演示
hadoop 解决问题: 海量数据存储(HDFS) 海量数据的分析(MapReduce) 资源管理调度(YARN)
- GreenDao 直接执行SQL的方法
try { DaoSession session=MyApplication.getInstances().getDaoSession(); long fromId=-1; String strSql ...
- Django基础自测
6.如何在URLconf中给URL命名?在视图和模板中如何使用URL反向解析?写出所有情况 13.请写出使用jQuery发送ajax请求,能通过Django的CSRF校验的两种方法 14.请使用Dja ...
- JavaScript中Float类型保留两位小数
JavaScript中Float类型保留两位小数 核心方法: num:要操作的数字 size:要保留的位数 parseFloat(num).toFixed(size); 实现代码如下:var ...