大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> 用连接池提高Servlet访问数据库的效率(2)

用连接池提高Servlet访问数据库的效率(2)

时间: 2021-07-31 作者:daque

三、类dbconnectionpool证明该类在209至345行实行,它表白指向某个数据库的贯穿池。数据库由jdbc url标识。一个jdbc url由三局部构成:和议标识(老是jdbc),启动步调标识(如 odbc、idb、oracle等),数据库标识(其方法依附于启动步调)。比方,jdbc:odbc:demo,即是一个指向demo数据库的jdbc url,并且考察该数据库要运用jdbc-odbc启动步调。每个贯穿池都有一个供存户步调运用的名字以及可选的用户帐号、暗号、最大贯穿数控制。即使web运用步调所扶助的某些数据库操纵不妨被一切用户实行,而其它少许操纵应由更加承诺的用户实行,则不妨为两类操纵辨别设置贯穿池,两个贯穿池运用沟通的jdbc url,但运用各别的帐号和暗号。类dbconnectionpool的建构因变量须要上述一切数据动作其参数。如222至238行所示,那些数据被生存为它的范例变量:如252至283行、285至305行所示, 存户步调不妨运用dbconnectionpool类供给的两个本领获得可用贯穿。两者的共通之处在乎:如贯穿池中生存可用贯穿,则径直归来,要不创造新的贯穿并归来。即使没有可用贯穿且已有贯穿总额即是最大控制数,第一个本领将径直归来null,而第二个本领将等候直到有可用贯穿为止。一切的可用贯穿东西均备案在名为freeconnections的向量(vector)中。即使向量中有多于一个的贯穿,getconnection()老是采用第一个。同声,因为新的可用贯穿老是从尾部介入向量,进而使得数据库贯穿因为长功夫弃置而被封闭的危害减低到最小水平。第一个getconnection()在归来可用贯穿给存户步调之前,挪用了isclosed()本领考证贯穿保持灵验。即使该贯穿被封闭或触发特殊,getconnection()递归地挪用本人以试验获得其余的可用贯穿。即使在向量freeconnections中不生存任何可用贯穿,getconnection()本领查看能否仍旧指定最大贯穿数控制。如仍旧指定,则查看暂时贯穿数能否仍旧达到极限。此处maxconn为0表白没有控制。即使没有指定最大贯穿数控制或暂时贯穿数小于该值,该本领试验创造新的贯穿。如创造胜利,则减少已运用贯穿的计数并归来,要不归来空值。如325至345行所示,创造新贯穿由newconnection()本领实行。创造进程与能否仍旧指定命据库帐号、暗号相关。jdbc的drivermanager类供给多个getconnection()本领,那些本领要用到jdbc url与其它少许参数,如用户帐号和暗号等。drivermanager将运用指定的jdbc url决定符合于目的数据库的启动步调及创造贯穿。在285至305行实行的第二个getconnection()本领须要一个以毫秒为单元的功夫参数,该参数表白存户步调不妨等候的最长功夫。创造贯穿的简直操纵保持由第一个getconnection()本领实行。该本领实行时先将starttime初始化为暂时功夫。在while轮回中试验赢得一个贯穿。即使波折,则以给定的功夫值为参数挪用wait()。wait()的归来大概是因为其它线程挪用notify()或notifyall(),也大概是因为预订功夫已到。为找到wait()归来的真实因为,步调用暂时功夫减发端功夫(starttime),如差值大于预订功夫则归来空值,要不再次挪用getconnection()。把清闲的贯穿备案到贯穿池由240至250行的freeconnection()本领实行,它的参数为归来给贯穿池的贯穿东西。该东西被介入到freeconnections向量的结束,而后缩小已运用贯穿计数。挪用notifyall()是为了报告其它正在等候可用贯穿的线程。很多servlet引擎为实行安定封闭供给多种本领。数据库贯穿池须要领会该事变以保护一切贯穿不妨平常封闭。dbconnectionmanager类负协安排个封闭进程,但封闭贯穿池中一切贯穿的工作则由dbconnectionpool类控制。在307至323行实行的release()本领供dbconnectionmanager挪用。该本领遍历freeconnections向量并封闭一切贯穿,而后从向量中简略那些贯穿。四、类dbconnectionmanager 证明该类只能创造一个范例,其它东西不妨挪用其静态本领(也称为类本领)赢得该独一范例的援用。如031至036行所示,dbconnectionmanager类的建构因变量是独占的,这是为了制止其它东西创造该类的范例。dbconnectionmanager类的存户步调不妨挪用getinstance()本领赢得对该类独一范例的援用。如018至029行所示,类的独一范例在getinstance()本领第一次被挪用功夫创造,尔后其援用就从来生存在静态变量instance中。历次挪用getinstance()都减少一个dbconnectionmanager的存户步调计数。即,该计数代办援用dbconnectionmanager独一范例的存户步调总额,它将被用来遏制贯穿池的封闭操纵。该类范例的初始化处事由146至168行之间的独占本领init()实行。个中 getresourceasstream()本领用来定位并翻开外部文献。外部文献的定位本领依附于类承载器的实行。规范的当地类承载器搜索操纵老是发端于类文献地方路途,也不妨探求classpath中证明的路途。db.properties是一个属性文献,它包括设置贯穿池的键-值对。可供设置的公用属性如次:drivers 以空格分割的jdbc启动步调类列表logfile 日记文献的一致路途其它的属性和一定贯穿池关系,其属性名字前应加上贯穿池名字:<poolname>.url 数据库的 jdbc url <poolname>.maxconn 承诺创造的最大贯穿数,0表白没有控制 <poolname>.user 用来该贯穿池的数据库帐号<poolname>.password 相映的暗号个中url属性是必定的,而其它属性则是可选的。数据库帐号和暗号必需正当。用来windows平台的db.properties文献示比方下:drivers=sun.jdbc.odbc.jdbcodbcdriver jdbc.idbdriverlogfile=d:\\user\\src\\java\\dbconnectionmanager\\log.txtidb.url=jdbc:idb:c:\\local\\javawebserver1.1\\db\\db.prpidb.maxconn=2access.url=jdbc:odbc:demoaccess.user=demoaccess.password=demopw提防在windows路途中的反斜杠必需输出2个,这是因为属性文献中的反斜杠同声也是一个转义字符。init()本领在创造属性东西并读取db.properties文献之后,就发端查看logfile属性。即使属性文献中没有指定日记文献,则默许为暂时目次下的dbconnectionmanager.log文献。如日记文献没辙运用,则向system.err输入日记记载。承载和备案一切在drivers属性中指定的jdbc启动步调由170至192行之间的loaddrivers()本领实行。该本领先用stringtokenizer将drivers属性值分隔为对应于启动步调称呼的字符串,而后顺序承载那些类并创造本来例,结果在 drivermanager中备案该范例并把它介入到一个独占的向量drivers。向量drivers将用来封闭效劳时从drivermanager废除一切jdbc 启动步调的备案。init()本领的结果一个工作是挪用独占本领createpools()创造贯穿池东西。如109至142行所示,createpools()本领先创造一切属性名字的列举东西(即enumeration东西,该东西不妨设想为一个元素系列,逐级挪用其nextelement()本领将程序归来各元素),而后在个中探求名字以“.url”结果的属性。对于每一个适合前提的属性,先索取其贯穿池名字局部,从而读取一切属于该贯穿池的属性,结果创造贯穿池东西并把它生存在范例变量pools中。散列表(hashtable类 )pools实行贯穿池名字到贯穿池东西之间的映照,此处以贯穿池名字为键,贯穿池东西为值。为便于存户步调从指定贯穿池赢得可用贯穿或将贯穿归来给贯穿池,类dbconnectionmanager供给了本领getconnection()和freeconnection()。一切那些本领都诉求在参数中指定贯穿池名字,简直的贯穿获得或归来操纵则挪用对应的贯穿池东西实行。它们的实行辨别在051至064行、066至080行、038至049行。如082至107行所示,为实行贯穿池的安定封闭,dbconnectionmanager供给了本领release()。在上头咱们仍旧提到,一切dbconnectionmanager的存户步调都该当挪用静态本领getinstance()以赢得该处置器的援用,此挪用将减少存户步调计数。存户步调在封闭时挪用release()不妨减产该计数。当结果一个存户步调挪用release(),减产后的援用计数为0,就不妨挪用各个贯穿池的release()本领封闭一切贯穿了。处置类release()本领结果的工作是废除一切jdbc启动步调的备案。五、servlet运用贯穿池示例servlet api所设置的servlet人命周期类如:1) 创造并初始化servlet(init()本领)。2) 相应存户步调的效劳乞求(service()本领)。3) servlet中断运转,开释一切资源(destroy()本领)。本例演练贯穿池运用,上述要害办法中的关系操动作:1) 在init(),用范例变量connmgr 生存挪用dbconnectionmanager.getinstance()所归来的援用。2) 在service(),挪用getconnection(),实行数据库操纵,用freeconnection()将贯穿归来给贯穿池。3) 在destroy(),挪用release()封闭一切贯穿,开释一切资源。示例步调清单如次:import java.io.*;import java.sql.*;import javax.servlet.*;import javax.servlet.http.*;public class testservlet extends httpservlet {private dbconnectionmanager connmgr;public void init(servletconfig conf) throws servletexception {super.init(conf);connmgr = dbconnectionmanager.getinstance();}public void service(httpservletrequest req, httpservletresponse res) throws ioexception {res.setcontenttype("text/html");printwriter out = res.getwriter();connection con = connmgr.getconnection("idb");if (con == null) {out.println("不许获得数据库贯穿.");return;}resultset rs = null;resultsetmetadata md = null;statement stmt = null;try {stmt = con.createstatement();rs = stmt.executequery("select * from employee");md = rs.getmetadata();out.println("<h1>员工数据</h1>");while (rs.next()) {out.println("<br>");for (int i = 1; i < md.getcolumncount(); i++) {out.print(rs.getstring(i) + ", ");}}stmt.close();rs.close();}catch (sqlexception e) {e.printstacktrace(out);}connmgr.freeconnection("idb", con);}public void destroy() {connmgr.release();super.destroy();}}

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.