`

数据库连接池

阅读更多
package com.kyo.connection;
002   
003 import java.sql.Connection;
004 import java.sql.DatabaseMetaData;
005 import java.sql.Driver;
006 import java.sql.DriverManager;
007 import java.sql.SQLException;
008 import java.sql.Statement;
009 import java.util.Enumeration;
010 import java.util.Vector;
011   
012 public class ConnectionPool {
013   
014     private ConnectionParam param;
015   
016     private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表
017   
018     private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为
019                                         // null,它中存放的对象为PooledConnection 型
020   
021     public void setParam(ConnectionParam param) {
022         this.param = param;
023     }
024   
025     public ConnectionParam getParam() {
026         return param;
027     }
028   
029     /**
030      * 构造函数
031      
032      * @param param
033      */
034     public ConnectionPool(ConnectionParam param) {
035         this.param = param;
036     }
037   
038     /**
039      
040      * 获取测试数据库表的名字
041      
042      * @return 测试数据库表的名字
043      */
044   
045     public String getTestTable() {
046         return this.testTable;
047     }
048   
049     /**
050      
051      * 设置测试表的名字
052      
053      * @param testTable
054      *            String 测试表的名字
055      */
056   
057     public void setTestTable(String testTable) {
058         this.testTable = testTable;
059     }
060   
061     /**
062      * 创建一个数据库连接池,连接池中的可用连接的数量采用类成员 initialConnections 中设置的值
063      */
064   
065     public synchronized void createPool() throws Exception {
066   
067         // 确保连接池没有创建
068         // 如果连接池己经创建了,保存连接的向量 connections 不会为空
069         if (connections != null) {
070             return; // 如果己经创建,则返回
071         }
072   
073         // 实例化 JDBC Driver 中指定的驱动类实例
074         Driver driver = (Driver) (Class.forName(this.param.getDriver())
075                 .newInstance());
076         DriverManager.registerDriver(driver); // 注册 JDBC 驱动程序
077         // 创建保存连接的向量 , 初始时有 0 个元素
078         connections = new Vector();
079   
080         // 根据 initialConnections 中设置的值,创建连接。
081         createConnections(this.param.getMinConnection());
082         System.out.println(" 数据库连接池创建成功! ");
083   
084     }
085   
086     /**
087      
088      * 创建由 numConnections 指定数目的数据库连接 , 并把这些连接 放入 connections 向量中
089      
090      * @param numConnections
091      *            要创建的数据库连接的数目
092      */
093   
094     private void createConnections(int numConnections) throws SQLException {
095   
096         // 循环创建指定数目的数据库连接
097         for (int x = 0; x < numConnections; x++) {
098             // 是否连接池中的数据库连接的数量己经达到最大?最大值由类成员 maxConnections,指出,如果 maxConnections
099             // 为 0 或负数,表示连接数量没有限制。
100             // 如果连接数己经达到最大,即退出。
101   
102             if (this.param.getMaxConnection() > 0
103                     && this.connections.size() >= this.param.getMaxConnection()) {
104                 break;
105             }
106   
107             // add a new PooledConnection object to connections vector
108             // 增加一个连接到连接池中(向量 connections 中)
109             try {
110                 connections.addElement(new PooledConnection(newConnection()));
111             } catch (SQLException e) {
112                 System.out.println(" 创建数据库连接失败! " + e.getMessage());
113                 throw new SQLException();
114             }
115   
116             System.out.println(" 数据库连接己创建 ......");
117         }
118   
119     }
120   
121     /**
122      
123      * 创建一个新的数据库连接并返回它
124      
125      * @return 返回一个新创建的数据库连接
126      */
127   
128     private Connection newConnection() throws SQLException {
129   
130         // 创建一个数据库连接
131         Connection conn = DriverManager.getConnection(this.param.getUrl(),
132                 this.param.getUser(), this.param.getPassword());
133   
134         // 如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的
135         // 最大客户连接数目
136         // connections.size()==0 表示目前没有连接己被创建
137   
138         if (connections.size() == 0) {
139   
140             DatabaseMetaData metaData = conn.getMetaData();
141             int driverMaxConnections = metaData.getMaxConnections();
142   
143             // 数据库返回的 driverMaxConnections 若为 0 ,表示此数据库没有最大
144             // 连接限制,或数据库的最大连接限制不知道
145             // driverMaxConnections 为返回的一个整数,表示此数据库允许客户连接的数 目
146             // 如果连接池中设置的最大连接数量大于数据库允许的连接数目 , 则置连接池 的最大
147             // 连接数目为数据库允许的最大数目
148   
149             if (driverMaxConnections > 0
150                     && this.param.getMaxConnection() > driverMaxConnections) {
151                 this.param.setMaxConnection(driverMaxConnections);
152             }
153         }
154         return conn; // 返回创建的新的数据库连接
155     }
156   
157     /**
158      
159      * 通过调用 getFreeConnection() 函数返回一个可用的数据库连接 ,
160      
161      * 如果当前没有可用的数据库连接,并且更多的数据库连接不能创
162      
163      * 建(如连接池大小的限制),此函数等待一会再尝试获取。
164      
165      * @return 返回一个可用的数据库连接对象
166      */
167   
168     public synchronized Connection getConnection() throws SQLException {
169   
170         // 确保连接池己被创建
171         if (connections == null) {
172             return null; // 连接池还没创建,则返回 null
173         }
174   
175         Connection conn = getFreeConnection(); // 获得一个可用的数据库连接
176         // 如果目前没有可以使用的连接,即所有的连接都在使用中
177   
178         while (conn == null) {
179             // 等一会再试
180             wait(250);
181             conn = getFreeConnection(); // 重新再试,直到获得可用的连接,如果
182             // getFreeConnection() 返回的为 null
183             // 则表明创建一批连接后也不可获得可用连接
184         }
185   
186         return conn;// 返回获得的可用的连接
187     }
188   
189     /**
190      
191      * 本函数从连接池向量 connections 中返回一个可用的的数据库连接,如果
192      
193      * 当前没有可用的数据库连接,本函数则根据 incrementalConnections 设置
194      
195      * 的值创建几个数据库连接,并放入连接池中。
196      
197      * 如果创建后,所有的连接仍都在使用中,则返回 null
198      
199      * @return 返回一个可用的数据库连接
200      */
201   
202     private Connection getFreeConnection() throws SQLException {
203   
204         // 从连接池中获得一个可用的数据库连接
205         Connection conn = findFreeConnection();
206         if (conn == null) {
207             // 如果目前连接池中没有可用的连接
208             // 创建一些连接
209             createConnections(this.param.getIncrementalConnections());
210             // 重新从池中查找是否有可用连接
211             conn = findFreeConnection();
212             if (conn == null) {
213                 // 如果创建连接后仍获得不到可用的连接,则返回 null
214                 return null;
215             }
216         }
217         return conn;
218   
219     }
220   
221     /**
222      
223      * 查找连接池中所有的连接,查找一个可用的数据库连接,
224      
225      * 如果没有可用的连接,返回 null
226      
227      * @return 返回一个可用的数据库连接
228      */
229   
230     private Connection findFreeConnection() throws SQLException {
231   
232         Connection conn = null;
233         PooledConnection pConn = null;
234         // 获得连接池向量中所有的对象
235         Enumeration enumerate = connections.elements();
236         // 遍历所有的对象,看是否有可用的连接
237         while (enumerate.hasMoreElements()) {
238             pConn = (PooledConnection) enumerate.nextElement();
239             if (!pConn.isBusy()) {
240                 // 如果此对象不忙,则获得它的数据库连接并把它设为忙
241                 conn = pConn.getConnection();
分享到:
评论

相关推荐

    C#高效数据库连接池源码

    数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...

    数据库连接池技术详解

    对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 在较为完备的数据库连接池实现中,可根据...

    C# 数据库连接池 C# 数据库连接池

    数据库连接池是数据库管理中的一个重要概念,它在C#编程中扮演着优化数据库操作的关键角色。C#数据库连接池是一种管理数据库连接的技术,通过复用已存在的连接而不是每次请求时都创建新的连接,从而提高数据库操作的...

    常用jdbc数据库连接jar包,数据库连接池jar包

    本资源集合了常用的JDBC数据库连接jar包,以及一些知名的数据库连接池实现,如dbcp和c3p0,这对于开发人员来说是非常宝贵的资源。 首先,让我们了解一下JDBC。JDBC提供了一套标准的API,包括接口和类,使得开发者...

    03-数据库连接池驱动_数据库连接池;驱动_

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在处理大量数据交互的应用中,它极大地提高了数据库操作的效率和系统的稳定性。本资源"03-数据库连接池驱动"包含了三种常用的数据库连接池驱动:C3P0、Druid...

    c# mysql数据库连接池实现

    本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕...

    Qt 多线程连接数据库——数据库连接池

    * 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...

    数据库连接池驱动包_数据库连接池驱动包_

    数据库连接池是现代数据库应用程序中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,从而提高系统的性能和资源利用率。本压缩包包含了几个常见的数据库连接池驱动包,这些驱动包为开发者提供了...

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

    数据库连接池java代码实现

    数据库连接池在Java中的实现是提高应用程序性能的关键技术之一,它通过复用已存在的数据库连接,避免了频繁创建和销毁连接导致的系统资源浪费。本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释...

    几种数据库连接池详细配置

    在IT领域,数据库连接池是优化数据库访问性能的关键技术之一,尤其在高并发的应用场景下,合理配置数据库连接池能够显著提升系统响应速度并降低资源消耗。本文将深入解析几种常用的数据库连接池——Apache DBCP、C3P...

    C# 数据库连接池

    数据库连接池是数据库管理系统中的一个重要概念,主要用于优化数据库的连接操作。在C#编程中,数据库连接池可以高效地管理数据库连接,避免频繁创建和销毁连接导致的性能开销。本文将详细介绍C#中数据库连接池的工作...

    数据库连接池的例子数据库连接池的例子

    数据库连接池是应用程序管理数据库连接的一种机制,它提高了数据库访问的效率和资源利用率。通过复用已建立的数据库连接,避免了频繁创建和关闭连接所消耗的时间和系统资源。连接池的基本思想是预先创建一定数量的...

    数据库连接池c3p0jar包

    数据库连接池是Java开发中非常重要的一个组件,它在处理多线程环境下对数据库资源的高效利用和管理中起着关键作用。C3P0是一个开源的Java连接池实现,它提供了一种灵活且功能强大的数据库连接管理方式。在本文中,...

    数据库连接池jar包.zip

    数据库连接池是现代Java应用程序中不可或缺的组件,它在提高数据库操作效率和资源管理方面扮演着重要角色。Druid是一个高效、强大且功能丰富的数据库连接池实现,由阿里巴巴开源并维护。标题提到的"数据库连接池jar...

    delphi数据库连接池

    Delphi数据库连接池是一种高效的数据库资源管理技术,它允许应用程序在多用户环境下共享数据库连接,以提高性能并减少系统资源的消耗。连接池的核心思想是重用已建立的数据库连接,而不是每次需要时都创建新的连接,...

    数据库连接池配置文件

    context.xml, 数据库连接池配置文

Global site tag (gtag.js) - Google Analytics