- 浏览: 227140 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
在《深入浅出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。
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的代理实现。那么有没有简单的实现办法呢?这个时候,强大的反射机制又派上用场
了。
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方法,而其他方法的调用则不变。这样的实现就显得十分直观了。
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1264重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1141对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1046在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1326所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1229在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1180在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1290在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1127昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1039昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1530由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1231今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1033为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1128昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 893使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1034这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1002今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 957在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1523昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1582很久没有用 ... -
两天四疑问
2004-09-03 10:56 9939月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
在博客文章“装饰者模式——Decorator”中,作者可能详细讲解了以下几个方面: 1. 装饰者模式的基本概念和原理。 2. 如何通过代码示例展示装饰者模式的实现。 3. 装饰者模式与继承的区别和优势。 4. 装饰者模式在...
这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的核心在于定义一个抽象组件接口(Component),这个接口定义了基本的行为和属性。然后有一个具体的组件类...
【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。
【标题】:“装饰者模式(decorator)在Head First设计模式中的详解” 【内容】: 装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
猴王学艺的过程,就如同我们在编程中逐步增加对象的能力,通过不同的装饰,猴王学会了七十二般变化,这正是Decorator模式的体现——对象在不改变自身的情况下,通过装饰来获得新能力。 在配套代码中,我们可以看到...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) ...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...
在实际的IT开发中,Decorator模式有很多应用场景,比如在数据库连接池(如C3P0、DBCP)中,通过装饰器可以添加连接验证、池化管理等高级特性。在网络通信中,可以使用装饰器来实现数据的压缩、加密等功能,而不改变...
装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...
DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等。
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
### C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) #### 一、背景介绍 在面向对象编程中,设计模式是一种在特定情况下解决问题的标准化方法。其中,装饰模式(Decorator Pattern)作为结构型模式...
装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...