public class JdbcUtil2 {
//声明连接池<放到LinkedList中,操作其中对象的速度快 只需要改变连接>
private static LinkedList<Connection> connectionspool=new LinkedList<Connection>();
//静态代码块
static{
try {
String url="jdbc:mysql://localhost:3306/jdbcdb";
String user="root";
String password="mysql";
Class.forName("com.mysql.jdbc.Driver");
//创建3个连接并将它们代理
for(int i=0;i<3;i++)
{
final Connection conn=DriverManager.getConnection(url, user, password);
//对conn进行代理
Object proxyobj= Proxy.newProxyInstance(
JdbcUtil2.class.getClassLoader(),
new Class[]{Connection.class},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//是否是close方法
if(method.getName().equals("close"))
{
synchronized(connectionspool){
connectionspool.addLast((Connection)proxy);
connectionspool.notify();
}
return null;//如果调用的是close()方法,不会调用代理类的方法,会调用代理
}
return method.invoke(conn, args);
}
}); connectionspool.add((Connection)proxyobj); }
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public static Connection getConnection()
{
synchronized(connectionspool)
{
if(connectionspool.size()==0)
{
try {
connectionspool.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return getConnection();
}
else {
Connection conn=connectionspool.removeFirst();
System.err.println("pool中还有连接数:"+connectionspool.size());
return conn;
}
}
}
}

利用多线程测试代理连接池

 public class TestProxy  {
public static void main(String[] args) {
for(int i=0;i<3000;i++)
{
new MyThread().start();
}
}
} class MyThread extends Thread
{
@Override
public void run() {
Connection con = null;
try{
con = JdbcUtil2.getConnection();
System.err.println(this.getName()+","+con);
con.setAutoCommit(false);//设置事务的开始
String sql = "insert into users values('"+this.getName()+"','Tom','44')";
Statement st = con.createStatement();
st.execute(sql);
con.commit();
System.err.println(this.getName()+"子线程执行完成。。。。。");
}catch(Exception e){
e.printStackTrace();
}finally{
try {
con.setAutoCommit(true);
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

最新文章

  1. Oracle数据库基础知识2
  2. 关于javascript中闭包的理解
  3. delphi 调用百度地图api
  4. css居中完全指南(翻译)
  5. js 事件冒泡是什么如何用jquery阻止事件冒泡
  6. Java集合类之ArrayList
  7. sql语句中的注释符号
  8. Android -- 创建桌面快捷方式
  9. github Top100
  10. 【转】MFC中用CFile读取和写入文件2
  11. Uva 10294 Arif in Dhaka (First Love Part 2)
  12. asp.net实现将网页内容输出到word并下载到本地
  13. C++ new和delete实现原理——new和delete最终调用malloc和free
  14. ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章 ASM instance(1)
  15. Android:关于Edittext的一些设置
  16. PHP DES加密
  17. ecos资源探测器
  18. FPGA学习体会
  19. Ajax 异步加载
  20. 虚拟DOM

热门文章

  1. linux inode已满解决方法
  2. ServerInfo.INI解密
  3. js数组(列表)的基本操作
  4. 【持久化框架】Mybatis与Hibernate的详细对比
  5. Spark Streaming Backpressure分析
  6. Mediator pattern(c++ 实现)
  7. 设定PCB电路板形状和物理边界
  8. PHP Simple HTML DOM 使用
  9. Android 调用图库选择图片实现和参数详解
  10. Remote Desktop Connection Manager 多个远程管理