jeesite1.X 集成多數據源

網上看了幾個例子,都是相同數據源的動態切換,若是不是同一種數據庫類型,分頁查詢就出問題。通過研究解決問題。java

  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
     mysql

    <!-- 數據源配置, 使用 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,因此只寫兩個
     git

    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行添加以下兩行代碼,並修改原來的圓圈地方:
    github

  6. pom.xml 添加sqlserver2008驅動和依賴spring

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

  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);
        }
相關文章
相關標籤/搜索