本文转载自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. CentOS 6.8 安装 Erlang 及 RabbitMQ Server

    安装 Erlang 19.3 # 安装依赖包 yum install -y gcc gcc-c++ unixODBC-devel openssl-devel ncurses-devel # 下载 er ...

  2. idea jsp html 空白页的问题

    摘要 最近没事儿瞎折腾java web,在idea中,突然发现无法显示页面了. 问题 为什么会出现这个问题? 接触了过滤器的内容,然后在项目中添加了这样的一个过滤器,用来对post过来的数据进行ut8 ...

  3. 在 Python 中使用 in_memory 工作空间

    在 Python 中使用 in_memory 工作空间 在 Python 脚本中,in_memory 工作空间仅对地理处理工具有效:它不是可以写入任何数据的通用虚拟目录. 您可以按以下代码示例所示使用 ...

  4. vim IDE配置

    参考: http://www.cnblogs.com/witcxc/archive/2011/12/28/2304704.html http://www.cnblogs.com/ma6174/arch ...

  5. vue中Axios请求豆瓣API数据并展示到Swipe中

    vue中Axios请求豆瓣API数据并展示到Swipe中 1.首先是安装Axios: 安装方法cnpm install axios --save 等待npm安装完毕: 2.在main.js中引入axi ...

  6. C++11 lambda表达式是如何实现的?

    lambda表达式是如何实现的呢? 其实是编译器为我们了创建了一个类,这个类重载了(),让我们可以像调用函数一样使用.所以,你写的lambda表达式和真正的实现,是这个样子的: 而对于捕获变量的lam ...

  7. [BetterExplained]为什么你应该(从现在开始就)写博客

    (一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处.(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极 ...

  8. 浅谈java构建工具的选择

    在学校的时候还总是自己用eclipse自带的jar导出工具,然后人工来给项目打包,那是相当的原始. 而后工作了,项目中都是用ant,慢慢的开始学会使用这个工具.感觉就和脚本一样,很容易读懂,做项目构建 ...

  9. fork failed because of Out Of Memory

    Maybe virtual memory over commit is prevented in your system. If it is prevented, then the virtual m ...

  10. 【C语言】符号优先级

    一. 问题的引出 今天看阿里的笔试题,看到一个非常有意思的题目,但是很容易出错. 题目:如下函数,在32bit系统foo(2^31-3)的值是: Int foo(int x) { return x&a ...