通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
2014-01-04 22:37
936 查看
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个连接
相关文章推荐
- 通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
- 通过代理类实现java连接数据库(使用dao层操作数据)实例分享
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- SQL Server Mobile 学习(二):通过 VS2005 创建和连接及操作 SQL Server Mobile 数据库
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。
- python sqlite3 连接到数据库,创建表,INSERT 、SELECT、UPDATE 、DELETE等简单操作
- JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
- 《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》2
- 2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理
- 通过VS中的数据源选择对话框简单实现数据库连接配置[图]
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- 用动态代理实现用AOP对数据库进行操作
- 同过增强Connection类[重写了close的方法]实现的从连接池取出连接并放回连接的简单的实现流程
- 通过VS中的数据源选择对话框简单实现数据库连接配置
- 通过dbcp连接池连接数据库的操作
- Hibernate动态建表,通过hbm.xml配置文件创建数据表,进行数据库操作, 动态模型
- Java动态代理连接数据库,模拟连接池
- Hibernate动态建表,通过hbm.xml配置文件创建数据表,进行数据库操作, 动态模型