代理写标准连接池

 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");
10             String url="jdbc:mysql://localhost:3306/jdbcdb";
11             for(int i=0;i<3;i++)
12             {
13                 final Connection conn =DriverManager.getConnection(url,"root","mysql");
14
15                 Object ProxyedConn=    Proxy.newProxyInstance(
16                         MyConn.class.getClassLoader(), //类加载器
17                         new Class[]{Connection.class}, //被代理类的父接口
18                         new InvocationHandler() {    //句柄,获取代理类的方法
19                             public Object invoke(Object proxyedConnection, Method method, Object[] args)
20                                     throws Throwable {
21
22                                     if(method.getName().equals("close"))
23                                     {
24                                         synchronized (pool) {
25                                             pool.addLast((Connection)proxyedConnection);
26                                             pool.notify();
27                                         }
28                                         return null;
29                                     }
30                                     //目标方法的返回值
31                                 Object returnValue=method.invoke(conn, args);//conn,你要代理的对象
32                                 return returnValue;
33                             }
34                         });
35
36                 pool.add((Connection)ProxyedConn);
37             }
38         } catch (Exception e) {
39             e.printStackTrace();
40         }
41     }
42
43     public Connection getConnection() throws SQLException {
44
45         synchronized (pool) {
46             if(pool.size()==0)//池中是否还有连接,如果没有等待
47             {
48                 try {
49                     pool.wait();
50                 } catch (InterruptedException e) {
51                     e.printStackTrace();
52                 }
53                 return getConnection();//递归
54             }
55
56             Connection conn= pool.removeFirst();//移除第一个
57             return conn;
58         }
59
60     }

时间: 2024-11-05 17:27:20

代理写标准连接池的相关文章

动态代理写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/jdbcd

我用LinkedBlockingQueue写的连接池

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

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

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

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

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

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

JDBC之 连接池

JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力,为了解决这种现象,一种技术出现了,这就是数据库连接池. 什么是数据库连接池(原理) 所谓数据库连接池,可以看作 :在用户和数据库之间创建一个”池”,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库.一旦连接池中的连接对象被拿光了,下一个想要操作数据库的用

Java_Web 连接池(1)

对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配﹑释放所造成的问题.为解决我们的问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为数据库连接建立一个"缓冲池".预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从"缓冲池"中取出一个,使用完毕之后再放回去.我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接.更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情

连接池基础

一.事务的特性:事务的隔离级别.1.MySQL查看当前的事务隔离级别:SELECT @@TX_ISOLATION更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 隔离级别 2.事务的隔离级别READ UNCOMMITTED:脏读.不可重复读.虚读都有可能发生.READ COMMITTED:能避免脏读,不可重复读.虚读都有可能发生.REPEATABLE READ:能避免脏读.不可重复读,虚读有可能发生.SERIALIZABLE:能避免脏读.不可重复读.虚读.有

JavaWeb系列之十三(jdbc事务与连接池)

 1.事务:表示一组操作要么都成功,有一个失败,所有操作都会失败. 在mysql要使用事务,就要先开启事务,语句start transaction,提交事务:commit 回滚事务:rollback. 转账: 2.jdbc事务的操作 (1)操作事务的方法 setAutoCommit(boolean autoCommit) 设置事务的提交方式,默认自动提交,设置为fals不会提交 提交事务commit() 回滚事务rollback() 使用jdbc来完成转账 小金跟小李接一千 (2)设置事务的