首頁 > 軟體

Java實現資料連線池Druid舉例

2022-03-17 10:00:31

開篇

Druid號稱是Java語言中最好的資料庫連線池,並且能夠提供強大的監控和擴充套件功能。作為日常使用較多的資料庫連線元件,純粹個人興趣研究下理解下的實現原理。

理解一個工具元件最好的方式就是進行 debug,這裡建議大家下載下參考連線中的 druid demo,修改下具體的資料庫連線引數就可以直接進行偵錯跟蹤。

之所以強調 Demo 的重要性,在於通過 demo 能夠跟蹤所有的執行流程,有了 Demo 剩下的事情只要花時間都能很好的梳理。

Druid的偵錯

url=jdbc:mysql://localhost:3306/github_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true
username=root
password=123456
name=zzs001
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=4
maxActive=8
minIdle=0
maxWait=-1
poolPreparedStatements=false
maxOpenPreparedStatements=10
validationQuery=select 1 from dual
validationQueryTimeout=-1
testOnBorrow=false
testOnReturn=false
testWhileIdle=true
timeBetweenEvictionRunsMillis=-1
minEvictableIdleTimeMillis=1800000
defaultAutoCommit=true
defaultReadOnly=false
defaultTransactionIsolation=REPEATABLE_READ
defaultCatalog=github_demo
removeAbandoned=false
removeAbandonedTimeoutMillis=300*1000
logAbandoned=true
filters=log4j,wall,mergeStat
connectionProperties=druid.useGlobalDataSourceStat=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=5000
accessToUnderlyingConnectionAllowed=false
init=true

基礎的設定資訊如上,核心在於 JDBC 的連線地址資訊。

public class DruidDataSourceTest {

    @Test
    public void save() throws SQLException {
        // 建立sql
        String sql = "insert into demo_user values(null,?,?,?,?,?)";
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 獲得連線
            connection = JDBCUtils.getConnection();
            // 開啟事務設定非自動提交
            connection.setAutoCommit(false);
            // 獲得Statement物件
            statement = connection.prepareStatement(sql);
            // 設定引數
            statement.setString(1, "zzf003");
            statement.setInt(2, 18);
            statement.setDate(3, new Date(System.currentTimeMillis()));
            statement.setDate(4, new Date(System.currentTimeMillis()));
            statement.setBoolean(5, false);
            // 執行
            statement.executeUpdate();
            // 提交事務
            connection.commit();
        } finally {
            // 釋放資源
            JDBCUtils.release(connection, statement, null);
        }
    }
}

核心步驟獲獲取 Connection 並設定並通過 Connection 設定statement,最後通過statement進行 SQL 的執行。

public class JDBCUtils {

    private static DataSource dataSource;
    private static ThreadLocal<Connection> tl = new ThreadLocal<>();
    private static final Log log = LogFactory.getLog(JDBCUtils.class);

    static {
        init();
    }

    private static void init() {
        Properties properties = new Properties();
        InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(in);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch(Exception e) {
            throw new RuntimeException("建立資料來源失敗", e);
        }
    }

    /**
     * <p>獲取資料庫連線物件的方法,執行緒安全</p>
     * @return: Connection
     */
    public static Connection getConnection() throws SQLException {
        // 從當前執行緒中獲取連線物件
        Connection connection = tl.get();
        // 判斷為空的話,建立連線並繫結到當前執行緒
        if(connection == null) {
            connection = createConnection();
            tl.set(connection);
        }
        return connection;
    }

    /**
     * <p>建立資料庫連線</p>
     * @return: Connection
     * @throws SQLException 
     */
    private static Connection createConnection() throws SQLException {
        Connection conn = null;
        // 獲得連線
        conn = dataSource.getConnection();
        return conn;
    }
}
  • 通過DruidDataSourceFactory建立 DataSource。
  • 通過DataSource獲取 Connection。

參考

druid原始碼倉庫
druid demo

到此這篇關於Java實現資料連線池Druid舉例的文章就介紹到這了,更多相關Java 資料連線池Druid內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com