环境:Spring 3.0 ,Hibernate 3.5 ,同类型数据库(DB2)

编前语:此片仅粗略的描述使用Spring和Hibernate采用注入方式管理多数据源在不同事务的情况下使用的方法。

涉及到的文件三个:testDaoImpl (数据库操作文件),applicationContext.xml(Spring主配置文件) ,jdbc.properties (数据库连接和各种数据库相关配置文件)

总体分三步:

1.增加数据库连接

2.在Spring配置中增加新的数据源配置

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 多数据源不同事务创建的更多相关文章

  1. JAVA spring hibernate 多数据源配置记录

    数据源配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  2. 关于Spring Boot 多数据源的事务管理

    自己的一些理解:自从用了Spring Boot 以来,这近乎零配置和"约定大于配置"的设计范式用着确实爽,其实对零配置的理解是:应该说可以是零配置可以跑一个简单的项目,因为Spri ...

  3. Spring动态切换数据源及事务

    前段时间花了几天来解决公司框架ssm上事务问题.如果不动态切换数据源话,直接使用spring的事务配置,是完全没有问题的.由于框架用于各个项目的快速搭建,少去配置各个数据源配置xml文件等.采用了动态 ...

  4. spring+hibernate管理多个数据源(非分布式事务)

    本文通过一个demo,介绍如何使用spring+hibernate管理多个数据源,注意,本文的事务管理并非之前博文介绍的分布式事务. 这个demo将使用两个事务管理器分别管理两个数据源.对于每一个独立 ...

  5. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  6. spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式

    spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...

  7. Spring:(三) --常见数据源及声明式事务配置

    Spring自带了一组数据访问框架,集成了多种数据访问技术.无论我们是直接通过 JDBC 还是像Hibernate或Mybatis那样的框架实现数据持久化,Spring都可以为我们消除持久化代码中那些 ...

  8. 使用spring+hibernate+atomikos+tomcat构建分布式事务

    本文通过一个demo,介绍如何使用spring+hibernate+atomikos+tomcat构建在一个事务中涉及两个数据源的web应用. demo功能:实现一个能成功提交和回滚的涉及两个数据库数 ...

  9. atitit.spring hibernate的事务机制 spring不能保存对象的解决

    atitit.spring hibernate的事务机制 spring不能保存对象的解决 sessionFactory.openSession() 不能..log黑头马sql语言.. sessionF ...

随机推荐

  1. [JUC-2]AbstractQueuedSynchronizer源码分析

    AbstactQueuedSynchronizer的基本数据结构 AbstractQueuedSynchronizer的基本数据结构为Node,关于Node,JDK作者写了详细的注释,这里我大致总结几 ...

  2. android 与html交互java调js与js调java操作

    1.首先在项目下建一个assets目录(右击app->New->Folder->Assets Flolder),直接放在项目根目录下和res目录同级别(把所html,js,图片,cs ...

  3. Django之组件--auth组件

    目录 Auth模块是什么 auth模块常用方法 扩展默认的auth_user表 1 Django自带的用户认证模块,可以快速的实现登录,注销,修改密码... 2 扩展auth表,需要继承Abstrac ...

  4. 【1】【leetcode-92】 反转链表 II

    (没过,以为简单,结构链表指针搞得很复杂出错.是有捷径的,很典型题目要记住) 反转链表 II(medium) 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链 ...

  5. Shell编程(八)每隔N分钟执行某脚本

    sudo crontab -e

  6. 委托(Delegate)简介

    1.什么是委托?是用来干什么的? 委托是一个类,它定义了方法的类型,使得可以将定义的方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Swit ...

  7. Android 全屏设置和禁止横屏竖屏切换

    android:screenOrientation="portrait" #禁止屏幕横竖切换,portrait为纵向,landscape为横向

  8. spring注解第03课 按条件加载Bean @Conditional

    package com.atguigu.config; import org.springframework.context.annotation.Bean; import org.springfra ...

  9. 使用vlfeat 包中遇到的问题

    run('..../setup'); vl_complie(); 编译成功,但是仍然出现Invalid MEX-file ‘E:\vlfeat-0.9.20\toolbox\mex\mexw64\vl ...

  10. iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频

    iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸 50mm*60mm 高度 核心板连接器组合高度1.5mm PCB层数 6层PCB沉金设计 4418 CPU ARM ...