Java数据库连接池 .pdf

上传人:C****o 文档编号:39697378 上传时间:2022-09-07 格式:PDF 页数:40 大小:189.21KB
返回 下载 相关 举报
Java数据库连接池 .pdf_第1页
第1页 / 共40页
Java数据库连接池 .pdf_第2页
第2页 / 共40页
点击查看更多>>
资源描述

《Java数据库连接池 .pdf》由会员分享,可在线阅读,更多相关《Java数据库连接池 .pdf(40页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Java 数据库连接池虽然现在用 APACHE COMMONS DBCP可以非常方便的建立数据库连接池,但是像这篇文章把数据库连接池的内部原理写的这么透彻,注视这么完整,真是非常难得,让开发人员可以更深层次的理解数据库连接池,真是非常感谢这篇文章的作者。import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Driver;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;impor

2、t java.util.Enumeration;import java.util.Vector;public class ConnectionPool private String jdbcDriver=;/数据库驱动private String dbUrl=;/数据 URL 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 40 页 -private String dbUsername=;/数据库用户名private String dbPassword=;/数据库用户密码private String testTable=;/测试连接是否可用的测试表名,默认没有测试表private

3、 int initialConnections=10;/连接池的初始大小private int incrementalConnections=5;/连接池自动增加的大小private int maxConnections=50;/连接池最大的大小private Vector connections=null;/存放连接池中数据库连接的向量,初始时为null/它中存放的对象为PooledConnection 型/*构造函数名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 40 页 -*param jdbcDriver String JDBC 驱动类串*param dbUrl Stri

4、ng 数据库URL*param dbUsername String 连接数据库用户名*param dbPassword String 连接数据库用户的密码*/public ConnectionPool(String jdbcDriver,String dbUrl,String dbUsername,String dbPassword)this.jdbcDriver=jdbcDriver;this.dbUrl=dbUrl;this.dbUsername=dbUsername;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 40 页 -this.dbPassword=dbPasswo

5、rd;/*返回连接池的初始大小*return 初始连接池中可获得的连接数量*/public int getInitialConnections()return this.initialConnections;/*名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 40 页 -*设置连接池的初始大小*param 用于设置初始连接池中连接的数量*/public void setInitialConnections(int initialConnections)this.initialConnections=initialConnections;/*返回连接池自动增加的大小、*return

6、 连接池自动增加的大小名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 40 页 -*/public int getIncrementalConnections()return this.incrementalConnections;/*设置连接池自动增加的大小*param 连接池自动增加的大小*/public void setIncrementalConnections(int incrementalConnections)this.incrementalConnections=incrementalConnections;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页

7、,共 40 页 -/*返回连接池中最大的可用连接数量*return 连接池中最大的可用连接数量*/public int getMaxConnections()return this.maxConnections;/*设置连接池中最大可用的连接数量*名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 40 页 -*param 设置连接池中最大可用的连接数量值*/public void setMaxConnections(int maxConnections)this.maxConnections=maxConnections;/*获取测试数据库表的名字*return 测试数据库表的名字

8、*/public String getTestTable()名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 40 页 -return this.testTable;/*设置测试表的名字*param testTable String 测试表的名字*/public void setTestTable(String testTable)this.testTable=testTable;/*名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 40 页 -*创建一个数据库连接池,连接池中的可用连接的数量采用类成员*initialConnections 中设置的值*/public

9、synchronized void createPool()throws Exception /确保连接池没有创建/如果连接池己经创建了,保存连接的向量connections 不会为空if(connections!=null)return;/如果己经创建,则返回/实例化 JDBC Driver 中指定的驱动类实例Driver driver=(Driver)名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 40 页 -(Class.forName(this.jdbcDriver).newInstance();DriverManager.registerDriver(driver);

10、/注册 JDBC 驱动程序/创建保存连接的向量,初始时有0 个元素connections=new Vector();/根据 initialConnections 中设置的值,创建连接。createConnections(this.initialConnections);System.out.println(数据库连接池创建成功!);/*创建由 numConnections 指定数目的数据库连接,并把这些连接名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 40 页 -*放入 connections 向量中*param numConnections 要创建的数据库连接的数目*/Su

11、ppressWarnings(unchecked)private void createConnections(int numConnections)throws SQLException /循环创建指定数目的数据库连接for(int x=0;x 0&this.connections.size()=this.maxConnections)break;/add a new PooledConnection object to connections vector/增加一个连接到连接池中(向量connections 中)try connections.addElement(new PooledCo

12、nnection(newConnection();catch(SQLException e)System.out.println(创建数据库连接失败!+e.getMessage();名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 40 页 -throw new SQLException();System.out.println(数据库连接己创建 .);/*创建一个新的数据库连接并返回它*return 返回一个新创建的数据库连接*/private Connection newConnection()throws SQLException 名师资料总结-精品资料欢迎下载-名师精心整

13、理-第 14 页,共 40 页 -/创建一个数据库连接Connection conn=DriverManager.getConnection(dbUrl,dbUsername,dbPassword);/如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的/最大客户连接数目/connections.size()=0 表示目前没有连接己被创建if(connections.size()=0)DatabaseMetaData metaData=conn.getMetaData();int driverMaxConnections=metaData.getMaxConnections();

14、/数据库返回的driverMaxConnections 若为 0,表示此数据库没有最大名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 40 页 -/连接限制,或数据库的最大连接限制不知道/driverMaxConnections 为返回的一个整数,表示此数据库允许客户连接的数目/如果连接池中设置的最大连接数量大于数据库允许的连接数目,则置连接池的最大/连接数目为数据库允许的最大数目if(driverMaxConnections 0&this.maxConnections driverMaxConnections)this.maxConnections=driverMaxConn

15、ections;return conn;/返回创建的新的数据库连接 名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 40 页 -/*通过调用getFreeConnection()函数返回一个可用的数据库连接,*如果当前没有可用的数据库连接,并且更多的数据库连接不能创*建(如连接池大小的限制),此函数等待一会再尝试获取。*return 返回一个可用的数据库连接对象*/public synchronized Connection getConnection()throws SQLException /确保连接池己被创建if(connections=null)名师资料总结-精品资料欢

16、迎下载-名师精心整理-第 17 页,共 40 页 -return null;/连接池还没创建,则返回null Connection conn=getFreeConnection();/获得一个可用的数据库连接/如果目前没有可以使用的连接,即所有的连接都在使用中while(conn=null)/等一会再试wait(250);conn=getFreeConnection();/重新再试,直到获得可用的连接,如果/getFreeConnection()返回的为null/则表明创建一批连接后也不可获得可用连接名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 40 页 -return co

17、nn;/返回获得的可用的连接/*本函数从连接池向量connections 中返回一个可用的的数据库连接,如果*当前没有可用的数据库连接,本函数则根据incrementalConnections 设置*的值创建几个数据库连接,并放入连接池中。*如果创建后,所有的连接仍都在使用中,则返回null*return 返回一个可用的数据库连接*/名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 40 页 -private Connection getFreeConnection()throws SQLException /从连接池中获得一个可用的数据库连接Connection conn=fi

18、ndFreeConnection();if(conn=null)/如果目前连接池中没有可用的连接/创建一些连接createConnections(incrementalConnections);/重新从池中查找是否有可用连接conn=findFreeConnection();if(conn=null)/如果创建连接后仍获得不到可用的连接,则返回null 名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 40 页 -return null;return conn;/*查找连接池中所有的连接,查找一个可用的数据库连接,*如果没有可用的连接,返回null*return 返回一个可用的数

19、据库连接*/名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 40 页 -private Connection findFreeConnection()throws SQLException Connection conn=null;PooledConnection pConn=null;/获得连接池向量中所有的对象Enumeration enumerate=connections.elements();/遍历所有的对象,看是否有可用的连接while(enumerate.hasMoreElements()pConn=(PooledConnection)enumerate.next

20、Element();if(!pConn.isBusy()/如果此对象不忙,则获得它的数据库连接并把它设为忙conn=pConn.getConnection();名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 40 页 -pConn.setBusy(true);/测试此连接是否可用if(!testConnection(conn)/如果此连接不可再用了,则创建一个新的连接,/并替换此不可用的连接对象,如果创建失败,返回null try conn=newConnection();catch(SQLException e)System.out.println(创建数据库连接失败!+e.

21、getMessage();return null;名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 40 页 -pConn.setConnection(conn);break;/己经找到一个可用的连接,退出 return conn;/返回找到到的可用连接/*测试一个连接是否可用,如果不可用,关掉它并返回false*否则可用返回true*名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 40 页 -*param conn 需要测试的数据库连接*return 返回 true 表示此连接可用,false 表示不可用*/private boolean testConnect

22、ion(Connection conn)try /判断测试表是否存在if(testTable.equals()/如果测试表为空,试着使用此连接的setAutoCommit()方法/来判断连接否可用(此方法只在部分数据库可用,如果不可用,/抛出异常)。注意:使用测试表的方法更可靠名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 40 页 -conn.setAutoCommit(true);else/有测试表的时候使用测试表测试/check if this connection is valid Statement stmt=conn.createStatement();stmt.e

23、xecute(select count(*)from +testTable);catch(SQLException e)/上面抛出异常,此连接己不可用,关闭它,并返回false;closeConnection(conn);return false;名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 40 页 -/连接可用,返回true return true;/*此函数返回一个数据库连接到连接池中,并把此连接置为空闲。*所有使用连接池获得的数据库连接均应在不使用此连接时返回它。*param 需返回到连接池中的连接对象*/public void returnConnection(Co

24、nnection conn)/确保连接池存在,如果连接没有创建(不存在),直接返回名师资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 40 页 -if(connections=null)System.out.println(连接池不存在,无法返回此连接到连接池中!);return;PooledConnection pConn=null;Enumeration enumerate=connections.elements();/遍历连接池中的所有连接,找到这个要返回的连接对象while(enumerate.hasMoreElements()pConn=(PooledConnectio

25、n)enumerate.nextElement();/先找到连接池中的要返回的连接对象名师资料总结-精品资料欢迎下载-名师精心整理-第 28 页,共 40 页 -if(conn=pConn.getConnection()/找到了,设置此连接为空闲状态pConn.setBusy(false);break;/*刷新连接池中所有的连接对象*/名师资料总结-精品资料欢迎下载-名师精心整理-第 29 页,共 40 页 -public synchronized void refreshConnections()throws SQLException /确保连接池己创新存在if(connections=nu

26、ll)System.out.println(连接池不存在,无法刷新!);return;PooledConnection pConn=null;Enumeration enumerate=connections.elements();while(enumerate.hasMoreElements()/获得一个连接对象pConn=(PooledConnection)enumerate.nextElement();名师资料总结-精品资料欢迎下载-名师精心整理-第 30 页,共 40 页 -/如果对象忙则等5 秒,5 秒后直接刷新if(pConn.isBusy()wait(5000);/等 5 秒/关

27、闭此连接,用一个新的连接代替它。closeConnection(pConn.getConnection();pConn.setConnection(newConnection();pConn.setBusy(false);/*名师资料总结-精品资料欢迎下载-名师精心整理-第 31 页,共 40 页 -*关闭连接池中所有的连接,并清空连接池。*/public synchronized void closeConnectionPool()throws SQLException /确保连接池存在,如果不存在,返回if(connections=null)System.out.println(连接池不存

28、在,无法关闭!);return;PooledConnection pConn=null;Enumeration enumerate=connections.elements();名师资料总结-精品资料欢迎下载-名师精心整理-第 32 页,共 40 页 -while(enumerate.hasMoreElements()pConn=(PooledConnection)enumerate.nextElement();/如果忙,等5 秒if(pConn.isBusy()wait(5000);/等 5 秒/5 秒后直接关闭它closeConnection(pConn.getConnection();/

29、从连接池向量中删除它connections.removeElement(pConn);名师资料总结-精品资料欢迎下载-名师精心整理-第 33 页,共 40 页 -/置连接池为空connections=null;/*关闭一个数据库连接*param 需要关闭的数据库连接*/private void closeConnection(Connection conn)try conn.close();名师资料总结-精品资料欢迎下载-名师精心整理-第 34 页,共 40 页 -catch(SQLException e)System.out.println(关闭数据库连接出错:+e.getMessage()

30、;/*使程序等待给定的毫秒数*param 给定的毫秒数*/private void wait(int mSeconds)try 名师资料总结-精品资料欢迎下载-名师精心整理-第 35 页,共 40 页 -Thread.sleep(mSeconds);catch(InterruptedException e)/*内部使用的用于保存连接池中连接对象的类*此类中有两个成员,一个是数据库的连接,另一个是指示此连接是否*正在使用的标志。*/名师资料总结-精品资料欢迎下载-名师精心整理-第 36 页,共 40 页 -class PooledConnection Connection connection=

31、null;/数据库连接boolean busy=false;/此连接是否正在使用的标志,默认没有正在使用/构造函数,根据一个Connection 构告一个PooledConnection 对象public PooledConnection(Connection connection)this.connection=connection;/返回此对象中的连接public Connection getConnection()return connection;名师资料总结-精品资料欢迎下载-名师精心整理-第 37 页,共 40 页 -/设置此对象的,连接public void setConnect

32、ion(Connection connection)this.connection=connection;/获得对象连接是否忙public boolean isBusy()return busy;/设置对象的连接正在忙public void setBusy(boolean busy)名师资料总结-精品资料欢迎下载-名师精心整理-第 38 页,共 40 页 -this.busy=busy;=这个例子是根据POSTGRESQL 数据库写的,请用的时候根据实际的数据库调整。调用方法如下:ConnectionPool connPool=new ConnectionPool(org.postgresql.Driver,jdbc:postgresql:/dbURI:5432/DBName,postgre,postgre);connPool.createPool();Connection conn=connPool.getConnection();名师资料总结-精品资料欢迎下载-名师精心整理-第 39 页,共 40 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 40 页,共 40 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com