通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的
程序员文章站
2022-03-25 08:37:09
...
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下面是测试代码connections = new LinkedList (); 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 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 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 { // 创建连接池对象 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个连接
上一篇: 浅谈php提交form表单_php技巧
下一篇: 浅谈Jquery的noty弹框应用