mybatis(基于spring4)连接多个数据库
来源:互联网 发布:全球懂英语的人数 知乎 编辑:程序博客网 时间:2024/06/05 19:39
应业务要求,需要在项目中访问另外一个数据库。最初方案是使用使用DriverManager.getConnection的形式获取,这个是最简单的办法,当然弊端也很多。所以花了一天时间在网上折腾~ 各种原创,转载貌似都没能折腾成功。最后借鉴了不少帖子的内容,终于可行了,下面贴出我的一些代码。项目使用的是spring4.3.6+mybatis3.4.1,框架搭建这里就不罗嗦了。进入正题:
1、jdbc.properties配置文件
#web数据库web.jdbc.driver=com.mysql.jdbc.Driverweb.jdbc.url=jdbc:mysql://localhost:3306/dev_webweb.jdbc.username=rootweb.jdbc.password=123#app数据库app.jdbc.driver=com.mysql.jdbc.Driverapp.jdbc.url=jdbc:mysql://192.168.6.14:3306/dev_appapp.jdbc.username=rootapp.jdbc.password=123
2、applicationContext.xml核心配置,其他的配置例如mybatis的mapper扫描、事务管理的就不贴出了。
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property></bean><!-- 数据库连接池 :webDataSource --><bean id="webDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 数据库驱动 --> <property name="driverClass" value="${web.jdbc.driver}"/> <!-- 相应驱动的jdbcUrl --> <property name="jdbcUrl" value="${web.jdbc.url}"/> <!-- 数据库的用户名 --> <property name="user" value="${web.jdbc.username}"/> <!-- 数据库的密码 --> <property name="password" value="${web.jdbc.password}"/> <!-- 初始化连接池时连接数量为5个 --> <property name="initialPoolSize" value="5"/> <!-- 允许最小连接数量为5个 --> <property name="minPoolSize" value="5"/> <!-- 允许最大连接数量为20个 --> <property name="maxPoolSize" value="20"/> <!-- 允许连接池最大生成100个PreparedStatement对象 --> <property name="maxStatements" value="100"/> <!-- 连接有效时间,连接超过3600秒未使用,则该连接丢弃 --> <property name="maxIdleTime" value="3600"/> <!-- 连接用完时,一次产生的新连接步进值为2 --> <property name="acquireIncrement" value="2"/> <!-- 获取连接失败后再尝试10次,再失败则返回DAOException异常 --> <property name="acquireRetryAttempts" value="10"/> <!-- 获取下一次连接时最短间隔600毫秒,有助于提高性能 --> <property name="acquireRetryDelay" value="600"/> <!-- 检查连接的有效性 --> <property name="testConnectionOnCheckin" value="true"/> <!-- 每个1200秒检查连接对象状态 --> <property name="idleConnectionTestPeriod" value="1200"/> <!-- 获取新连接的超时时间为10000毫秒 --> <property name="checkoutTimeout" value="10000"/></bean><!-- 数据库连接池 :appDataSource --><bean id="appDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 数据库驱动 --> <property name="driverClass" value="${app.jdbc.driver}"/> <!-- 相应驱动的jdbcUrl --> <property name="jdbcUrl" value="${app.jdbc.url}"/> <!-- 数据库的用户名 --> <property name="user" value="${web.jdbc.username}"/> <!-- 数据库的密码 --> <property name="password" value="${app.jdbc.password}"/> <!-- 初始化连接池时连接数量为5个 --> <property name="initialPoolSize" value="5"/> <!-- 允许最小连接数量为5个 --> <property name="minPoolSize" value="5"/> <!-- 允许最大连接数量为20个 --> <property name="maxPoolSize" value="20"/> <!-- 允许连接池最大生成100个PreparedStatement对象 --> <property name="maxStatements" value="100"/> <!-- 连接有效时间,连接超过3600秒未使用,则该连接丢弃 --> <property name="maxIdleTime" value="3600"/> <!-- 连接用完时,一次产生的新连接步进值为2 --> <property name="acquireIncrement" value="2"/> <!-- 获取连接失败后再尝试10次,再失败则返回DAOException异常 --> <property name="acquireRetryAttempts" value="10"/> <!-- 获取下一次连接时最短间隔600毫秒,有助于提高性能 --> <property name="acquireRetryDelay" value="600"/> <!-- 检查连接的有效性 --> <property name="testConnectionOnCheckin" value="true"/> <!-- 每个1200秒检查连接对象状态 --> <property name="idleConnectionTestPeriod" value="1200"/> <!-- 获取新连接的超时时间为10000毫秒 --> <property name="checkoutTimeout" value="10000"/></bean><!-- 数据库连接池 --><bean id="customDataSource" class="com.web.framework.dataSource.CustomDataSource"><property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="webDataSource" key="webDataSource"/> <entry value-ref="appDataSource" key="appDataSource"/> </map> </property> <!-- 默认使用webDataSource --> <property name="defaultTargetDataSource" ref="webDataSource"/></bean>
上述代码中依赖了一个类CustomDataSource,在com.web.framework.dataSource包下新建类。代码如下:
CustomDataSource:
public class CustomDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return CustomThreadLocal.getDbType(); }}
CustomThreadLocal:
public class CustomThreadLocal { private static final ThreadLocal<String> threadLocal = new ThreadLocal<String>(); public static void setDbType(String dbType) { threadLocal.set(dbType); } public static String getDbType() { return ((String) threadLocal.get()); } public static void clearDbType() { threadLocal.remove(); }}
至此配置结束。如果是访问默认库dev_web的话使用正常的开发流程即可,如果是想访问dev_app数据库怎么办呢?其实非常简单的,只要在查询语句的表名前加上数据库名即可。例如我们要查询dev_app数据库的用户表里所有用户:
<mapper namespace="com.web.framework.mapper.AppUserMapper"> <resultMap id="BaseResultMap" type="com.web.framework.entity.AppUser"> <id column="user_id" jdbcType="VARCHAR" property="userId"/> <result column="user_name" jdbcType="VARCHAR" property="userName"/> <result column="user_password" jdbcType="VARCHAR" property="userPassword"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> </resultMap> <sql id="Base_Column_List"> user_id, user_name, user_password, create_time </sql> <select id="selectAllUser" resultMap="BaseResultMap"> select <include refid="Base_Column_List"/> from dev_app.app_user </select>
上面都些是关键代码位置,并且精简了一些东西,可以为有需要的朋友做参考,如有问题或优化,欢迎指正,谢谢。
0 0
- mybatis(基于spring4)连接多个数据库
- 使用Mybatis+Spring,连接多个数据库
- 使用Mybatis+Spring,连接多个数据库
- spring mvc + mybatis 连接同一地址的多个数据库
- 单个工程中Spring+Mybatis连接多个数据库的配置(个人研究版本)
- 单个工程中Spring+Mybatis连接多个数据库的配置(个人分享版本)
- 单个工程中Spring+Mybatis连接多个数据库的配置(个人分享版本)
- 基于Spring4.x 搭建 Spring MVC + MyBatis
- mybatis连接多个数据源成功案例
- spring mvc(mybatis)配置多个不同数据库
- 使用c3p0连接数据库、操作数据库和数据库的事务管理,基于mybatis框架
- php 连接多个数据库
- hibernate连接多个数据库
- Hibernate连接多个数据库
- actionrecord 连接多个数据库
- hibernate连接多个数据库
- kettle连接多个数据库
- mybatis动态连接数据库
- 使用windows10+linphone-desktop最新版 编译linphone PC版
- 1011. World Cup Betting (20)
- Error: Cannot find module 'gulp-clone'问题的解决
- LeetCode-371. Sum of Two Integers
- 【Zookeeper】源码分析之请求处理链(二)
- mybatis(基于spring4)连接多个数据库
- Unreal4有哪些令你印象深刻拍案叫绝的设计
- 如何将jar包引入到web app libraries中
- 李白打酒 蓝桥杯
- 2016深圳杯D题 思路
- linux下载工具wget的参数使用
- CodeForces 706 C. Hard problem(dp)
- 判断当前选择哪个li标签
- ssh 免密码设置失败原因总结