數據庫連接池

傳統的jdbc連接數據庫方式如下:
我們需要幾個步驟:注冊 JDBC 驅動程序注冊( Class.forName(DRIVER_NAME) ),通過DriverManager獲取物理連接。
一次數據庫訪問對應一個物理連接,每次操作數據庫都要打開、關閉該物理連接。
添加mysql驅動包

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>

jdbc操作類如下:

public class DBUtil {

    private static Logger logger = LoggerFactory.getLogger(DBUtil.class);
    private static String DRIVER_NAME = null;
    private static String URL = null;
    private static String USER_NAME = null;
    private static String PWD = null;

    private static Properties properties = new Properties();

    static {
        try {
            properties.load(DBUtil.class.getResourceAsStream("/jdbc.properties"));
        } catch (IOException e) {
            logger.error("系統加載jdbc.properties配置異常");
        }
        DRIVER_NAME = properties.getProperty("jdbc.driver");
        URL = properties.getProperty("jdbc.url");
        USER_NAME = properties.getProperty("jdbc.username");
        PWD = properties.getProperty("jdbc.password");
        try {
            Class.forName(DRIVER_NAME);
        } catch (ClassNotFoundException e) {
            logger.error("加載數據庫驅動異常");
        }
    }

    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(URL, USER_NAME, PWD);
        } catch (SQLException e) {
            logger.error("創建數據庫鏈接異常", e);
        }
        return connection;
    }

    public static void close(Connection connection) {
        if (connection != null) {
            try {
                if (!connection.isClosed()) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("連接關閉異常", e);
            }
        }
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                if (!resultSet.isClosed()) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                logger.error("結果集關閉異常", e);
            }
        }
        if (statement != null) {
            try {
                if (!statement.isClosed()) {
                    statement.close();
                }
            } catch (SQLException e) {
                logger.error("語句關閉異常", e);
            }
        }
        close(connection);
    }
}

我們采用DBCP(DataBase connection pool),數據庫連接池。DBCP是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。
添加dbcp依賴,對應commons-pool和commons-dbcp兩個包

    <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

使用連接池,代碼如下:

public class DBCPUtil {

    private static Logger logger = LoggerFactory.getLogger(DBUtil.class);

    private static Properties properties = new Properties();

    private static DataSource dataSource;

    static {
        try {
            properties.load(DBCPUtil.class.getResourceAsStream("/jdbc.properties"));
        } catch (IOException e) {
            logger.error("系統加載jdbc.properties配置異常");
        }
        try {
            dataSource= BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            logger.error("加載數據庫驅動異常");
        }
//        dataSource=new BasicDataSource();
//        dataSource.setUsername("root");
//        dataSource.setPassword("root");
//        dataSource.setUrl("jdbc:mysql://localhost:3306/web");
//        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    }



    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection=dataSource.getConnection();
            connection.setAutoCommit(true);
        } catch (SQLException e) {
            logger.error("創建數據庫鏈接異常", e);
        }
        return connection;
    }

    public static void close(Connection connection) {
        if (connection != null) {
            try {
                if (!connection.isClosed()) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("連接關閉異常", e);
            }
        }
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                if (!resultSet.isClosed()) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                logger.error("結果集關閉異常", e);
            }
        }
        if (statement != null) {
            try {
                if (!statement.isClosed()) {
                    statement.close();
                }
            } catch (SQLException e) {
                logger.error("語句關閉異常", e);
            }
        }
        close(connection);
    }
}

注意properties的配置 和jdbc是不同的。 我因為還用原來的配置,報錯空指針,Cannot create JDBC driver of class '' for connect URL 'null' ,找了半天Bug

#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/web?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
#jdbc.username=root
#jdbc.password=root
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

JDBC的數據庫連接池使用javax.sql.DataSource來表示,DataSource只是一個接口,該接口通常由商用服務器等提供實現,也有一些開源組織提供實現(DBCP、C3P0)。
DataSource通常被稱為數據源,它包含連接池和連接池管理兩個部分,但習慣上也經常把DataSource稱為連接池。

數據源連接池的方式連接數據庫是在程序中,通過向一個JNDI(Java Naming and Directory Interface)服務器查詢,即調用Context接口的lookup()方法,來得到DataSource對象,然后調用DataSource對象的getConnection()方法建立連接

在代碼中使用DriverManager獲得數據庫連接的方式中,客戶程序得到的連接對象是物理連接,調用連接對象的close()方法將關閉連接,而采用連接池技術,客戶程序得到的連接對象是連接池中物理連接的一個句柄,調用連接對象的close()方法,物理連接并沒有關閉,數據源的實現只是刪除了客戶程序中的連接對象和池中的連接對象之間的聯系.

關于jndi,可以參考:http://benweizhu.github.io/blog/2014/07/07/learning-jdbc-with-jndi/

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互...
    凱哥學堂閱讀 1,061評論 0 0
  • 1.JDBC介紹1.1 1.1 JDBC介紹 2.JDBC之API2.1 2.1 JDBC之API 3.JDBC例...
    拾壹北閱讀 1,202評論 0 7
  • 最原始的數據庫連接就是我們打開一個連接,使用過后再關閉該鏈接來釋放資源。頻繁的新建打開再關閉連接對jvm和數據庫都...
    野柳閱讀 6,412評論 1 11
  • DriverManager的實現方式一般是在主程序中建立數據庫的連接,然后進行數據庫的操作,操作完畢后斷開數據庫連...
    怪蜀黍Zzzzlw閱讀 2,048評論 0 9
  • 我聽到葉薰轉學的消息,去她家找她時,她家大門緊鎖,已然人去樓空。 我那段時間找遍了與葉薰有關的人打探她的消息,但苦...
    貓兒刺閱讀 256評論 5 1