视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的
2020-11-09 15:46:13 责编:小采
文档

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

下载本文
显示全文
专题