最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-09 15:46:13
文档

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

通过动态代理(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
推荐度:
导读通过动态代理(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.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个连接

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

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

通过动态代理(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
推荐度:
标签: 创建 代理 连接
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top