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;最后…

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添加…

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)进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自 官…

老人寻求到一名程序员,用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;于…

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

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

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

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

软概(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隐身…

php两个数组融合,php合并两个数组的方式有哪些

1、arrary_merge示例代码&#xff1a;$arr1 array(1, 2, 3, 4, 5);$arr2 array(1, 2, 6, 7, 8, 9, 10);$result1 array_merge($arr1, $arr2);$arr3 array("name" > "itbsl", "age" > 13, "sex" > "Male");$arr…

最近对latin-1这个字符集产生了不少好感

【简介】 最近我要解析一个数据库中间件的日志、这个中间件会在日志中记录SQL发往的后台DB ,执行耗时&#xff0c;对应的SQL&#xff1b;中间件直接把SQL写到 了日志中去&#xff0c;并没有对SQL进行适当的编码转换&#xff1b;理想情况下这个也不会有什么问题&#xff0c;不幸…

面象对象设计原则之六:迪米特原则(LeastKnowledge Principle, LKP)

迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。迪米特法则又称为最少知识原则(LeastKnowledge Principle, LKP)&#xff0c;其定义如下&#xff1a; 迪米特法则(Law of Demeter, LoD)&#xff1a;一个软件实体应当尽可能少地与…

其他对象的表单

1.textarea&#xff1a; textarea对象就想是input对象中的text样式的表单&#xff0c;只不过是扩展过的text样式表单。它可以通过行&#xff08;rows&#xff09;属性和列&#xff08;cols&#xff09;属性来编辑文本域的大小。最常见于留言板、论坛时回帖时的文本框等。 <h…

WinForm(十三)WebView2

WebView是WinForm框架中一个控件&#xff0c;用来对网页信息交互&#xff0c;有时Web自己开发的&#xff0c;有时Web是三方的。下面通过一个例子来看看WebView2的使用。首先看Web的逻辑&#xff0c;是一个商品添加页面&#xff0c;用AlpineJS和BootStrap来开发的&#xff0c;业…

Fluent UDF【4】:C语言

Fluent UDF利用的是C语言&#xff0c;本文简单介绍在UDF中经常会用到的C语言常识。 本文部分内容来自UDF手册。 1 C语言中的注释 C语言中的注释利用/*及*/来实现。例如: /*这是一个注释*/ 注释也可以跨行实现&#xff0c;如: /*这是一个 跨行注释*/ 注意:在编写UDF的过程中&…

java 画砖块,钢笔画入门:教你画砖块

说到砖块很多朋友会想到搬砖&#xff0c;绘画吧今天要教大家用钢笔画一块砖&#xff0c;因为画建筑的时候经常要画砖墙&#xff0c;我们先从简单的砖块学起&#xff0c;之后绘画吧会给大家分享画一面砖墙的哦。绘制要点&#xff1a;本教程的主体物选择了一块有小残缺面的砖头。…

[转] Node.js的线程和进程

[From] http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑&#xff0c;Node.js到底是单线程的还是多线程的&#xff1f;通过本章的学习&#xff0c;能够让读者较为清晰的理解Node.js对于单/多线程的关系和支持情况。同时本章还将列举一些让…

第三方支付异步通知的陷阱

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/j16421881/article/details/78703792 用户下单后调用第三方支付付款&#xff0c;然后接收第三方支付的异步通知&#xff0c;以便确认支付是否成功。 如下图 但异步通知可能…