jeesite1.X 集成多数据源

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

网上看了几个例子,都是相同数据源的动态切换,如果不是同一种数据库类型,分页查询就出问题。经过研究解决问题。

  1. jeesite.properties配置多数数据源地址,这里以mysql5.7sqlserver2008版本为例子
    #mysql database setting
    jdbc.type=mysql
    #jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/nkydsj?useUnicode=true&characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=111111
    
    #mssql database settings
    #jdbc.type2=mssql
    jdbc.url2=jdbc:sqlserver://localhost:1433;DatabaseName=NXQiXiang
    jdbc.username2=sa
    jdbc.password2=111111
    
    #pool settings
    jdbc.pool.init=1
    jdbc.pool.minIdle=3
    jdbc.pool.maxActive=20
    
    #jdbc.testSql=SELECT 'x'
    jdbc.testSql=SELECT 'x' FROM DUAL
    jdbc.testSql2 = SELECT getdate()
  2.  创建动态数据源类
    package com.thinkgem.jeesite.common.db;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();/*** @return the currentLookupKey* @author sa* @date 2012-5-18 下午4:06:44*/public static String getCurrentLookupKey() {return (String) contextHolder.get();}/*** @param currentLookupKey the currentLookupKey to set* @author sa* @date 2012-5-18 下午4:06:44*/public static void setCurrentLookupKey(String currentLookupKey) {contextHolder.set(currentLookupKey);}/** (non-Javadoc)** @see* org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#* determineCurrentLookupKey()*/@Overrideprotected Object determineCurrentLookupKey() {return getCurrentLookupKey();}}
    

     

  3. 修改spring-context.xml
     

    <!-- 数据源配置, 使用 BoneCP 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --><!--<property name="driverClassName" value="${jdbc.driver}" />--><!--<property name="DbType" value="${jdbc.type}" />--><!-- 基本属性 url、user、password --><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${jdbc.pool.init}" /><property name="minIdle" value="${jdbc.pool.minIdle}" /> <property name="maxActive" value="${jdbc.pool.maxActive}" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="${jdbc.testSql}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)<property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> --><!-- 配置监控统计拦截的filters --><property name="filters" value="stat" /> </bean><!-- 第二个数据源配置, 使用 BoneCP 数据库连接池 --><bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --><!--<property name="driverClassName" value="${jdbc.driver2}" />--><!-- 基本属性 url、user、password --><property name="url" value="${jdbc.url2}" /><property name="username" value="${jdbc.username2}" /><property name="password" value="${jdbc.password2}" /><!--<property name="DbType" value="${jdbc.type2}" />--><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${jdbc.pool.init}" /><property name="minIdle" value="${jdbc.pool.minIdle}" /><property name="maxActive" value="${jdbc.pool.maxActive}" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="${jdbc.testSql2}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)<property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> --><!-- 配置监控统计拦截的filters --><property name="filters" value="stat" /></bean><!-- 动态数据源 --><bean id="dynamicDataSource" class="com.thinkgem.jeesite.common.db.DynamicDataSource"><property name="defaultTargetDataSource" ref="dataSource"/><property name="targetDataSources"><map><entry key="mysql" value-ref="dataSource"/><entry key="sqlserver" value-ref="dataSource2"/></map></property></bean>

     

  4. 创建方言动态切换类 com.thinkgem.jeesite.common.db.DbDialectFoactory,暂时只用sqlserver2008和mysql,所以只写两个
     

    package com.thinkgem.jeesite.common.db;import com.thinkgem.jeesite.common.persistence.dialect.Dialect;
    import com.thinkgem.jeesite.common.persistence.dialect.db.MySQLDialect;
    import com.thinkgem.jeesite.common.persistence.dialect.db.SQLServer2005Dialect;public class DbDialectFoactory {public static Dialect createDbDialect(String type) {if ("sqlserver".equals(type)) {return new SQLServer2005Dialect();}else{return new MySQLDialect();}}
    }
    

     

  5. 修改框架自带类 com.thinkgem.jeesite.common.persistence.interceptor.PaginationInterceptor
    67行添加如下两行代码,并修改原来的圆圈地方:
    a090d40837f781f3ef72be4730f4f7c52a5.jpg

  6. pom.xml 添加sqlserver2008驱动和依赖

            <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependency><!-- https://mvnrepository.com/artifact/com.github.jsqlparser/jsqlparser --><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>1.2</version></dependency>

     

  7. mybatis sqlserver 分页查询sql,findlist方法
    1f40ca5cecaf8f2c67bda0c0ef2778f35e9.jpg

  8. 动态调用方式:
     

    @RequestMapping(value = {"api/list", ""})@ResponseBodypublic ResponseEntity<?> list(WeatherCondition weatherCondition, HttpServletRequest request, HttpServletResponse response, Model model) {//切换数据源sqlserver,默认数据源mysqlDynamicDataSource.setCurrentLookupKey("sqlserver");Page<WeatherCondition> page = weatherConditionService.findPage(new Page<WeatherCondition>(request, response), weatherCondition);DynamicDataSource.setCurrentLookupKey("mysql");return new ResponseEntity(page, HttpStatus.OK);}

     

 

转载于:https://my.oschina.net/matt0614/blog/2254180

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s HPA(HorizontalPodAutoscaler)-自动水平伸缩

Horizontal Pod Autoscaling in Kubernetes写在前面我们平时部署web服务&#xff0c;当服务压力大撑不住的时候&#xff0c;我们会加机器(加钱)&#xff1b;一般没有上容器编排是手动加的&#xff0c;临时加的机器&#xff0c;临时部署的服务还要改Nginx的配置&#xff0c;最后…

jQuery 基金会和 Dojo 基金会合并:Open Web

统一基金会&#xff0c;服务开发人员&#xff0c;推动开放 Web 技术发展jQuery 基金会和 Dojo 基金会今天宣布计划联合&#xff0c;旨在建立最大&#xff0c;最多样化和最全面的基金会&#xff0c;通过服务开发者&#xff0c;他们的项目&#xff0c;他们的社区来构建开放的 Web…

spark java 逻辑回归_逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件

原标题&#xff1a;逻辑回归分类技术分享&#xff0c;使用Java和Spark区分垃圾邮件由于最近的工作原因&#xff0c;小鸟很久没给大家分享技术了。今天小鸟就给大家介绍一种比较火的机器学习算法&#xff0c;逻辑回归分类算法。回归是一种监督式学习的方式&#xff0c;与分类类似…

jQuery.extend()方法

定义和用法jQuery.extend()函数用于将一个或多个对象的内容合并到目标对象。 注意&#xff1a; 1. 如果只为$.extend()指定了一个参数&#xff0c;则意味着参数target被省略。此时&#xff0c;target就是jQuery对象本身。通过这种方式&#xff0c;我们可以为全局对象jQuery添加…

1066. 图像过滤(15)

原题: https://www.patest.cn/contests/pat-b-practise/1066 思路: 开胃小菜 实现: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 题…

Wget用法、参数解释的比较好的一个文章

一个语句就可以下载cvpr2016的全部论文&#xff1a; wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中&#xff0c;-c表示断点续传&#xff1b;-N表示已经下载的内容不再重…

.NET VS智能提示汉化 (.Net6)

先上现成的.net6汉化文件&#xff0c;可以手动下载后参照 [如何为 .NET 安装本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自 官…

go 返回mysql数组_Go基础之--操作Mysql(一)

关于标准库database/sqldatabase/sql是golang的标准库之一&#xff0c;它提供了一系列接口方法&#xff0c;用于访问关系数据库。它并不会提供数据库特有的方法&#xff0c;那些特有的方法交给数据库驱动去实现。database/sql库提供了一些type。这些类型对掌握它的用法非常重要…

Vue CLI 3开发中屏蔽烦人的EsLint错误

问题 Vue开发中&#xff0c;特别是当你阅读分析别人的其中早期版本的Vue代码时往往会遭遇到满屏幕的烦人的EsLint错误。有关EsLint这个工具的作用不再赘述。查阅网上参考文档&#xff0c;大多是针对早起版本Vue CLI工具项目的&#xff0c;在我最新使用的Vue CLI 3生成的工程中根…

pyinstaller---将py文件打包成exe

pyinstaller可将Python脚本打包成可执行程序&#xff0c;使在没有Python环境的机器上运行。 1.pyinstaller在windows下的安装 直接在命令行用pip安装 pyinstaller&#xff0c; 在windows下&#xff0c;pyinstaller需要PyWin32的支持。当用pip安装pyinstaller时未找到PyWin32&am…

老人寻求到一名程序员,用2W行代码给自己打造了一幅肖像画

今天翻墙看了下国外的论坛&#xff0c;看到了一位版主给一位老人描绘肖像画的文章&#xff0c;不得不说这位大佬是真的厉害&#xff0c;近20000行代码&#xff0c;而且还画的很像&#xff0c;像小编我这种手残党&#xff0c;用笔也不能画出来&#xff0c;不得不服&#xff0c;今…

一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]

[接上篇]“天下大势&#xff0c;分久必合&#xff0c;合久必分”&#xff0c;ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系统中之后&#xff0c;也许微软还是意识到Web应用和后台服务的承载方式还是应该加以区分&#xff0c;于…

java jpa 模糊查询_JPA 以SQL实现分页不模糊查询(参数可能为空)

repository代码:package com.fancy.miniflow.repository;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.jpa.repository.Q…

GitHub服务中断24小时11分钟事故分析报告\n

上周&#xff0c;GitHub经历了一次事故&#xff0c;导致服务降级24小时11分钟。虽然平台的某些部分不受事故影响&#xff0c;但仍然有多个内部系统受到了影响&#xff0c;向用户显示了过时且不一致的内容。所幸没有用户数据丢失&#xff0c;但针对几秒钟数据库写入的手动调整工…

8 旋转数组的最小数字

输入一个递增排序数组的一个旋转&#xff0c;输出旋转数组的最小元素例如1,2,3,4,5的一个旋转可以为3,4,5,1,2把一个数组的最开始若干个元素搬到数组的末尾&#xff0c;称之为数组的旋转 输出旋转数组的最小元素 C: 1 class Solution {2 public:3 int minInOrder(vector<…

软考新思维--2017年上半年信息系统项目管理师上午试题分析与答案(试题6-10题)...

2017年上半年信息系统项目管理师上午试题分析与答案&#xff08;试题1-5题&#xff09; 6.&#xff08;&#xff09;不是获取需求的方法。A、问卷调查B、会议讨论C、获取原型D、决策分析【软考新思维】需求是获取的得来的&#xff0c;不是决策得来的。 先是获取需求&#xff0c…

php 合并 字符串_PHP如何去重合并字符串

本篇文章主要给大家介绍PHP如何去重合并字符串。推荐教程&#xff1a;《PHP教程》对于PHP学习者来说&#xff0c;合并多个字符串&#xff0c;应该并不是很难。但是如果这多个字符串中&#xff0c;有相同元素&#xff0c;当我们想要合并他们并且要使其值具有唯一值。也就是说合并…

10.31T4 HAOI2010最长公共子序列 计数+容斥原理

2775 -- 【HAOI2010】最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地&#xff08;不一定连续&#xff09;去掉若干个字符&#xff08;可能一个也不去掉&#xff09;后所形成的字符序列。令给定的字符序列X“x0&#xff0c;x1&#xff0c;…&#xff0…

软概(lesson 2):课堂测试

一、测试题目 二、完成过程 1.设计思想 ①连接mysql数据库 ②设计user类&#xff0c;增加参数 ③设计add类&#xff0c;向数据库内增加内容 ④设计addInput页面&#xff0c;完成录入操作 ⑤设计add页面&#xff0c;接收录入的参数&#xff0c;并调用add类函数 2.源代码 user.ja…

谷歌Gboard输入法新增“无痕模式”:仅在Chrome隐身窗口中适用

据外媒Android Police报道&#xff0c;如大家所知道的&#xff0c;Chrome浏览器中的“隐身模式”是为了防止你的私密浏览记录被其他人看到&#xff0c;但是&#xff0c;在这种模式下&#xff0c;你的输入法键盘依然会记住你输入的短语&#xff0c;为了阻止你的键盘在Chrome隐身…