ホームページ >データベース >mysql チュートリアル >通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的
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; //这是通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作 public class JdbcPoolProxy implements DataSource { // 创建连接池 private static LinkedList<Connection> connections = new LinkedList<Connection>(); static { // 获取properties的配置文件,并以流的方式存储 InputStream inputStream = JdbcPoolProxy.class.getClassLoader() .getResourceAsStream("jdbc.properties"); // 创建properties的属性处理对象 Properties properties = new Properties(); try { // 将属性文件载入 properties.load(inputStream); // 获取连接的驱动文件 Class.forName(properties.getProperty("driverClassName")); // 循环创建连接并放入连接池 for (int i = 0; i < 10; i++) { // 创建连接对象 final Connection conn = DriverManager.getConnection( properties.getProperty("url"), properties.getProperty("user"), properties.getProperty("pass")); // 将创建分连接对象添加到连接池 // 通过动态代理处理close的方法实现取出的连接对象返回连接池的效果 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 { // 判断当前执行的方法名是不是close时还执行自己的方法体 if (!method.getName().equals("close")) { // 执行目标方法 return method.invoke(conn, args); } // 如果是close方法 // 向连接池中添加连接对象 connections.add(conn); System.out.println("又一个连接用玩完了,返回个连接池,当前连接池有" + connections.size() + "个连接对象"); return null; } })); System.out.println("线连接池添加了一个链接对象,当前连接池有======" + connections.size() + "=====个连接对象"); } } 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 { // 声明连接对象 Connection conn = null; // 判断连接池中是否有连接对象 if (connections.size() > 0) { // 从连接池取出连接对象 conn = connections.removeFirst(); System.out.println("有一个连接对象被占用,连接池还有=========" + connections.size() + "个连接"); } 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> T unwrap(Class<T> 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 { // 创建连接池对象 JdbcPoolProxy jdbcPoolProxy = new JdbcPoolProxy(); // 从连接池中取出连接 jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); Connection conn = jdbcPoolProxy.getConnection(); conn.close(); jdbcPoolProxy.getConnection(); jdbcPoolProxy.getConnection(); } }
下面是运行结果
线连接池添加了一个链接对象,当前连接池有======1=====个连接对象 线连接池添加了一个链接对象,当前连接池有======2=====个连接对象 线连接池添加了一个链接对象,当前连接池有======3=====个连接对象 线连接池添加了一个链接对象,当前连接池有======4=====个连接对象 线连接池添加了一个链接对象,当前连接池有======5=====个连接对象 线连接池添加了一个链接对象,当前连接池有======6=====个连接对象 线连接池添加了一个链接对象,当前连接池有======7=====个连接对象 线连接池添加了一个链接对象,当前连接池有======8=====个连接对象 线连接池添加了一个链接对象,当前连接池有======9=====个连接对象 线连接池添加了一个链接对象,当前连接池有======10=====个连接对象 有一个连接对象被占用,连接池还有=========9个连接 有一个连接对象被占用,连接池还有=========8个连接 有一个连接对象被占用,连接池还有=========7个连接 有一个连接对象被占用,连接池还有=========6个连接 有一个连接对象被占用,连接池还有=========5个连接 又一个连接用玩完了,返回个连接池,当前连接池有6个连接对象 有一个连接对象被占用,连接池还有=========5个连接 有一个连接对象被占用,连接池还有=========4个连接