【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
网上看了几个例子,都是相同数据源的动态切换,如果不是同一种数据库类型,分页查询就出问题。经过研究解决问题。
- jeesite.properties配置多数数据源地址,这里以mysql5.7和sqlserver2008版本为例子
#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()- 创建动态数据源类
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() */ @Override protected Object determineCurrentLookupKey() { return getCurrentLookupKey(); } }
修改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>
创建方言动态切换类 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(); } } }
修改框架自带类 com.thinkgem.jeesite.common.persistence.interceptor.PaginationInterceptor
67行添加如下两行代码,并修改原来的圆圈地方: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>
mybatis sqlserver 分页查询sql,findlist方法
动态调用方式:
@RequestMapping(value = {"api/list", ""}) @ResponseBody public ResponseEntity<?> list(WeatherCondition weatherCondition, HttpServletRequest request, HttpServletResponse response, Model model) { //切换数据源sqlserver,默认数据源mysql DynamicDataSource.setCurrentLookupKey("sqlserver"); Page<WeatherCondition> page = weatherConditionService.findPage(new Page<WeatherCondition>(request, response), weatherCondition); DynamicDataSource.setCurrentLookupKey("mysql"); return new ResponseEntity(page, HttpStatus.OK); }
来源:oschina
链接:https://my.oschina.net/u/2328605/blog/2254180