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

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

ID:51698691

大小:58.50 KB

页数:10页

时间:2020-03-15

使用JAVA中的动态代理实现数据库连接池.doc_第1页
使用JAVA中的动态代理实现数据库连接池.doc_第2页
使用JAVA中的动态代理实现数据库连接池.doc_第3页
使用JAVA中的动态代理实现数据库连接池.doc_第4页
使用JAVA中的动态代理实现数据库连接池.doc_第5页
资源描述:

《使用JAVA中的动态代理实现数据库连接池.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

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

2、.close()方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:第一:改变了用户使用习惯,增加了用户的使用难度。首先我们来看看一个正常的数据库操作过程:intexecuteSQL(Stringsql)throwsSQLException{Connectionconn=getConnection();//通过某种方式获取数据库连接PreparedStatementps=null;intres=0;try{ps=conn.prepareStatement(sql);res=ps.executeUpdate()

3、;}finally{try{ps.close();}catch(Exceptione){}try{conn.close();//}catch(Exceptione){}}returnres;}使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句conn.close()将被某些特定的语句所替代。第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,那么连

4、接池将无法正常维护所有连接的状态,考虑连接池和应用由不同开发人员实现时这种问题更容易出现。综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进行任意的操作,包括关闭连接等。通过对用户使用的描述,怎样可以接管Connection.close方法就成了我们这篇文章的主题。为了接管数据库连接的

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

6、ionhandlerofaproxyinstance.Eachproxyinstancehasanassociatedinvocationhandler.Whenamethodisinvokedonaproxyinstance,themethodinvocationisencodedanddispatchedtotheinvokemethodofitsinvocationhandler.SUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调

7、用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法,而对一般的类无效,考虑到java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法的出路。首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下:publicclassConnectionParamimplementsSeri

8、alizable{privateStringdriver;//数据库驱动程序privateStringurl;//数据连接的URLprivateStringuser;//数据库用户名privateStringpassword;//数据库密码privateintminConnection=0;//初始化连接数privateintma

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。