Java数据库连接池_第1页
Java数据库连接池_第2页
Java数据库连接池_第3页
Java数据库连接池_第4页
Java数据库连接池_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java数据库连接池Tomcat6.0Tomcat6.0连接池配置1. 配置tomcat下的conf下的context.xml文件,在之间添加连接池配置 vResource n ame=jdbc/oracleauth=C ontain ertype=javax.sql.DataSource driverClassName=oracle.jdbc.driver.OracleDriver url= jdbc:oracle:th in: host:port:databse user name= user password=passwordmaxActive=100maxldle=30maxWait=

2、10000 /2. 配置你的应用下的 web.xml中的之间加入DB Conn ecti onjdbc/oracle/res-ref- namejavax.sql.DataSourceC ontain er3. 把连接数据库的第三方驱动放到common/lib下面就ok 了4. 测试程序我就不写了1. 配置tomcat下的conf下的server.xml中的host标签中添加连接池配置 :1. vResource n ame=jdbc/sql2. auth=Co ntain er3. type=javax.sql.DataSource4. driverClassName=com.microso

3、ft.jdbc.sqlserver.SQLServerDriver5. url= jdbc:microsoft:sqlserver:/localhost:1433;database name=hrms6. user name=sa7. password=1234568. maxActive=1009. maxldle=3010. maxWait=10000 /2. 配置你的应用下的web.xml中的web-app标签之间加入:1. 2. DB Connection3. jdbc/sql/res-ref- name4. javax.sql.DataSource5. C ontain er6. 3

4、. 把连接数据库的第三方驱动放到common/lib下面就ok 了4. 测试程序我就不写了虽然现在用 APACHE COMMONS DBCP可以非常方便的建立数据库连接池, 但是像这篇文章把数据库连接池的内部原理写的这么透彻,注视这么完整, 真是非常难得,让开发人员可以更深层次的理解数据库连接池,真是非常感 谢这篇文章的作者。import java.sql.C onn ecti on;import java.sql.DatabaseMetaData;import java.sql.Driver;import java.sql.DriverMa nager;import java.sql.SQL

5、Excepti on;import java.sql.Stateme nt;import java.util.E numerati on;import java.util.Vector;public class Connection Pool 数据库驱动private Str ing jdbcDriver = ; /private Stri ng dbUrl = ; /数据URLprivate Stri ng dbUser name = ; /数据库用户名private Str ing dbPassword = ; /数据库用户密码private Stri ng testTable = ; /

6、测试连接是否可用的测试表名,默认没有测试表private int in itialC onn ecti ons = 10; /连接池的初始大小private int in creme ntalC onn ecti ons = 5;/连接池自动增加的大小private int maxC onn ecti ons = 50; /连接池最大的大小private Vector conn ecti ons = n ull; /存放连接池中数据库连接的向量,初始时为 null/它中存放的对象为PooledCo nn ection型/*构造函数* param jdbcDriver String JDBC驱动

7、类串* param dbUrl Str ing数据库URL连接数据库用户名连接数据库用户的密码* param dbUser name String* param dbPassword String*/ public Conn ecti on Pool(Stri ng jdbcDriver,Str ing dbUrl,Str ing dbUser name,Str ing dbPassword) this.jdbcDriver = jdbcDriver;this.dbUrl = dbUrl;this.dbUser name = dbUser name;this.dbPassword = dbPa

8、ssword;/*返回连接池的初始大小* return初始连接池中可获得的连接数量*/ public int get In itialC onn ecti on s() retur n this.i nitialC onn ecti ons;*设置连接池的初始大小* param 用于设置初始连接池中连接的数量*/ public void setI nitialC onn ecti on s(i nt in itialC onn ecti ons) this.i nitialC onn ecti ons = in itialC onn ecti ons;*返回连接池自动增加的大小* return

9、连接池自动增加的大小*/ public int get In creme ntalC onn ecti on s() return this.i ncreme ntalC onn ectio ns;*设置连接池自动增加的大小* param 连接池自动增加的大小*/ public void setl ncreme ntalC onn ectio ns(i nt in creme ntalC onn ectio ns) this.i ncreme ntalC onn ectio ns = in creme ntalC onn ecti ons;*返回连接池中最大的可用连接数量* return连接池

10、中最大的可用连接数量*/ public int getMaxC onn ecti on s() return this.maxC onn ectio ns;/*设置连接池中最大可用的连接数量* param 设置连接池中最大可用的连接数量值*/ public void setMaxC onn ecti on s(i nt maxC onn ecti ons) this.maxC onn ectio ns = maxC onn ecti ons;*获取测试数据库表的名字* return测试数据库表的名字*/public String getTestTable() return this.testT

11、able;/*设置测试表的名字* param testTable Stri ng测试表的名字*/ public void setTestTable(String testTable) this.testTable = testTable;*创建一个数据库连接池,连接池中的可用连接的数量采用类成员* in itialC onn ecti ons中设置的值*/ public syn chro ni zed void createPool() throws Excepti on /确保连接池没有创建/如果连接池己经创建了,保存连接的向量co nn ectio ns不会为空if (conn ecti

12、ons != n ull) return; /如果己经创建,则返回/实例化JDBC Driver中指定的驱动类实例Driver driver = (Driver)(Class.forName(this.jdbcDriver). newl nsta nce();DriverMa nager.registerDriver(driver); /注册 JDBC 驱动程序/创建保存连接的向量初始时有0个元素conn ecti ons = new Vector();/根据in itialCo nn ectio ns中设置的值,创建连接。createC onn ecti on s(this.i nitial

13、C onn ecti on s);System.out.pri ntl n(数据库连接池创建成功!);*创建由numConnections指定数目的数据库连接,并把这些连接* 放入connections 向量中* param numCo nn ectio ns要创建的数据库连接的数目*/SuppressWar nin gs(u nchecked)private void createC onn ecti on s(i nt n umC onn ecti ons) throws SQLExcepti on for (i nt x = 0; x 0 & this.connections.size(

14、) = this.maxC onn ecti ons) break;/add a new PooledC onn ecti on object to conn ecti ons vector/增加一个连接到连接池中(向量conn ectio ns中)tryconn ectio ns.addEleme nt( newPooledC onn ectio n(n ewC onn ectio n();catch(SQLException e)System.out.pri ntln(创建数据库连接失败!+e.getMessage();throw new SQLException();System.out

15、.pri ntln(数据库连接己创建 );*创建一个新的数据库连接并返回它* return返回一个新创建的数据库连接*/ private Conn ecti on n ewC onn ecti on() throws SQLExcepti on /连接数目为数据库允许的最大数目Conn ecti on conn = DriverMa nager.getC onn ectio n(dbUrl, dbUser name, dbPassword);/如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的/最大客户连接数目/co nn ectio ns.size()=0表示目前没有连接己被

16、创建if (conn ecti on s.size() = 0) DatabaseMetaData metaData = conn. getMetaData();int driverMaxC onn ecti ons = metaData.getMaxC onn ecti on s();/数据库返回的driverMaxConnections若为0 ,表示此数据库没有最大/连接限制,或数据库的最大连接限制不知道/driverMaxCo nn ectio ns为返回的一个整数,表示此数据库允许客户连接的数目/如果连接池中设置的最大连接数量大于数据库允许的连接数目,则置连接池的最大if (drive

17、rMaxC onn ecti ons 0 & this.maxC onn ecti ons driverMaxC onn ecti ons) this.maxC onn ecti ons = driverMaxC onn ecti ons;return conn; /返回创建的新的数据库连接*通过调用getFreeConnection()函数返回一个可用的数据库连接*如果当前没有可用的数据库连接,并且更多的数据库连接不能创*建(如连接池大小的限制),此函数等待一会再尝试获取。* retur n返回一个可用的数据库连接对象*/ public syn chro ni zed Conn ecti o

18、n getC onn ecti on() throws SQLExcepti on /确保连接池己被创建if (conn ecti ons = n ull) return n ull; /连接池还没创建,则返回 null个可用的数据库连Conn ecti on conn = getFreeC onn ecti on(); /获得接/如果目前没有可以使用的连接,即所有的连接都在使用中while (conn = n ull)/等一会再试wait(250);conn = getFreeC onn ectio n(); /重新再试,直到获得可用的连接,如果/getFreeC onn ectio n()

19、返回的为null/则表明创建一批连接后也不可获得可用连接return conn;/返回获得的可用的连接*本函数从连接池向量connections中返回一个可用的的数据库连接,如果设置*当前没有可用的数据库连接,本函数则根据in creme ntalCo nn ectio ns*的值创建几个数据库连接,并放入连接池中*如果创建后,所有的连接仍都在使用中,则返回null* return返回一个可用的数据库连接*/private Conn ecti on getFreeC onn ecti on() throws SQLExcepti on /从连接池中获得一个可用的数据库连接Conn ecti o

20、n conn = fin dFreeC onn ecti on();if (conn = n ull) /如果目前连接池中没有可用的连接/创建一些连接createC onn ecti on s(i ncreme ntalC onn ecti on s);/重新从池中查找是否有可用连接conn = fin dFreeC onn ecti on();if (conn = n ull) /如果创建连接后仍获得不到可用的连接,则返回nullreturn n ull;retur n conn;*查找连接池中所有的连接,查找一个可用的数据库连接,*如果没有可用的连接,返回null* return返回一个可

21、用的数据库连接*/private Conn ecti on fin dFreeC onn ecti on() throws SQLExcepti on Conn ecti on conn = n ull;PooledC onn ecti on pConn = n ull;En umerati on en umerate = conn ecti on s.eleme nts();/遍历所有的对象,看是否有可用的连接while (en umerate.hasMoreEleme nts() pConn = (PooledC onn ecti on) en umerate .n extEleme nt

22、();if (!pConn.isBusy() /如果此对象不忙,则获得它的数据库连接并把它设为忙conn = pConn. getC onn ecti on();pConn .setBusy(true);/测试此连接是否可用if (!testConnection(conn) /如果此连接不可再用了,则创建一个新的连接,/并替换此不可用的连接对象,如果创建失败,返回nulltry conn = n ewC onn ecti on();catch(SQLException e)+e.getMessage();System.out.pr in tl n(创建数据库连接失败!return n ull;

23、pConn .setC onn ecti on(conn);break; /己经找到一个可用的连接,退岀return conn;/返回找到到的可用连接/来判断连接否可用(此方法只在部分数据库可用,如果不可用/*测试一个连接是否可用,如果不可用,关掉它并返回false*否则可用返回true* param conn需要测试的数据库连接表示不可用* return 返回true表示此连接可用,false*/ private boolea n testC onn ecti on(Conn ecti on conn) try /判断测试表是否存在if (testTable.equals() /如果测试表为

24、空,试着使用此连接的setAutoCommit()方法/抛出异常)。注意:使用测试表的方法更可靠conn .setAutoCommit(true); else /有测试表的时候使用测试表测试/check if this connection is validStateme nt stmt = conn. createStateme nt();stmt.execute(select cou nt(*) from + testTable); catch (SQLException e) /上面抛岀异常,此连接己不可用,关闭它,并返回false;closeC onn ecti on(conn);re

25、turn false;/连接可用,返回truereturn true;*此函数返回一个数据库连接到连接池中,并把此连接置为空闲*所有使用连接池获得的数据库连接均应在不使用此连接时返回它* param需返回到连接池中的连接对象*/ public void retur nConn ecti on(Conn ecti on conn) /确保连接池存在,如果连接没有创建(不存在),直接返回if (conn ecti ons = n ull) System.out.pri ntln(连接池不存在,无法返回此连接到连接池中!);return;PooledC onn ecti on pConn = n u

26、ll;En umerati on en umerate = conn ecti on s.eleme nts();/遍历连接池中的所有连接,找到这个要返回的连接对象while (en umerate.hasMoreEleme nts() pConn = (PooledC onn ecti on) en umerate .n extEleme nt();/先找到连接池中的要返回的连接对象if (conn = pConn. getC onn ecti on() /找到了,设置此连接为空闲状态pConn .setBusy(false);break;*刷新连接池中所有的连接对象*/ public sy

27、n chro ni zed void refreshC onn ecti on s() throws SQLExcepti on /确保连接池己创新存在if (conn ecti ons = n ull) System.out.pri ntln(“连接池不存在,无法刷新);return;PooledC onn ecti on pConn = n ull;En umerati on en umerate = conn ecti on s.eleme nts();while (en umerate.hasMoreEleme nts() /获得一个连接对象pConn = (PooledC onn e

28、cti on) en umerate .n extEleme nt();/如果对象忙则等5秒,5 秒后直接刷新if (pCo nn .isBusy() wait(5000); /等 5 秒/关闭此连接,用一个新的连接代替它closeC onn ecti on(pConn. getC onn ecti on();pConn. setC onn ecti on(n ewC onn ecti on();pConn. setBusy(false);*关闭连接池中所有的连接,并清空连接池。*/ public syn chro ni zed void closeC onn ecti on Pool() t

29、hrows SQLExcepti on /确保连接池存在,如果不存在,返回if (conn ecti ons = n ull) System.out.pri ntln(“连接池不存在,无法关闭);return;PooledC onn ecti on pConn = n ull;En umerati on en umerate = conn ecti on s.eleme nts();while (en umerate.hasMoreEleme nts() pConn = (PooledC onn ecti on) en umerate .n extEleme nt();/如果忙,等5秒if (pCo nn .isBusy() wait(5000); /等 5 秒5秒后直接关闭它closeC onn ecti on(pConn .getC onn ecti on();/从连接池向量中删除它conn ectio ns.removeEleme nt(pC onn);/置连接池为空conn ecti ons = n ull;*关闭一个数据库连接* param需要关闭的数据库连接*/private void closeC onn ecti on(Conn ecti on conn) try conn. close();catch (SQLException e) Sy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论