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个连接
分享到:
相关推荐
46.请写一个java程序实现数据库连接池功能? 用一个自己的类实现Connection接口太麻烦! 主要是连接(Connection)的close()方法,从连接池得到的是一个代理对象,过滤Connection的close()方法。你还能找到其他方法...
简易高效的代理池,提供如下功能: 1. 定时抓取免费代理网站,简易可扩展 2. 使用 Redis 对代理进行存储并对代理可用性进行排序 3. 定时测试和筛选,剔除不可用代理,留下可用代理 4. 提供代理 API,随机取用测试...
支持数据库连接池,能够有效解决PHP带来的数据库连接瓶颈 支持SQL92标准 遵守Mysql原生协议,跨语言,跨平台的通用中间件代理。 支持多个数据库连接,多个数据库,多个用户,灵活搭配。 支持mysql事物 采用协程...
设置Proxy Server和SQL Server实现互联网上数据库的安全
JAVA动态代理,采用Proxy与InvocationHandler实现。
动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy
JDK动态代理proxy的基本工作原理代码!!
proxy_pool代理池 安装爬虫代理ip,使用proxy_pool代理池可以获取IP
proxool-0.9.1(my).jar 包是我修改了proxool-0.9.1后的jar包,修改后可以完全支持spring配置,并添加了charSet配置属性,用于配置数据库链接的设置默认字符集,并且解决了proxool数据库连接池报如下错误的问题:...
使用Proxy创建代理服务器,使用Proxy创建代理服务器
自己开发的一个数据库连接池,包含代码,在oracle测试了一下,请各位对代码指正。 使用的方法如下: 1.在工程里面加入以下jar文件:mydatasource.jar,dom4j.jar,ojdbc14.jar 2.在工程目录任意位置放入连接池配置文件...
1. 首先完成一个接口的创建(里面有真正的想要实现的方法): public interface UserDAO{ public void add (); //想要实现的方法 } 2. 写一个真实的主题类实现...3. 写一个动态的代理类实现InvocationHandler接口:
为您提供SMProxy MySQL数据库连接池下载,SMProxy(Swoole MySQL Proxy)一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。原理:将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接...
MySQL Proxy 实现负载均衡测试 MySQL Proxy 实现负载均衡测试
Pool Proxy - redis连接池代理工具
proxy代理,通过代理连接网络。更方便连接网络。
Nginx在vhost里的配置站点,通过proxy转发到动态域名的具体配置。 反向代理,动态域名 ,Proxy
NULL 博文链接:https://cn-done.iteye.com/blog/1743191
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
用delphi编写设计一款自己的代理服务器软件,实现思路:当前流行的浏览器的系统选项中有一个参数,即“通过代理服务器连接”,经过编程测试,当局域网中一台工作站指定了该属性,再发出Internet请求时,请求数据将...