首页 > 代码库 > 动态代理写connection连接池Demo
动态代理写connection连接池Demo
1 public class JdbcUtil2 { 2 //声明连接池<放到LinkedList中,操作其中对象的速度快 只需要改变连接> 3 private static LinkedList<Connection> connectionspool=new LinkedList<Connection>(); 4 //静态代码块 5 static{ 6 try { 7 String url="jdbc:mysql://localhost:3306/jdbcdb"; 8 String user="root"; 9 String password="mysql";10 Class.forName("com.mysql.jdbc.Driver");11 //创建3个连接并将它们代理12 for(int i=0;i<3;i++)13 {14 final Connection conn=DriverManager.getConnection(url, user, password);15 //对conn进行代理16 Object proxyobj= Proxy.newProxyInstance(17 JdbcUtil2.class.getClassLoader(), 18 new Class[]{Connection.class},19 new InvocationHandler() { 20 public Object invoke(Object proxy, Method method, Object[] args)21 throws Throwable {22 //是否是close方法23 if(method.getName().equals("close"))24 {25 synchronized(connectionspool){26 connectionspool.addLast((Connection)proxy);27 connectionspool.notify();28 }29 return null;//如果调用的是close()方法,不会调用代理类的方法,会调用代理30 }31 return method.invoke(conn, args);32 }33 });34 35 connectionspool.add((Connection)proxyobj);36 37 }38 } catch (SQLException e) {39 // TODO Auto-generated catch block40 e.printStackTrace();41 } catch (ClassNotFoundException e) {42 // TODO Auto-generated catch block43 e.printStackTrace();44 } 45 }46 47 48 public static Connection getConnection()49 {50 synchronized(connectionspool)51 {52 if(connectionspool.size()==0)53 {54 try {55 connectionspool.wait();56 } catch (InterruptedException e) {57 // TODO Auto-generated catch block58 e.printStackTrace();59 }60 return getConnection();61 }62 else {63 Connection conn=connectionspool.removeFirst();64 System.err.println("pool中还有连接数:"+connectionspool.size());65 return conn;66 }67 }68 } 69 }
利用多线程测试代理连接池
1 public class TestProxy { 2 public static void main(String[] args) { 3 for(int i=0;i<3000;i++) 4 { 5 new MyThread().start(); 6 } 7 } 8 } 9 10 class MyThread extends Thread11 {12 @Override13 public void run() {14 Connection con = null;15 try{16 con = JdbcUtil2.getConnection();17 System.err.println(this.getName()+","+con);18 con.setAutoCommit(false);//设置事务的开始19 String sql = "insert into users values(‘"+this.getName()+"‘,‘Tom‘,‘44‘)";20 Statement st = con.createStatement();21 st.execute(sql);22 con.commit();23 System.err.println(this.getName()+"子线程执行完成。。。。。");24 }catch(Exception e){25 e.printStackTrace();26 }finally{27 try {28 con.setAutoCommit(true);29 con.close();30 } catch (SQLException e) {31 e.printStackTrace();32 }33 }34 }35 }
动态代理写connection连接池Demo
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。