Spring - 集成多数据源于MyBatis

其实一个工程多数据源比较常见。

比如我们将所有工程中使用到的定时任务都持久化到同一个数据库,或者我们为工作流框架单独提供一个数据源。

其实这些都好说,毕竟这些情况都是框架替我们做一些工作,我们几乎没有必要去访问这些数据;或者框架已经提供了方便的API去访问持久化数据,我们不用去考虑这方面的事情。

比较烦的情况是,一个工程必须有多个数据源,而且我们经常通过API访问。

无论是使用ORM框架还是JDBC或者SQLTemplate,对于多个数据源尽量保证相同的访问方式,毕竟这些代码到处都是,开发时谁都不想考虑对于哪个数据源应该使用哪种访问方式。

正好我本地的工程是用的MyBatis,连接池使用DBCP,那就以这些为例,记录一下多数据源的配置。

(对于Mybatis本身的配置就直接无视了,不同的org.mybatis.spring.SqlSessionFactoryBean对象可以使用各自的Mybatis配置也可以共享同一个配置,看自己的需要了。)

先从配置数据源开始,鉴于我用的是DBCP...算了,随便配置一个吧,具体参数看http://commons.apache.org/proper/commons-dbcp/configuration.html

下面是简单配置:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc:mysql://localhost:3306/oasys?useUnicode=true&amp;characterEncoding=utf-8" />
	<property name="username" value="root" />
	<property name="password" value="" />

	<property name="initialSize" value="2" />
	<property name="maxActive" value="10" />
	<property name="maxWait" value="-1" />

	<property name="removeAbandonedTimeout" value="60" />
	<property name="removeAbandoned" value="true" />

	<property name="defaultAutoCommit" value="true" />

	<property name="testWhileIdle" value="true" />
	<property name="testOnBorrow" value="false" />
	<property name="testOnReturn" value="false" />
	<property name="numTestsPerEvictionRun" value="10" />
	<property name="timeBetweenEvictionRunsMillis" value="900000" />

	<property name="poolPreparedStatements" value="true" />
	<property name="maxOpenPreparedStatements" value="50" />
</bean>

接下来再弄个Oracle的,太麻烦了,主要是bean id和一部分属性不同,剩下的我们不需要关心:

<bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
	<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
	<property name="url" value="jdbc:oracle:thin:@//localhost:1521/orcl" />
	<property name="username" value="alvez" />
	<property name="password" value="123" />
	<!-- 略 -->
</bean>

两种数据源则两种会话,我们需要两个SqlSessionFactory,即:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="oracleDataSource" />
	<property name="configLocation" value="classpath:myBatis/myBatis-Configuration.xml" />
</bean>
<bean id="_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="myDataSource" />
	<property name="configLocation" value="classpath:myBatis/myBatis-Configuration1.xml" />
</bean>

接下来就是DAO Bean了,可能我会使用如下这种方式:

<bean id="mybatisDao" class="pac.alvez.dao.MybatisDao">
	<property name="sqlSessionFactory" ref="SqlSessionFactory1"></property>
</bean>

但这样几乎没什么实际意义,工程中的DAO Bean可能会很多,而且会继续扩展下去。

于是,通常我们会这样用,顺便带上另一个数据源:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="pac.alvez.dao.oracle" />
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="pac.alvez.dao.mysql" />
	<property name="sqlSessionFactoryBeanName" value="_sqlSessionFactory" />
</bean>

可能有些人希望不同数据源的DAO Bean存在于相同的package下,甚至不同数据源的SQL定义在相同的DAO Bean中。

我不知道应该如何实现这种效果,而且....用起来难道不混乱吗?

剩下的就是transaction了,几乎没什么特别的:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="oracleDataSource" />
</bean>
<bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="myDataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<tx:annotation-driven transaction-manager="transactionManager1" />

使用的时候需要注意,由于使用的是自动检测DAO Bean的方式,即便不同数据源的DAO放在不同的package中也不能同名。

否则:

org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘TestMapper‘ for bean class [pac.alvez.dao.mysql.TestMapper] conflicts with existing, non-compatible bean definition of same name and class [org.mybatis.spring.mapper.MapperFactoryBean]

Spring - 集成多数据源于MyBatis

时间: 2024-08-25 05:11:23

Spring - 集成多数据源于MyBatis的相关文章

mybatis与Spring集成(Aop整合PagerAspect插件)

目的: Mybatis与spring集成 Aop整合pagehelper插件 Mybatis与spring集成 导入pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Java Persistence with MyBatis 3(中文版) 第五章 与Spring集成

MyBatis-Spring是MyBatis框架的子模块,用来提供与当前流行的依赖注入框架Spring的无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向切面编程(Aspect Oriented Programming,AOP)的Java框架,鼓励使用基于POJO的编程模型.另外,Spring提供了声明式和编程式的事务管理能力,可以很大程度上简化应用程序的数据访问层(data access layer)的实现.在本章中,我们将看到在基于Spring的

Spring集成MyBatis框架

Java在写数据库查询时,我接触过四种方式: 1.纯Java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池) 这种模式实际上性能是非常不错的,但是使用起来并不是非常方便:一是要手工为Connection做获取与释放,大量的冗余代码也容易出错:另一个是,复杂的SQL用字符串写起来简直不可维护(换行.可视长度.参数都是问题). 2.使用Spring JdbcTemplate 这个其实还是挺不错的,配置比较简单,功能丰富上比手工管理Connection要舒服多了,而且代码也比较简洁.

Unit08: Spring集成mybatis

Unit08: Spring集成mybatis 1. Spring集成mybatis (1)方式一 step1. 导包. spring-webmvc,mybatis,mybatis-spring, ojdbc,dbcp,spring-jdbc,junit. step2. 添加spring的配置文件. 注:集成之后,不再需要mybatis的配置文件了,之前的配置信息 用一个bean(SqlSessionFactoryBean)来代替. step3.实体类. step4.映射文件. step5.Ma

Spring 集成mybatis 配置方法

<?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:context="http://www.springframework.org/sch

重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

一般来说,修改框架的源代码是极其有风险的,除非万不得已,否则不要去修改.但是今天却小心翼翼的重构了Mybatis官方提供的与Spring集成的SqlSessionFactoryBean类,一来是抱着试错的心态,二来也的确是有现实需要. 先说明两点: 通常来讲,重构是指不改变功能的情况下优化代码,但本文所说的重构也包括了添加功能 本文使用的主要jar包(版本):spring-*-4.3.3.RELEASE.jar.mybatis-3.4.1.jar.mybatis-spring-1.3.0.jar

Java Persistence with MyBatis 3(中国版) 第五章 与Spring集成

MyBatis-Spring它是MyBatis子模块框.它用来提供流行的依赖注入框架Spring无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向切面编程(Aspect Oriented Programming,AOP)的Java框架,鼓舞使用基于POJO的编程模型. 另外,Spring提供了声明式和编程式的事务管理能力.能够非常大程度上简化应用程序的数据訪问层(data access layer)的实现.在本章中,我们将看到在基于Spring的应用

Mybatis-Generator插件的使用与Spring集成Mybatis的配置

Mybatis-Generator插件 Mybatis-Generator是一个用于自动生成dao层接口.pojo以及mapper xml的一个Mybatis插件,该插件有三种用法:命令行运行.Eclipse插件.maven插件.个人觉得maven插件最方便,可以在eclipse/intellij idea等ide上通用,本文也是介绍在maven中配置并使用这个插件. 现在我mysql中有一个school数据库,该数据库有student.cls两张表格,表结构如下: student表: cls表

深入浅出MyBatis:MyBatis与Spring集成及实用场景

本系列是「深入浅出MyBatis:技术原理与实践」书籍的总结笔记. 本篇是「深入浅出MyBatis」系列的最后一篇,主要介绍与Spring的集成,以及工作中的一些实用场景. 介绍之前,先整体总结下该系列的内容和写作思路. MyBatis是一个框架,封装了数据库相关的操作,给我们开发人员带来了极大地便利,相对于Hibernate,有很大的灵活性和扩展性,在高并发高性能应用中,这点很重要. 首先介绍了JDBC的规范,了解我们最原始最熟悉的操作数据库的方式,MyBatis就是在此基础上进行封装和抽象.