jeesite1.X 集成多数据源

£可爱£侵袭症+ 提交于 2019-12-21 15:51:28

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

  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()
         */
        @Override
        protected 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行添加如下两行代码,并修改原来的圆圈地方:

  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方法

  8. 动态调用方式:
     

    @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);
        }

     

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!