自己设计一个简单的的Java连接池(二)
来源:互联网 发布:广东网络干部培训学院 编辑:程序博客网 时间:2024/06/06 22:50
上一篇中只是实现了一个连接池的雏形,在本篇,我们将通过动态代理模式,实现一个标准的连接池,通过动态代理,修改了colse()方法,使程序员不能关闭连接,并且主动的归还连接,好了,废话少说,以下为具体代码:
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.util.ArrayList;import java.util.List;public class DbPool2 {//第一步:声明连接池维护所有的连接private static List<Connection> pool = new ArrayList<Connection>();//第二步:静态代码块中创建多个连接static{try{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql:///test?characterEncoding=UTF8";for(int i=0;i<3;i++){final Connection con = DriverManager.getConnection(url,"root","root");//com.mysql.jdbc.Jdbc4Connection@//对con对象进行动态代理Object proxyedCon = Proxy.newProxyInstance(DbPool2.class.getClassLoader(),new Class[]{Connection.class},//声明执行句柄,只对close方法设置拦截new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {if(method.getName().equals("close")){System.err.println("有人想关闭连接,不能关,还连接");//将proxy再加到pool中,这个proxy就是proxyedConsynchronized (pool) {pool.add((Connection) proxy);pool.notify();}return null;}else{System.err.println("放行"+method.getName());return method.invoke(con, args);}}});//一定要将代理对象添加到池中去。pool.add((Connection) proxyedCon);}}catch(Exception e){throw new RuntimeException(e.getMessage(),e);}}/** * 提供一个静态工厂方法返回一个连接 */public static Connection getCon(){synchronized (pool) {if(pool.size()==0){try {pool.wait();} catch (InterruptedException e) {e.printStackTrace();}return getCon();}Connection con = pool.remove(0);//返回一个代理的connection对象System.err.println("还有几个:"+pool.size());return con;}}}
注:此代码为王建老师上课所讲。
- 自己设计一个简单的的Java连接池(二)
- 自己设计一个简单的的Java连接池(一)
- 用简单的驱动,自己写一个连接池
- 自己设计的一个简单高速加密算法
- 如何写一个给自己的框架写一个优雅的Java Config模块(二)
- 一个简单音乐播放器的Java实现(二)
- JAVA二学(一) 一个简单的ImageViewer
- java做一个简单的文件管理器(二)
- 自己写的一个简单的Java GUI源码
- 任务二:设计一个简单的分数类
- 自己用Java编写的连接池
- 自己写的一个简单JAVA网络通讯录
- 一个数据库连接池的简单代码
- 自定义一个简单的连接池
- Redis的一个简单连接池
- 通过java 连接mysql 的一个简单的实例
- 自己写的一个数据库连接池的使用
- java线程池学习(二) —— 实现一个简单的线程池
- C++ 读写MySQL经典
- Window编程常见数据类型及转换
- 【BFS】迷宫寻宝(一)(nyoj-82)
- Android开发必备第三章Service
- Tasks and Back Stack
- 自己设计一个简单的的Java连接池(二)
- android:taskAffinity初识
- 关于一个工程中多个文件的相互调用的学习笔记(C语言)
- 将java文件开头的package路径进行规整,使包路径正确
- Wave音频格式解析
- ANDROID content provide 使用实例
- 10494 - If We Were a Child Again
- SoYoung的YII学习笔记2
- C++ 星号指针定义