快速业务通道

使用JAVA中的动态代理实现数据库连接池 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

使用JAVA中的动态代理实现数据库连接池

时间:2010-12-14 IBM 刘冬

数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据 库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以 在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问 题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的 连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解, 毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外 一个共同的问题是,它们同时不允许使用者显式的调用Connection.close()方法 ,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:

第一:改变了用户使用习惯,增加了用户的使用难度。

首先我们来看看一个正常的数据库操作过程:

int executeSQL(String sql) throws SQLException { Connection conn = getConnection(); //通过某种方式获取数据库连接 PreparedStatement ps = null; int res = 0; try{ ps = conn.prepareStatement(sql); res = ps.executeUpdate(); }finally{ try{ ps.close(); }catch(Exception e){} try{ conn.close();// }catch(Exception e){} } return res; }

使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资 源,如果用我们前面提到的连接池的实现方法,那语句conn.close()将被某些特 定的语句所替代。

第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用 户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关 闭了数据库连接,那么连接池将无法正常维护所有连接的状态,考虑连接池和应 用由不同开发人员实现时这种问题更容易出现。

综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。

首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的 。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标 准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进 行任意的操作,包括关闭连接等。

通过对用户使用的描述,怎样可以接管Connection.close方法就成了我们这 篇文章的主题。

为了接管数据库连接的close方法,我们应该有一种类似于钩子的机制。例如 在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在 JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个 InvocationHandler,这两个类都在java.lang.reflect包中。我们先来看看SUN 公司提供的文档是怎么描述这两个类的。

public interface InvocationHandler InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler.

使用JAVA中的动态代理实现数据库连接池(2)

时间:2010-12-14 IBM 刘冬

SUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口 InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发 Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态 代理机制只能接管接口的方法,而对一般的类无效,考虑到 java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法的 出路。

首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程 序类名,连接的URL以及用户名口令等等一些信息,该类是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号