package tk.dong.connection.util;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Conn
package tk.dong.connection.util; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.LinkedList; import java.util.Properties; import java.util.logging.Logger; import javax.sql.DataSource; //這是通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的操作 public class JdbcPoolProxy implements DataSource { // 創(chuàng)建連接池 private static LinkedListconnections = new LinkedList (); static { // 獲取properties的配置文件,并以流的方式存儲(chǔ) InputStream inputStream = JdbcPoolProxy.class.getClassLoader() .getResourceAsStream("jdbc.properties"); // 創(chuàng)建properties的屬性處理對(duì)象 Properties properties = new Properties(); try { // 將屬性文件載入 properties.load(inputStream); // 獲取連接的驅(qū)動(dòng)文件 Class.forName(properties.getProperty("driverClassName")); // 循環(huán)創(chuàng)建連接并放入連接池 for (int i = 0; i < 10; i++) { // 創(chuàng)建連接對(duì)象 final Connection conn = DriverManager.getConnection( properties.getProperty("url"), properties.getProperty("user"), properties.getProperty("pass")); // 將創(chuàng)建分連接對(duì)象添加到連接池 // 通過動(dòng)態(tài)代理處理close的方法實(shí)現(xiàn)取出的連接對(duì)象返回連接池的效果 connections.add((Connection) Proxy.newProxyInstance( JdbcPoolProxy.class.getClassLoader(), new Class[] { Connection.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 判斷當(dāng)前執(zhí)行的方法名是不是close時(shí)還執(zhí)行自己的方法體 if (!method.getName().equals("close")) { // 執(zhí)行目標(biāo)方法 return method.invoke(conn, args); } // 如果是close方法 // 向連接池中添加連接對(duì)象 connections.add(conn); System.out.println("又一個(gè)連接用玩完了,返回個(gè)連接池,當(dāng)前連接池有" + connections.size() + "個(gè)連接對(duì)象"); return null; } })); System.out.println("線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======" + connections.size() + "=====個(gè)連接對(duì)象"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public Connection getConnection() throws SQLException { // 聲明連接對(duì)象 Connection conn = null; // 判斷連接池中是否有連接對(duì)象 if (connections.size() > 0) { // 從連接池取出連接對(duì)象 conn = connections.removeFirst(); System.out.println("有一個(gè)連接對(duì)象被占用,連接池還有=========" + connections.size() + "個(gè)連接"); } return conn; } @Override public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } @Override public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { // TODO Auto-generated method stub } @Override public void setLoginTimeout(int seconds) throws SQLException { // TODO Auto-generated method stub } @Override public int getLoginTimeout() throws SQLException { // TODO Auto-generated method stub return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO Auto-generated method stub return null; } @Override public T unwrap(Class iface) throws SQLException { // TODO Auto-generated method stub return null; } @Override public boolean isWrapperFor(Class> iface) throws SQLException { // TODO Auto-generated method stub return false; } }
package tk.dong.connectionPool.test; import java.sql.Connection; import java.sql.SQLException; import org.junit.Test; import tk.dong.connection.util.JdbcPoolProxy; public class JdbcPoolProxyTest { @Test public void test() throws SQLException { // 創(chuàng)建連接池對(duì)象 JdbcPoolProxy jdbcPoolProxy = new JdbcPoolProxy(); // 從連接池中取出連接 jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); Connection conn = jdbcPoolProxy.getConnection(); conn.close(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); } }
下面是運(yùn)行結(jié)果
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======1=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======2=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======3=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======4=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======5=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======6=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======7=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======8=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======9=====個(gè)連接對(duì)象 線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======10=====個(gè)連接對(duì)象 有一個(gè)連接對(duì)象被占用,連接池還有=========9個(gè)連接 有一個(gè)連接對(duì)象被占用,連接池還有=========8個(gè)連接 有一個(gè)連接對(duì)象被占用,連接池還有=========7個(gè)連接 有一個(gè)連接對(duì)象被占用,連接池還有=========6個(gè)連接 有一個(gè)連接對(duì)象被占用,連接池還有=========5個(gè)連接 又一個(gè)連接用玩完了,返回個(gè)連接池,當(dāng)前連接池有6個(gè)連接對(duì)象 有一個(gè)連接對(duì)象被占用,連接池還有=========5個(gè)連接 有一個(gè)連接對(duì)象被占用,連接池還有=========4個(gè)連接
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com