欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的

程序员文章站 2022-04-03 10:42:24
...

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个连接