`

体验模式的乐趣(二)—— 连接池与Decorator模式

阅读更多

        在《深入浅出Hibernate》的第一章中,作者讨论了设计一个面向应用的持久层所涉及到的方方面面,其中一个重要的方面就是Connection Pool(连接池)的使用。以JDBC为例,当你需要对数据表中的数据进行操作的时候,你必须通过Driver去建立与Database的 Connection。由于建立Connection的过程的开销是相当可观的,如果仅仅是在执行了几个简单的SQL语句之后,就把Connection 关掉的话,实在太可惜了。为了能够重用建立起来的Connection,减少系统的开销并提供性能,Conneciton Pool就应运而生了。
        通常一个Connection Pool的实现类会有createConnection,getConnection和releaseConnection三个方法。 createConnection负责创建连接,getConnection负责提供连接,而releaseConnection则负责回收连接。在这 里,我无意对Connection Pool的具体实现讲述太多(实际是不太懂,呵呵~~~),还是让我们关注一个很关键的问题吧——如何能够保证Connection Pool中的Connection能够高高兴兴上班去,平平安安回家来呢?也就是如何保证releaseConnection能够顺利回收连接呢?解决这 个问题的关键不在于releaseConnection方法,而是在于Connection本身。我们都知道,一个程序员从Connection Pool中获得的是一个标准的Connection,也就是说程序员仍然会一不小心调用了close方法把Connection关掉,那么 releaseConection方法就形同虚设, 而Connection的重用也就没有办法实现了。该怎样去解决这个问题呢?我们一定会想到的就是将close方法隐藏起来或者改变close方法的行 为。首先Connection是一个interface,那么我们还是得创建一个新的Connection类型以实现这个interface。        

public class NewConnection implements Connection {
  
private Connection conn;
  
private ConnectionPool connPool;   
 
public NewConnection(Connection conn, ConnectionPool connPool) {
       
this.conn = conn;
       
this.connPool = connPool;
   }

  
public void close() throws SQLException {
       connPool.releaseConnection(conn);
   }

    
//实现interface Connection定义的所有接口

  
public void commit() throws SQLException {
       conn.commit();
   }

}


大家会发现,除了close方法之外,其他的方法都是通过调用传入的Connection实例的方法去实现 的。事实上,这里就是使用了Decorator模式。然后修改Connection Pool的实现类中的getConnection方法,返回NewConnection的一个实例即可,而NewConnection的close方法被 调用的时候,就调用Connection Pool的releaseConneciton方法将连接释放到连接池中。
         Decorator模式确实解决了我们的问题,但是NewConnection实现了 Conneciton的接口,因此就得实现Connection定义的所有方法。虽然每个方法的实现都与上面代码中的commit方法一样简单,但是这样 的代码看起来让人觉得冗长而拖沓,毕竟每个方法都是Connection的代理实现。那么有没有简单的实现办法呢?这个时候,强大的反射机制又派上用场 了。

public class ConnectionHandler implements InvocationHandler {
  
private Connection conn;
  
private ConnectionPool connPool;
  
public ConnectionHandler(Conection conn, ConnectionPool connPool) {
      
this.conn = conn;  
       
this.connPool = connPool;
   }

  
public Connection bind() {
      Connection proxyConn 
= (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), this);
      
return proxyConn;
   }

  
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     Object obj 
= null;
     
if ("close".equals(method.getName())) {
           connPool.releaseConnection(conn);
     }
 else {
           obj 
= method.invoke(conn, args);
      }

      
return obj;
   }

 }

ConnectionHandler的实现与NewConnection相比是不是简单得多了呢? ConnectionHandler实际上就是Connection的一个代理,所有对于Connection方法的调用都会被invoke方法截获,如 果是close方法被调用,就会作相应的处理——调用releaseConnection方法,而其他方法的调用则不变。这样的实现就显得十分直观了。

分享到:
评论

相关推荐

    装饰者模式——Decorator

    在博客文章“装饰者模式——Decorator”中,作者可能详细讲解了以下几个方面: 1. 装饰者模式的基本概念和原理。 2. 如何通过代码示例展示装饰者模式的实现。 3. 装饰者模式与继承的区别和优势。 4. 装饰者模式在...

    JAVA设计模式学习12——装饰器模式

    这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的核心在于定义一个抽象组件接口(Component),这个接口定义了基本的行为和属性。然后有一个具体的组件类...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    设计模式——装饰模式

    装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    【标题】:“装饰者模式(decorator)在Head First设计模式中的详解” 【内容】: 装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    大话西游之设计模式_从猴王学艺看Decorator 配套代码

    猴王学艺的过程,就如同我们在编程中逐步增加对象的能力,通过不同的装饰,猴王学会了七十二般变化,这正是Decorator模式的体现——对象在不改变自身的情况下,通过装饰来获得新能力。 在配套代码中,我们可以看到...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    设计模式代码——c#

    8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) ...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    设计模式精解——GoF23中设计模式解析

    ### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...

    Decorator模式的应用

    在实际的IT开发中,Decorator模式有很多应用场景,比如在数据库连接池(如C3P0、DBCP)中,通过装饰器可以添加连接验证、池化管理等高级特性。在网络通信中,可以使用装饰器来实现数据的压缩、加密等功能,而不改变...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    Java精华版 chm Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等

    DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等。

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式)

    ### C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) #### 一、背景介绍 在面向对象编程中,设计模式是一种在特定情况下解决问题的标准化方法。其中,装饰模式(Decorator Pattern)作为结构型模式...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

Global site tag (gtag.js) - Google Analytics