1. 程式人生 > >資料庫連線池 —— Druid的簡單使用

資料庫連線池 —— Druid的簡單使用

Druid不僅是一個數據庫連線池,還包含一個ProxyDriver、一系列內建的JDBC元件庫、一個SQL Parser。支援所有JDBC相容的資料庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。

 

使用步驟

一定要匯入jar架包。要配置好檔案,如果不配置檔案,記得在程式中自行新增。

 

  1. 匯入jar包: druid-1.0.9.jar、mysql-connector-java-5.1.48.jar

  2. 定義配置檔案:可以命名為druid-1.0.9.properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://MySQL地址/資料庫名
    username=使用者名稱
    password=密碼
    initialSize=初始化連線數
    maxActive=最大連線數
    maxWait=最大等待時間(毫秒為單位)

     

  3. 載入配置檔案druid-1.0.9.properties

  4. 獲取連線池物件

  5. 獲取資料庫連線

舉例如下:

package my.view.datasource.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidDemo {

    public static void main(String[] args) throws Exception {
        // 獲取載入配置檔案的物件
        Properties properties = new Properties();

        // 獲取類的類載入器
        ClassLoader classLoader = DruidDemo.class.getClassLoader();

        // 獲取druid-1.0.9.properties配置檔案資源輸入流
        InputStream resourceAsStream = classLoader.getResourceAsStream("druid-1.0.9.properties");

        // 載入配置檔案
        properties.load(resourceAsStream);

        // 獲取連線池物件
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        // 獲取資料庫連線物件
        Connection connection = dataSource.getConnection();

        // 列印獲取到的資料庫連線物件地址值
        System.out.println(connection);
    }

}

 

定義一個建立資料庫連線池物件的類

在使用資料庫連線池的時候,我們不可能說每次都如上例中的情況自己寫一遍吧。我們可以自定義一個工具類,用來建立資料庫連線池物件,這個時候,我們乳溝想要建立資料庫連線池物件,直接呼叫該工具類即可。

 

建立工具類例項

定義獲取資料庫連線池物件的方法

/**
 * 資料庫連線物件
 */
private static DataSource dataSource;

/*
 獲取資料庫連線池物件
 */
static {

    try {
        // 獲取載入配置檔案的物件
        Properties properties = new Properties();
        // 獲取類的類載入器
        ClassLoader classLoader = JdbcUtils.class.getClassLoader();
        // 獲取druid-1.0.9.properties配置檔案資源輸入流
        InputStream resourceAsStream = classLoader.getResourceAsStream("druid-1.0.9.properties");
        // 載入配置檔案
        properties.load(resourceAsStream);
        // 獲取連線池物件
        dataSource = DruidDataSourceFactory.createDataSource(properties);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

/**
 * 獲取連線池物件
 */
public static DataSource getDataSource() {
    return dataSource;
}

 

定義獲取資料庫連線物件的方法

/**
 * 獲取資料庫連線物件
 */
public static Connection getConnection() throws Exception {
    return dataSource.getConnection();
}

 

定義釋放資源的方法

/**
 * 歸還連線
 * @param t 要被歸還到熟即可連線池物件的資料庫連線物件
 * @param <T> 資料庫連線物件的型別
 */
public static <T> void releaseResources (T t){
    if(t != null){
        try {
            // 利用反射,獲取class物件
            Class<?> aClass = t.getClass();
            // 獲取class物件中的方法物件
            Method close = aClass.getMethod("close");
            // 執行方法
            close.invoke(t);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

該工具類總的程式碼:

package my.view.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Properties;

public class JdbcUtils {

    /**
     * 資料庫連線物件
     */
    private static DataSource dataSource;

    /*
     獲取資料庫連線池物件
     */
    static {

        try {
            // 獲取載入配置檔案的物件
            Properties properties = new Properties();
            // 獲取類的類載入器
            ClassLoader classLoader = JdbcUtils.class.getClassLoader();
            // 獲取druid-1.0.9.properties配置檔案資源輸入流
            InputStream resourceAsStream = classLoader.getResourceAsStream("druid-1.0.9.properties");
            // 載入配置檔案
            properties.load(resourceAsStream);
            // 獲取連線池物件
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 獲取連線池物件
     */
    public static DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 獲取資料庫連線物件
     */
    public static Connection getConnection() throws Exception {
        return dataSource.getConnection();
    }

    /**
     * 歸還連線
     * @param t 要被歸還到熟即可連線池物件的資料庫連線物件
     * @param <T> 資料庫連線物件的型別
     */
    public static <T> void releaseResources (T t){
        if(t != null){
            try {
                // 利用反射,獲取class物件
                Class<?> aClass = t.getClass();
                // 獲取class物件中的方法物件
                Method close = aClass.getMethod("close");
                // 執行方法
                close.invoke(t);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

 

使用上面建立個工具類例項

有如下一個資料表格

CREATE TABLE account (
    id INT PRIMARY KEY AUTO_INCREMENT,   -- id
    NAME VARCHAR(10),                    -- 名字
    balance DOUBLE                       -- 餘額
);

INSERT INTO account (NAME, balance) VALUES ('LeeHua', 1000), ('Tom', 1000);

向該表格中插入一條資料,實現如下:

package my.view.datasource.druid;

import my.view.utils.JdbcUtils;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class JdbcUtilsDemo {

    public static void main(String[] args) throws Exception{

        // 獲取資料庫連線池物件
        DataSource dataSource = JdbcUtils.getDataSource();

        // 從資料庫連線池物件中獲取資料庫連線物件
        Connection connection = dataSource.getConnection();

        // 預定義定義SQL語句
        String sql = "INSERT INTO account (NAME, balance) VALUES (?, ?);";

        // 獲取執行預定義SQL語句物件
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        // 給?賦值
        preparedStatement.setString(1, "WanWu");
        preparedStatement.setInt(2, 2000);

        // 執行預編譯好的SQL語句
        preparedStatement.executeUpdate();

        // 釋放資源:PreparedStatement
        JdbcUtils.releaseResources(preparedStatement);

        // 歸還連線
        JdbcUtils.releaseResources(connection);

        // 釋放資源:資料庫連線池
        JdbcUtils.releaseResources(dataSource);
    }

}

 

執行程式,然後查詢一下表記錄:

可以看到插入了一條資料,說明測試成功。

 

          

&n