动态代理写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 block
40             e.printStackTrace();
41         } catch (ClassNotFoundException e) {
42             // TODO Auto-generated catch block
43             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 block
58                     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 Thread
11 {
12     @Override
13     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 }

时间: 2024-10-13 04:43:30

动态代理写connection连接池Demo的相关文章

代理写标准连接池

1 //实现DataSource接口 2 public class MyConn implements DataSource { 3 //声明池管理对象 4 private LinkedList<Connection> pool =new LinkedList<Connection>(); 5 //在构造函数中初始化,创建多个连接 6 public MyConn() 7 { 8 try { 9 Class.forName("com.mysql.jdbc.Driver&qu

黑马day11 动态代理&amp;模拟一个数据库连接池

数据库连接池:说白了就是在一个池子中(容器)中放了很多的数据库连接,当用户需要的时候就从中取出来一个用,用完了就放回连接池中. 优点:极大的提高了数据库的效率. 对于自定义的数据库连接池我们使用一个LinkedList做数据库连接池.这个集合的特点是增删快,查询慢. 自定义一个数据库连接池的步骤: 1.自定义一个类实现DataSource接口. 2.定义一个List<Connection> list=new LinkedList<Connection>();存放数据库连接. 3.初

【设计模式】代理模式实现连接池

1. 连接池 创建Connection的过程是非常耗时的,为了保证Conection可以重用.应该将Connection进行池管理. 使用静态工厂方法管理一个唯一的连接: /** * 用静态工厂方法管理一个唯一的可重用的连接 */ public class ConnUtils { private ConnUtils(){} private static Connection con; //在静态代码块中创建与数据库的连接 static{ try{ Class.forName("com.mysql

我用LinkedBlockingQueue写的连接池

什么是连接池呢? 我们登陆上某个网站,去修改个人信息.点击下单.修改购买商品的数量......当我们做这些操作时候, 我们已经连接上数据库并修改.增加.删除数据库中的数据,完成操作后,关闭连接(避免占用资源). 如果很多人访问这个网站并进行操作,那要创建很多个连接,而且只操作一次就关闭,这会显著的影响系统的 性能.连接池  就为解决这个难题应运而生. 连接池: 在系统初始化的时候,将数据库连接作为对象存放在内存中.当用户要访问数据库时,取出一个连接, 完成操作后归还到池中,等待下个用户使用.连接

hibernate+spring+struts中使用原生态的sql导致oping JDBC connection连接池资源抽光问题

打代码已经有好几个月了. HibernateTemplate hibernateTemplate = getHibernateTemplate();SessionFactory sessionFactory = hibernateTemplate.getSessionFactory(); Session session = sessionFactory.openSession(); Query query = session.createSQLQuery(hql).addEntity(Argum

【58沈剑架构系列】一分钟写好连接池

一.如何通过连接访问下游 工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为: (1)与下游建立一个连接 (2)通过这个连接,收发请求 (3)交互结束,关闭连接,释放资源 这个连接是什么呢,通过连接怎么调用下游接口?服务/数据库/缓存,官方会提供不同语言的Driver.Document.DemoCode来教使用方建立连接与调用接口,以MongoDB的C++官方Driver API为例(伪代码): DBClientConnection* c = new DBClie

dbcp写连接池 Demo

1.导包 2.准备配置文件   .properties(注:这里的参数名driverClassName.url.username等是不能改变的) 不能任意命名的原因是[你懂得] 3.Demo 1 public static DataSource ds;//变量 2 public TestBasicDataSource() {} //私有化构造函数 3 static{ 4 try{ 5 Properties p=new Properties(); 6 p.load(TestBasicDataSou

c3p0写连接池 Demo

1.导包 2.配置文件:名称必须为:c3p0-config.xml,且必须放在src根目录下 1 <c3p0-config> 2 <!-- 默认配置,有且仅可出现一次 ,如果没有指定则使用这个配置 --> 3 <default-config> 4 <!-- 连接超时时间 30秒 --> 5 <property name="checkoutTimeout">30000</property> 6 <!-- 每30

Java进阶学习第十八天——事物与连接池

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.05.13 lutianfei none 事务 事务的概念 事务就是一个事情,组成这个事情可能有多个单元,要求这些单元,要么全都成功,要么全都不成功. 在开发中,有事务的存在,可以保证数据完整性. 例如:A--B转帐,对应于如下两条sql语句 update account set money=money-100 where name='a'; update account set money=money+100 whe