基於Spring的多數據源(Druid)定時任務項目開發(一)

這個基於Spring的對數據源定時任務項目,從2015年11月份產生想法到現在已經過了半年了。起初想着開發這個項目是因爲公司業務需要,其實之前公司有人開發過一個相同功能的項目。但是項目結構雜亂,同時開發的人員太多,導致代碼特別的混亂,甚至業務都不能正常的運行。所以,在接觸到那個項目之後自己就起了自己搭建並開發的想法,到現在已經更新到第三個版本了。下面會先大致的介紹下項目用到的幾個關鍵的技術,已經用到的部分。
  1. MAVEN
    項目jar的管理是用的maven,這個是我剛接觸工作業務的時候用到的管理,一直覺得很好用,配置簡單,jar再也不用自己下載。基本比分之九十九的jar都能下載到,但是有很少一部分下載不了,比如連接Oracle數據庫的jar,這個時候就需要自己在網上下載之後,手動導入到本地庫中。具體的方法見Maven導入本地jar
  2. Spring
    Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由OP)。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。 這個就不多介紹了,大家都知道的。
  3. Druid
    Druid是一個JDBC組件,它包括三部分:
    1、DruidDriver 代理Driver,能夠提供基於Filter-Chain模式的插件體系。
    2、DruidDataSource 高效可管理的數據庫連接池。
    3、SQLParser
    阿里開發的,有興趣的話,Druid GitHub中文地址

至於項目的搭建,大致的步驟就是,新建maven項目,然後maven項目轉web項目。(具體的操作方法,這裏就不詳細的介紹了),下面粘貼上pom.xml。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ewidewater</groupId>
    <artifactId>synchroInfo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.19</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>1.0.1</version>
        </dependency>
    </dependencies>
</project>

下面的重點就是多數據源的編碼了,下面先附上
DynamicDataSource.java
DataSourceContextHolder.java
DataSourceConst.java
具體的每個類的用途,在代碼間都有相關的解釋

package com.ewidewater.util;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 重寫一個動態數據源的類,繼承Spring
 * AbstractRoutingDataSource類,並且實現determineCurrentLookupKey()方法。
 * 看determineCurrentLookupKey()方法的註釋,意思大致就是決定當前數據源的key。
 * 
 * @author Administrator
 *
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDateSourceType();
    }

}
package com.ewidewater.util;

public class DataSourceContextHolder {

    /**
     * 爲了線程安全,設置每個線程單獨的變量
     */
    private static final ThreadLocal contextHolder = new ThreadLocal();

    /**
     * @Description:設置當前數據源的key
     * @param 
     * @return void
     * 
     * @author wang_yw )_)
     * @date:2016年6月3日
     */
    public static void setDataSourseType(String dataSourceType){
        contextHolder.set(dataSourceType);
    }

    /**
     * @Description:獲取當前數據源的key
     * @param 
     * @return String
     * 
     * @author wang_yw )_)
     * @date:2016年6月3日
     */
    public static String getDateSourceType(){
        return (String)contextHolder.get();
    }


    /**
     * @Description:清除當前數據源的key
     * @param 
     * @return void
     * 
     * @author wang_yw )_)
     * @date:2016年6月3日
     */
    public static void clearDataSourceType(){
        contextHolder.remove();
    }



}
package com.ewidewater.util;

/**
 * 數據源常量
 * @author wang_yw (_(
 */
public class DataSourceConst {
    public final static String one = "one";
    public final static String two = "two";
}

今天太晚了,就不接着詳細介紹了,這裏有一個簡單的項目Demo,大家有興趣的話,可以下載運行。有疑問的或者更好的建議的話,歡迎留言,或者郵箱[email protected],有用的話記得給個評分哦~
下載地址:Demo下載地址
項目JDK1.8,1.7也是可以運行的,編譯的時候修改下就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章