033_jdbc-mysql数据库连接池
1. 數(shù)據(jù)庫連接實(shí)際上是客戶端和遠(yuǎn)程數(shù)據(jù)庫服務(wù)器建立了一個(gè)socket連接, 創(chuàng)建過程比較耗性能和時(shí)間, 因此出現(xiàn)了數(shù)據(jù)庫連接池技術(shù)。
2. 數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接, 它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè)。這項(xiàng)技術(shù)能明顯提高對(duì)數(shù)據(jù)庫操作的性能。
3. 連接池基本的思想是在系統(tǒng)初始化的時(shí)候, 將數(shù)據(jù)庫連接作為對(duì)象存儲(chǔ)在內(nèi)存中, 當(dāng)用戶需要訪問數(shù)據(jù)庫時(shí), 并非建立一個(gè)新的連接, 而是從連接池中取出一個(gè)已建立的空閑連接對(duì)象。使用完畢后, 用戶也并非將連接關(guān)閉, 而是將連接放回連接池中, 以供下一個(gè)請(qǐng)求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時(shí), 還可以通過設(shè)置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個(gè)連接的最大使用次數(shù)、最大空閑時(shí)間等等。也可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。
4. 在Java中常用的開源的數(shù)據(jù)庫連接池有以下幾種
4.1. C3P0: 是一個(gè)開放源代碼的JDBC連接池, 包括了實(shí)現(xiàn)jdbc3和jdbc2擴(kuò)展規(guī)范說明的Connection和Statement池的DataSources 對(duì)象。
4.2. Proxool: 是一個(gè)Java SQL Driver驅(qū)動(dòng)程序, 提供了對(duì)選擇的其它類型的驅(qū)動(dòng)程序的連接池封裝。可以非常簡(jiǎn)單的移植到現(xiàn)存的代碼中, 完全可配置, 快速、成熟、健壯。可以透明地為現(xiàn)存的JDBC驅(qū)動(dòng)程序增加連接池功能。
4.3. Jakarta DBCP: DBCP是一個(gè)依賴Jakartacommons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫連接池。DBCP可以直接的在應(yīng)用程序中使用。
4.4. 目前Proxool和DBCP以及C3P0一起, 最為常見的三種JDBC連接池技術(shù)。
4.5. 后來, Hibernate官方宣布由于Bug太多不再支持DBCP, 而推薦使用C3P0或Proxool。
5. 自己實(shí)現(xiàn)Java的數(shù)據(jù)庫連接池接口(DataSource)
5.1. 創(chuàng)建一個(gè)名稱為SunDataSource的Java工程, 使用之前的JDBCUtil.java和jdbc.properties屬性文件
5.2. 創(chuàng)建一個(gè)MyDataSource.java實(shí)現(xiàn)Java的DataSource接口
package com.lywgames.myjdbc;import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import javax.sql.DataSource; import com.lywgames.util.JDBCUtil;/*** 實(shí)現(xiàn)java的DataSource接口*/ public class MyDataSource implements DataSource {private List<Connection> list = new ArrayList<Connection>();/*** 對(duì)象一創(chuàng)建就創(chuàng)建10個(gè)數(shù)據(jù)庫連接對(duì)象, 放到list對(duì)象*/public MyDataSource() {for (int i = 0; i < 10; i++) {Connection conn = JDBCUtil.getConn();list.add(conn);}}// 該連接池對(duì)外公布的獲取連接的方法@Overridepublic Connection getConnection() throws SQLException {// 發(fā)現(xiàn)連接池的連接數(shù)量為0, 自動(dòng)擴(kuò)容if(list.size() == 0) {for (int i = 0; i < 10; i++) {Connection conn = JDBCUtil.getConn();list.add(conn);}}return list.remove(0);}/*** 歸還數(shù)據(jù)庫連接對(duì)象* @param conn*/public void backConnection(Connection conn) {System.out.println("歸還連接前, 連接數(shù):" + list.size());list.add(conn);System.out.println("歸還連接后, 連接數(shù):" + list.size());}@Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}@Overridepublic void setLogWriter(PrintWriter arg0) throws SQLException {}@Overridepublic void setLoginTimeout(int arg0) throws SQLException {}@Overridepublic boolean isWrapperFor(Class<?> arg0) throws SQLException {return false;}@Overridepublic <T> T unwrap(Class<T> arg0) throws SQLException {return null;}}5.3. 使用MyDataSource
package com.lywgames.myjdbc;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; import com.lywgames.util.JDBCUtil;public class MyJDBC {public static void main(String[] args) {Connection conn = null;PreparedStatement ps = null;// 創(chuàng)建自己的連接池對(duì)象MyDataSource ds = new MyDataSource();try {conn = ds.getConnection();ps = conn.prepareStatement("insert into user values(null,?,?,?)");ps.setString(1, "lvbu");ps.setString(2, "123456");ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.release(ps);}// 歸還連接ds.backConnection(conn);} }5.4. 運(yùn)行程序, 查看結(jié)果
6. 對(duì)連接進(jìn)行包裝
6.1. 創(chuàng)建一個(gè)名稱為MyDataSourceConnectionWrap的Java工程, 使用之前的JDBCUtil.java和jdbc.properties屬性文件
6.2. 創(chuàng)建一個(gè)ConnectionWrap.java實(shí)現(xiàn)Connection接口
package com.lywgames.myjdbc;import java.sql.Array; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.NClob; import java.sql.PreparedStatement; import java.sql.SQLClientInfoException; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.SQLXML; import java.sql.Savepoint; import java.sql.Statement; import java.sql.Struct; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executor;/*** 使用使用裝飾者模式, 對(duì)JDBC實(shí)際創(chuàng)建的Connection對(duì)象進(jìn)行包裝*/ public class ConnectionWrap implements Connection {private List<Connection> list;private Connection connection;public ConnectionWrap(Connection connection, List<Connection> list) {this.connection = connection;this.list = list;}// 在Connection對(duì)象的close方法里歸還數(shù)據(jù)庫連接@Overridepublic void close() throws SQLException {System.out.println("調(diào)用close方法歸還連接前: " + list.size());this.list.add(connection);System.out.println("調(diào)用close方法歸還連接后: " + list.size());}@Overridepublic PreparedStatement prepareStatement(String sql) throws SQLException {return connection.prepareStatement(sql);}@Overridepublic PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,int resultSetHoldability) throws SQLException {return null;}@Overridepublic boolean isWrapperFor(Class<?> arg0) throws SQLException {return false;}@Overridepublic <T> T unwrap(Class<T> arg0) throws SQLException {return null;}@Overridepublic void abort(Executor executor) throws SQLException {}@Overridepublic void clearWarnings() throws SQLException {}@Overridepublic void commit() throws SQLException {}@Overridepublic Array createArrayOf(String typeName, Object[] elements) throws SQLException {return null;}@Overridepublic Blob createBlob() throws SQLException {return null;}@Overridepublic Clob createClob() throws SQLException {return null;}@Overridepublic NClob createNClob() throws SQLException {return null;}@Overridepublic SQLXML createSQLXML() throws SQLException {return null;}@Overridepublic Statement createStatement() throws SQLException {return null;}@Overridepublic Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {return null;}@Overridepublic Struct createStruct(String typeName, Object[] attributes) throws SQLException {return null;}@Overridepublic boolean getAutoCommit() throws SQLException {return false;}@Overridepublic String getCatalog() throws SQLException {return null;}@Overridepublic Properties getClientInfo() throws SQLException {return null;}@Overridepublic String getClientInfo(String name) throws SQLException {return null;}@Overridepublic int getHoldability() throws SQLException {return 0;}@Overridepublic DatabaseMetaData getMetaData() throws SQLException {return null;}@Overridepublic int getNetworkTimeout() throws SQLException {return 0;}@Overridepublic String getSchema() throws SQLException {return null;}@Overridepublic int getTransactionIsolation() throws SQLException {return 0;}@Overridepublic Map<String, Class<?>> getTypeMap() throws SQLException {return null;}@Overridepublic SQLWarning getWarnings() throws SQLException {return null;}@Overridepublic boolean isClosed() throws SQLException {return false;}@Overridepublic boolean isReadOnly() throws SQLException {return false;}@Overridepublic boolean isValid(int timeout) throws SQLException {return false;}@Overridepublic String nativeSQL(String sql) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,int resultSetHoldability) throws SQLException {return null;}@Overridepublic void releaseSavepoint(Savepoint savepoint) throws SQLException {}@Overridepublic void rollback() throws SQLException {}@Overridepublic void rollback(Savepoint savepoint) throws SQLException {}@Overridepublic void setAutoCommit(boolean autoCommit) throws SQLException {}@Overridepublic void setCatalog(String catalog) throws SQLException {}@Overridepublic void setClientInfo(Properties properties) throws SQLClientInfoException {}@Overridepublic void setClientInfo(String name, String value) throws SQLClientInfoException {}@Overridepublic void setHoldability(int holdability) throws SQLException {}@Overridepublic void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {}@Overridepublic void setReadOnly(boolean readOnly) throws SQLException {}@Overridepublic Savepoint setSavepoint() throws SQLException {return null;}@Overridepublic Savepoint setSavepoint(String name) throws SQLException {return null;}@Overridepublic void setSchema(String schema) throws SQLException {}@Overridepublic void setTransactionIsolation(int level) throws SQLException {}@Overridepublic void setTypeMap(Map<String, Class<?>> map) throws SQLException {}}6.3. 創(chuàng)建一個(gè)MyDataSource.java實(shí)現(xiàn)DataSource接口
package com.lywgames.myjdbc;import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import javax.sql.DataSource; import com.lywgames.util.JDBCUtil;/*** 實(shí)現(xiàn)java的DataSource接口*/ public class MyDataSource implements DataSource {private List<Connection> list = new ArrayList<Connection>();/*** 對(duì)象一創(chuàng)建就創(chuàng)建10個(gè)數(shù)據(jù)庫連接對(duì)象, 放到list對(duì)象*/public MyDataSource() {for (int i = 0; i < 10; i++) {list.add(JDBCUtil.getConn());}}// 該連接池對(duì)外公布的獲取連接的方法@Overridepublic Connection getConnection() throws SQLException {// 發(fā)現(xiàn)連接池的連接數(shù)量為0, 自動(dòng)擴(kuò)容if(list.size() == 0) {for (int i = 0; i < 10; i++) {list.add(JDBCUtil.getConn());}}// 對(duì)之前的Connection對(duì)象進(jìn)行包裝Connection connectionWrap = new ConnectionWrap(list.remove(0), list);return connectionWrap;}@Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}@Overridepublic void setLogWriter(PrintWriter arg0) throws SQLException {}@Overridepublic void setLoginTimeout(int arg0) throws SQLException {}@Overridepublic boolean isWrapperFor(Class<?> arg0) throws SQLException {return false;}@Overridepublic <T> T unwrap(Class<T> arg0) throws SQLException {return null;}}6.4. 使用MyDataSource
package com.lywgames.myjdbc;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; import com.lywgames.util.JDBCUtil;public class MyJDBC {public static void main(String[] args) {Connection conn = null;PreparedStatement ps = null;// 創(chuàng)建自己的連接池對(duì)象MyDataSource ds = new MyDataSource();try {conn = ds.getConnection();ps = conn.prepareStatement("insert into user values(null,?,?,?)");ps.setString(1, "diaochan");ps.setString(2, "123456");ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.release(conn, ps);}} }6.5. 運(yùn)行程序, 查看結(jié)果
總結(jié)
以上是生活随笔為你收集整理的033_jdbc-mysql数据库连接池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 030_jdbc-mysql事务
- 下一篇: 034_jdbc-mysql-C3P0