本文转载自jeesite添加多数据源

1.jeesite.properties 添加数据源信息,(url2,username2,pawwword2)

  1. #mysql database setting
  2. jdbc.type=mysql
  3. jdbc.driver=com.mysql.jdbc.Driver
  4. jdbc.url=jdbc:mysql://localhost:3306/website?useUnicode=true&characterEncoding=utf-8
  5. jdbc.username=root
  6. jdbc.password=root
  7. #mysql2 database setting
  8. #jdbc.type=mysql
  9. #jdbc.driver=com.mysql.jdbc.Driver
  10. jdbc.url2=jdbc:mysql://218.28.123.82:3306/stkcentervideosys?useUnicode=true&characterEncoding=utf-8
  11. jdbc.username2=root
  12. jdbc.password2=root

2.修改spring-context.xml(src/main/resources/),3处需要修改/添加

第一处(spring-context.xml):

  1. <!-- 第一个数据源配置, 使用 BoneCP 数据库连接池 -->
  2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  3. <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
  4. <property name="driverClassName" value="${jdbc.driver}" />
  5. <!-- 基本属性 url、user、password -->
  6. <property name="url" value="${jdbc.url}" />
  7. <property name="username" value="${jdbc.username}" />
  8. <property name="password" value="${jdbc.password}" />
  9. <!-- 配置初始化大小、最小、最大 -->
  10. <property name="initialSize" value="${jdbc.pool.init}" />
  11. <property name="minIdle" value="${jdbc.pool.minIdle}" />
  12. <property name="maxActive" value="${jdbc.pool.maxActive}" />
  13. <!-- 配置获取连接等待超时的时间 -->
  14. <property name="maxWait" value="60000" />
  15. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  16. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  17. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  18. <property name="minEvictableIdleTimeMillis" value="300000" />
  19. <property name="validationQuery" value="${jdbc.testSql}" />
  20. <property name="testWhileIdle" value="true" />
  21. <property name="testOnBorrow" value="false" />
  22. <property name="testOnReturn" value="false" />
  23. <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
  24. <property name="poolPreparedStatements" value="true" />
  25. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->
  26. <!-- 配置监控统计拦截的filters -->
  27. <property name="filters" value="stat" />
  28. </bean>
  29. <!-- 第二个数据源配置, 使用 BoneCP 数据库连接池 -->
  30. <bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  31. <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
  32. <property name="driverClassName" value="${jdbc.driver}" />
  33. <!-- 基本属性 url、user、password -->
  34. <property name="url" value="${jdbc.url2}" />
  35. <property name="username" value="${jdbc.username2}" />
  36. <property name="password" value="${jdbc.password2}" />
  37. <!-- 配置初始化大小、最小、最大 -->
  38. <property name="initialSize" value="${jdbc.pool.init}" />
  39. <property name="minIdle" value="${jdbc.pool.minIdle}" />
  40. <property name="maxActive" value="${jdbc.pool.maxActive}" />
  41. <!-- 配置获取连接等待超时的时间 -->
  42. <property name="maxWait" value="60000" />
  43. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  44. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  45. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  46. <property name="minEvictableIdleTimeMillis" value="300000" />
  47. <property name="validationQuery" value="${jdbc.testSql}" />
  48. <property name="testWhileIdle" value="true" />
  49. <property name="testOnBorrow" value="false" />
  50. <property name="testOnReturn" value="false" />
  51. <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
  52. <property name="poolPreparedStatements" value="true" />
  53. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->
  54. <!-- 配置监控统计拦截的filters -->
  55. <property name="filters" value="stat" />
  56. </bean>
  57. <!-- 动态数据源 -->
  58. <bean id="dynamicDataSource" class="com.thinkgem.jeesite.common.db.DynamicDataSource">
  59. <property name="defaultTargetDataSource" ref="dataSource"/>
  60. <property name="targetDataSources">
  61. <map>
  62. <entry key="dataSource" value-ref="dataSource"/>
  63. <entry key="dataSource2" value-ref="dataSource2"/>
  64. </map>
  65. </property>
  66. </bean>

第二处(spring-context.xml):修改为dynamicDataSource

  1. <!-- MyBatis begin  -->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dynamicDataSource"/>
  4. <property name="typeAliasesPackage" value="com.thinkgem.jeesite"/>
  5. <property name="typeAliasesSuperType" value="com.thinkgem.jeesite.common.persistence.BaseEntity"/>
  6. <property name="mapperLocations" value="classpath:/mappings/**/*.xml"/>
  7. <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
  8. </bean>

第三处(spring-context.xml):修改为dynamicDataSource

  1. <!-- 定义事务 -->
  2. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dynamicDataSource" />
  4. </bean>

3.添加DynamicDataSource.java (com.thinkgem.jeesite.common.db.DynamicDataSource.java)

  1. package com.thinkgem.jeesite.common.db;
  2. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  3. /**
  4. * Mysql 多数据源切换
  5. *
  6. * @author sa
  7. * @version V1.0
  8. * @Description:
  9. * @date 2015/10/09
  10. */
  11. public class DynamicDataSource extends AbstractRoutingDataSource {
  12. private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  13. /**
  14. *
  15. * @author sa
  16. * @date 2012-5-18 下午4:06:44
  17. * @return the currentLookupKey
  18. */
  19. public static String getCurrentLookupKey() {
  20. return (String) contextHolder.get();
  21. }
  22. /**
  23. *
  24. * @author sa
  25. * @date 2012-5-18 下午4:06:44
  26. * @param currentLookupKey
  27. *            the currentLookupKey to set
  28. */
  29. public static void setCurrentLookupKey(String currentLookupKey) {
  30. contextHolder.set(currentLookupKey);
  31. }
  32. /*
  33. * (non-Javadoc)
  34. *
  35. * @see
  36. * org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#
  37. * determineCurrentLookupKey()
  38. */
  39. @Override
  40. protected Object determineCurrentLookupKey() {
  41. return getCurrentLookupKey();
  42. }
  43. }

4.在Controller中切换(在service层切换不管用,还没查原因)

  1. //切换数据源dataSource2,默认数据源dataSource
  2. DynamicDataSource.setCurrentLookupKey("dataSource2");
  3. List list = stkScenerySpotService.findAll();
  4. model.addAttribute("list",list);
  5. DynamicDataSource.setCurrentLookupKey("dataSource");

5.在定时任务中切换数据源

@Service
@Lazy(false)
public class ImportGamexxjh5 {
private static Logger logger = LoggerFactory.getLogger(ImportGamexxjh5.class);
@Autowired
Gamexxjh5Service gamexxjh5Service;
@Autowired
TfAnaysisResultTyhxService tfAnaysisResultTyhxService; @Scheduled(cron = "0 20 18 * * ?")
public void importGameXXJH5() {
logger.info("-------执行importGameXXJH5开始------->"+ DateUtils.getDateTime());
SimpleDateFormat myFmt = new SimpleDateFormat("yyMMdd");
Date date = new Date();
String nowdate = myFmt.format(date);
String tablename="order_"+nowdate;
rundata(tablename);
logger.info("-------导入H5数据库中"+tablename+"表的渠道汇总数据----");
logger.info("-------执行importGameXXJH5结束------->"+DateUtils.getDateTime()); } public void rundata(String tablename) { //数据源切至H5数据库,获取按渠道按天汇总数据
DynamicDataSource.setCurrentLookupKey("h5_dataSource");
List<Gamexxjh5> gList = gamexxjh5Service.queryAll(tablename);
//数据源切换回至版权数据库
DynamicDataSource.setCurrentLookupKey("dataSource");
//将数据导入至版权的数据表中 for (Gamexxjh5 item : gList) {
TfAnaysisResultTyhx tfAnaysisResultTyhx =new TfAnaysisResultTyhx();
tfAnaysisResultTyhx.setChannelid(item.getChannelid());
tfAnaysisResultTyhx.setChannelname(item.getChannelname());
tfAnaysisResultTyhx.setDaypayment(item.getDaypayment());
tfAnaysisResultTyhx.setStatdate(item.getStatdate()); tfAnaysisResultTyhx.setGameid("41");
tfAnaysisResultTyhx.setGamename("新仙剑H5");
tfAnaysisResultTyhx.setGameEnglishName("xinxianjianH5");
tfAnaysisResultTyhx.setResult("Y");
tfAnaysisResultTyhx.setChanneltype("");
tfAnaysisResultTyhx.setIpowner("大宇资讯股份有限公司");
tfAnaysisResultTyhx.setIpownerid("8");
tfAnaysisResultTyhx.setMoneycl(item.getDaypayment());
tfAnaysisResultTyhx.setMoney(item.getDaypayment());
tfAnaysisResultTyhxService.save(tfAnaysisResultTyhx);
}
} }

注:

要对切换的数据源dataSource2 中的表手动写映射和三层

实体:com.thinkgem.jeesite.modules.cms.entity.StkScenerySpot.java

service:com.thinkgem.jeesite.modules.cms.service.StkScenerySpotService.java

mapper:StkScenerySpotDao.xml (src/main/resources/modules/cms)

我只查所有,所以sql很简单

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.thinkgem.jeesite.modules.cms.dao.StkScenerySpotDao">
  4. <sql id="stkScenerySpotColumns">
  5. a.Spot_Id AS "id",
  6. a.CamId AS "camId",
  7. a.Name AS "name",
  8. a.Comment AS "commnet"
  9. </sql>
  10. <sql id="stkScenerySpotJoins">
  11. </sql>
  12. <select id="findList" resultType="StkScenerySpot">
  13. SELECT
  14. <include refid="stkScenerySpotColumns"/>
  15. FROM stk_scenery_spot a
  16. <include refid="stkScenerySpotJoins"/>
  17. <where>
  18. 1 = 1
  19. </where>
  20. <choose>
  21. <otherwise>
  22. ORDER BY a.Spot_Id DESC
  23. </otherwise>
  24. </choose>
  25. </select>
  26. </mapper>

六、jeesite如何跨库查询

jeesite.propertity中配置的数据源会设置一个数据库,这个数据库只是启动库。

在mapper.xml中可以可以跨库查询

jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://106.75.21.XX:3306/copyright?useUnicode=true&characterEncoding=utf-8
jdbc.username=name1
jdbc.password=password1
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thinkgem.jeesite.modules.gamexxjh5.dao.Gamexxjh5Dao">
<select id="queryAll" resultType="Gamexxjh5">
select t.statdate,t.channelid,a.channelname,t.daypayment
from (
select from_unixtime(createTime,'%Y-%m-%d') as statdate,channelid,sum(paymoney)/100 as daypayment
from h5game_shengli_com_xxjqxz.${tablename} where chargeStatus='2'
group by from_unixtime(createTime,'%Y-%m-%d') ,channelid
order by from_unixtime(createTime,'%Y-%m-%d') desc
) t
left join h5game_shengli_com.channel a on a.id=t.channelid
</select>
</mapper>

效果:

jeesite数据库表

datasource2数据表

获取数据

前端展示

datasource2数据表中的内容

参考资料:http://www.hifreud.com/2015/02/25/07-spring-datasources/

http://www.cnblogs.com/digdeep/p/4512368.html

【死磕jeesite源码】jeesite添加多数据源的更多相关文章

  1. 死磕Spring源码之AliasRegistry

    死磕Spring源码之AliasRegistry 父子关系 graph TD; AliasRegistry-->BeanDefinitionRegistry; 代码实现 作为bean定义的最顶层 ...

  2. 【死磕jeestie源码】类型后面三个点(String...)和数组(String[])的区别

    类型后面三个点(String...),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟...,表示此处接受的参数为0到多个Object类型的对象,或者 ...

  3. 死磕itchat源码--core.py

    core.py文件中的Core类定义了itchat的所有接口.且,仅仅是定义了接口,全部在component包中实现重构.其用法如下表述: 缺省 源码如下: # -*- encoding: utf-8 ...

  4. 死磕itchat源码--__init__.py

    itchat包中的__init__.py是该库的入口:在该文件中的源码如下: # -*- coding: utf-8 -*- from . import content from .core impo ...

  5. 死磕abstractqueuedsynchronizer源码

    第一次写博客,先练练手. 1.AQS是什么? 在Lock中,用到了一个同步队列AQS,全称为AbstractQueuedSynchronizer,它是一个同步工具也是lock用来实现线程同步的核心组件 ...

  6. 死磕itchat源码--config.py

    itchat的配置文件,源码: import os, platform # 版本及微信的url,二维码等 VERSION = '1.3.10' BASE_URL = 'https://login.we ...

  7. 死磕itchat源码--content.py

    content.py中定义了接受消息的类型,即,用于注册消息函数时的参数类型.源码如下: TEXT = 'Text' MAP = 'Map' CARD = 'Card' NOTE = 'Note' S ...

  8. 死磕itchat源码--目录结构

    阅读itchat源码时,先弄清itchat的目录结构 itchat │ config.py │ content.py │ core.py │ log.py │ returnvalues.py │ ut ...

  9. 死磕Spring源码系列

    一.Spring总体架构 1.架构图 2.SpringIOC:核心容器提供 Spring 框架的基本功能.核心容器的主要组件是 BeanFactory,它是工厂模式的实现.BeanFactory 使用 ...

  10. 一般源码安装添加的GD库 是不支持 jpeg 格式的图片的

    一般源码安装添加的GD库 是不支持 jpeg 格式的图片的,只支持如下格式 GD Support enabled GD Version bundled (2.0.34 compatible) GIF ...

随机推荐

  1. STM32 F103 F407 F429 F767对比图

  2. centos7 使用rsync 实现文件同步

    一.服务端(192.168.8.81): 安装软件: yum -y install rsync 创建需同步的目录: mkdir -p /home/root/rsync 编辑配置文件:vim /etc/ ...

  3. 小程序快速部署富文本插件wxParser

    为了解决html2wxml在ios下字体过大问题,又发现一个比较好用的富文本插件:wxParser. 目前 wxParser 支持对一般的富文本内容包括标题.字体大小.对齐和列表等进行解析.同时也支持 ...

  4. WPF 实现阴影效果

    一.WPF最常见的一个阴影效果的类是DropShadowEffect.它有几种比较有用的属性比如:Color设置颜色Direction设置投影的方向ShadowDepth设置投影距纹理下方的距离Opa ...

  5. 快速排序partition过程常见的两种写法+快速排序非递归实现

    这里不详细说明快速排序的原理,具体可参考here 快速排序主要是partition的过程,partition最常用有以下两种写法 第一种: int mypartition(vector<int& ...

  6. Spark机器学习(5):SVM算法

    1. SVM基本知识 SVM(Support Vector Machine)是一个类分类器,能够将不同类的样本在样本空间中进行分隔,分隔使用的面叫做分隔超平面. 比如对于二维样本,分布在二维平面上,此 ...

  7. ROS actionlib学习(一)

    actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的 ...

  8. 启动Jupyter Notebook

    按照图所示,在命令下输入ipython notebook 即可启动Jupyter. 启动后的效果:

  9. C语言100个经典的算法

    C语言的学习要从基础開始.这里是100个经典的算法-1C语言的学习要从基础開始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每一个月都生一对兔子.小兔 子长到第三个月后每一 ...

  10. 你真的了解String的常见API吗?

    面试官Q1:请问String常见的方法有哪些,列举几个? String是我们开发中使用频率最高的类,它有哪些方法,大家一定不会陌生,例如: length();//计算字符串的长度 charAt();/ ...