`
surpass
  • 浏览: 85814 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个不错的JDBC连接池教程(带具体例子)

阅读更多

选择自 JavaProgramers 的 Blog

1.前言 

数据库应用,在许多软件系统中经常用到,是开发中大型系统不可缺少的辅助。但如果对数据库资源没有很好地管理(如:没有及时回收数据库的游标(ResultSet)、Statement、连接 (Connection)等资源),往往会直接导致系统的稳定。这类不稳定因素,不单单由数据库或者系统本身一方引起,只有系统正式使用后,随着流量、用户的增加,才会逐步显露。 

在b基于Java开发的系统中,JDBC是程序员和数据库打交道的主要途径,提供了完备的数据库操作方法接口。但考虑到规范的适用性,JDBC只提供了最直接的数据库操作规范,对数据库资源管理,如:对物理连接的管理及缓冲,期望第三方应用服务器(Application Server)的提供。 

本文,以JDBC规范为基础,介绍相关的数据库连接池机制,并就如果以简单的方式,实现有效地管理数据库资源介绍相关实现技术。 

2.连接池技术背景 

2.1JDBC 

JDBC是一个规范,遵循JDBC接口规范,各个数据库厂家各自实现自己的驱动程序(Driver),如下图所示: 


应用在获取数据库连接时,需要以URL的方式指定是那种类型的Driver,在获得特定的连接后,可按照固定的接口操作不同类型的数据库,如: 分别获取Statement、执行SQL获得ResultSet等,如下面的例子 : 

import java.sql.*;


..DriverManager.registerDriver(
                   new oracle.jdbc.
                   driver.OracleDriver());
Connection dbConn = DriverManager.getConnection   
(“jdbc:oracle:thin:@127.0.0.1:1521: 
  oracle”,“username”, “password” );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(  
                    “select * from demo_table” );

some data source operation in herers.close();
st.close();dbConn.close();
 


在完成数据操作后,还一定要关闭所有涉及到的数据库资源。这虽然对应用程序的逻辑没有任何影响,但是关键的操作。上面是个简单的例子,如果搀和众多的if-else、exception,资源的管理也难免百密一疏。如同C中的内存泄漏问题,Java系统也同样会面临崩溃的恶运。所以数据库资源的管理依赖于应用系统本身,是不安全、不稳定的一种隐患。 

2.2JDBC连接池 

在标准JDBC对应用的接口中,并没有提供资源的管理方法。所以,缺省的资源管理由应用自己负责。虽然在JDBC规范中,多次提及资源的关闭/回收及其他的合理运用。但最稳妥的方式,还是为应用提供有效的管理手段。所以,JDBC为第三方应用服务器(Application Server)提供了一个由数据库厂家实现的管理标准接口:连接缓冲(connection pooling)。引入了连接池( Connection Pool )的概念 ,也就是以缓冲池的机制管理数据库的资源。 

JDBC最常用的资源有三类: 

-Connection: 数据库连接。 

-Statement: 会话声明。 

-ResultSet: 结果集游标。 

分别存在以下的关系 : 


这是一种 ‘爷-父-子’ 的关系,对Connection的管理,就是对数据库资源的管理。举个例子: 如果想确定某个数据库连接(Connection)是否超时,则需要确定其(所有的)子Statement是否超时,同样,需要确定所有相关的ResultSet是否超时;在关闭Connection前,需要关闭所有相关的Statement和ResultSet。 

因此,连接池(Connection Pool)所起到的作用,不仅仅简单地管理Connection,还涉及到 Statement和ResultSet。 

2.3连接池(ConnectionPool)与资源管理 

ConnectionPool以缓冲池的机制,在一定数量上限范围内,控制管理Connection,Statement和ResultSet。任何数据库的资源是有限的,如果被耗尽,则无法获得更多的数据服务。 

在大多数情况下,资源的耗尽不是由于应用的正常负载过高,而是程序原因。 

在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访问同一数据源。其中某个应用耗尽了数据库资源后,意味其他的应用也无法正常运行。因此,ConnectionPool的第一个任务是限制:每个应用或系统可以拥有的最大资源。也就是确定连接池的大小(PoolSize)。 

ConnectionPool的第二个任务:在连接池的大小(PoolSize)范围内,最大限度地使用资源,缩短数据库访问的使用周期。许多数据库中,连接(Connection)并不是资源的最小单元,控制Statement资源比Connection更重要。以Oracle为例: 

每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通讯的连接,在此连接上还可以申请一定数量的Statement。同一连接可提供的活跃Statement数量可以达到几百。 在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操作)。但在一般的应用中,多数按照2.1范例操作,这样有10个程序调用,则会产生10次物理连接,每个Statement单独占用一个物理连接,这是极大的资源浪费。 ConnectionPool可以解决这个问题,让几十、几百个Statement只占用同一个物理连接, 发挥数据库原有的优点。 

通过ConnectionPool对资源的有效管理,应用可以获得的Statement总数到达 : 

(并发物理连接数) x (每个连接可提供的Statement数量) 

例如某种数据库可同时建立的物理连接数为 200个,每个连接可同时提供250个Statement,那么ConnectionPool最终为应用提供的并发Statement总数为: 200 x 250 = 50,000个。这是个并发数字,很少有系统会突破这个量级。所以在本节的开始,指出资源的耗尽与应用程序直接管理有关。 

对资源的优化管理,很大程度上依靠数据库自身的JDBC Driver是否具备。有些数据库的JDBC Driver并不支持Connection与Statement之间的逻辑连接功能,如SQLServer,我们只能等待她自身的更新版本了。 

对资源的申请、释放、回收、共享和同步,这些管理是复杂精密的。所以,ConnectionPool另一个功能就是,封装这些操作,为应用提供简单的,甚至是不改变应用风格的调用接口。 

3.简单JDBC连接池的实现 

根据第二章中原理机制,Snap-ConnectionPool(一种简单快速的连接池工具)按照部分的JDBC规范,实现了连接池所具备的对数据库资源有效管理功能。 

3.1体系描述 

在JDBC规范中,应用通过驱动接口(Driver Interface)直接方法数据库的资源。为了有效、合理地管理资源,在应用与JDBC Driver之间,增加了连接池: Snap-ConnectionPool。并且通过面向对象的机制,使连接池的大部分操作是透明的。参见下图,Snap-ConnectionPool的体系: 


图中所示,通过实现JDBC的部分资源对象接口( Connection, Statement, ResultSet ),在 Snap-ConnectionPool内部分别产生三种逻辑资源对象: PooledConnection, PooledStatement和 PooledResultSet。它们也是连接池主要的管理操作对象,并且继承了JDBC中相应的从属关系。这样的体系有以下几个特点: 

-透明性。在不改变应用原有的使用JDBC驱动接口的前提下,提供资源管理的服务。应用系统,如同原有的 JDBC,使用连接池提供的逻辑对象资源。简化了应用程序的连接池改造。 

-资源封装。复杂的资源管理被封装在 Snap-ConnectionPool内部,不需要应用系统过多的干涉。管理操作的可靠性、安全性由连接池保证。应用的干涉(如:主动关闭资源),只起到优化系统性能的作用,遗漏操作不会带来负面影响。 

-资源合理应用。按照JDBC中资源的从属关系,Snap-ConnectionPool不仅对Connection进行缓冲处理,对Statement也有相应的机制处理。在2.3已描述,合理运用Connection和Statement之间的关系,可以更大限度地使用资源。所以,Snap-ConnectionPool封装了Connection资源,通过内部管理PooledConnection,为应用系统提供更多的Statement资源。 

-资源连锁管理。Snap-ConnectionPool包含的三种逻辑对象,继承了JDBC中相应对象之间的从属关系。在内部管理中,也依照从属关系进行连锁管理。例如:判断一个Connection是否超时,需要根据所包含的Statement是否活跃;判断Statement也要根据ResultSet的活跃程度。 

3.2连接池集中管理ConnectionManager 

ConnectionPool是Snap-ConnectionPool的连接池对象。在Snap-ConnectionPool内部,可以指定多个不同的连接池(ConnectionPool)为应用服务。ConnectionManager管理所有的连接池,每个连接池以不同的名称区别。通过配置文件适应不同的数据库种类。如下图所示: 


通过ConnectionManager,可以同时管理多个不同的连接池,提供通一的管理界面。在应用系统中通过ConnectionManager和相关的配置文件,可以将凌乱散落在各自应用程序中的数据库配置信息(包括:数据库名、用户、密码等信息),集中在一个文件中。便于系统的维护工作。 

3.3连接池使用范例 

对2.1的标准JDBC的使用范例,改为使用连接池,结果如下: 

import java.sql.*;
import net.snapbug.util.dbtool.*;

..ConnectionPool dbConn = ConnectionManager
                   .getConnectionPool("testOracle" );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery( 
             “select * from demo_table” );

some data source operation 
     in herers.close();st.close();
 


在例子中,Snap-ConnectionPool封装了应用对Connection的管理。只要改变JDBC获取Connection的方法,为获取连接池(ConnectionPool)(粗体部分),其他的数据操作都可以不做修改。按照这样的方式,Snap-ConnectionPool可帮助应用有效地管理数据库资源。如果应用忽视了最后资源的释放: rs.close() 和 st.close(),连接池会通过超时(time-out)机制,自动回收。 

4.小结 

无论是Snap-ConnectionPool还是其他的数据库连接池,都应当具备一下基本功能: 

-对源数据库资源的保护 

-充分利用发挥数据库的有效资源 

-简化应用的数据库接口,封闭资源管理。 

-对应用遗留资源的自动回收和整理,提高资源的再次利用率。 

在这个前提下,应用程序才能投入更多的精力于各自的业务逻辑中。数据库资源也不再成为系统的瓶颈。 

注: 在网站 www.snapbug.net可免费下载Snap-ConnectionPool及更详细的文档。 

分享到:
评论

相关推荐

    jdbc连接SQL例子

    本教程将通过一个具体的例子,解释如何使用JDBC连接SQL Server 2000数据库。 首先,确保你已安装了SQL Server 2000并创建了一个数据库。同时,你也需要JDBC驱动,对于SQL Server,通常是Microsoft的JDBC Driver,也...

    Java_JDBC学习教程 由浅入深.doc

    - Apache DBCP 是一个常用的开源数据库连接池实现。 - 提供了丰富的配置选项和强大的功能。 #### 十四、JDBC 轻量级封装 - 对 JDBC 进行轻量级封装,可以简化数据库操作,提高代码的可读性和可维护性。 - 可以使用...

    GWT 连接数据库问题解决及例子

    标题 "GWT 连接数据库问题解决及例子" 指的是使用Google Web Toolkit (GWT) 进行数据库交互的实践教程。GWT 是一个开源的Java框架,用于开发和构建高性能、跨浏览器的富互联网应用程序(RIA)。在GWT中连接数据库...

    02_JDBC_day02(代码).zip

    【标题解析】: "02_JDBC_day02(代码)" 这个标题表明这是一个关于JDBC(Java Database Connectivity)的教程,具体是第二天的学习内容,重点在于代码实践。JDBC是Java语言连接数据库的标准接口,它允许Java应用程序与...

    Struts-connectin-config.rar_struts_struts database

    在Struts框架中,数据库连接池是一个重要的组件,它能够有效地管理数据库连接,提高应用性能并降低资源消耗。本篇文章将深入探讨如何在Struts中配置数据库连接池,并介绍相关的关键知识点。 首先,数据库连接池是一...

    JSP开发教程和源码收藏

    - **JSP中的数据连接池**:数据连接池是提高数据库访问效率的关键技术之一。通过《JSP使用数据连接池》的学习,掌握如何在JSP应用程序中实现和管理数据库连接池。 - **JSP与Ajax结合**:Ajax技术允许在不重新加载...

    derby例子

    这个"derby例子"可能是一个示例项目或教程,用于帮助学习者理解和使用Apache Derby。在本文中,我们将深入探讨Apache Derby的核心特性、安装与配置、以及如何进行基本的操作。 1. **Apache Derby核心特性** - **轻...

    javabean连接数据库

    这只是一个起点,实际应用中可能还需要处理更多细节,例如连接池管理、错误处理策略、性能优化等。在开发过程中,你可能需要根据具体需求调整代码,例如使用DAO(数据访问对象)模式来分离数据库操作和业务逻辑,...

    JAVA数据库编程

    从压缩包的文件名来看,我们可以推测这可能是一个包含多个章节实例的教程,例如: - 第2章实例:可能讲解了基础的JDBC连接和SQL语句执行。 - 第4章实例:可能涉及到了预编译的SQL语句和`PreparedStatement`,提高...

    Java教程

    这种模式在管理共享资源如数据库连接池时非常有用。 2. **工厂模式**:提供创建对象的接口,但让子类决定实例化哪个类。工厂方法使代码更易于维护和扩展,因为它将对象的创建责任从客户端转移到专门的工厂类。 3. ...

    JSP高级教程

    11.1 JDBC2.0和JDBC数据库连接池 11.1.1 JDBC2.0新功能概述 11.1.2 结果集增强功能 11.1.3 批处理更新 11.1.4 对Java对象的持久性 11.1.5 数据库连接池使用实例 11.2 文件上载 11.2.1 实现机理 11.2.2 文件...

    JSP 程序设计从入门到精通 PDF 教程

    - **4.1.4 实现第一个JSP和SERVELT**:这部分提供了实现第一个JSP和Servlet的具体步骤。 ##### 4.2 Servlet规范定义的Servlet 生命周期 - 这部分详细解释了Servlet的生命周期,包括初始化、服务和销毁三个阶段。 ...

    java 连接数据库实现用户登录功能

    在实际项目中,通常会使用DAO(数据访问对象)模式和连接池(如C3P0、HikariCP)来更有效地管理和复用数据库连接,同时增加业务层的封装,使代码更加模块化和易于维护。此外,对于用户密码的存储,应遵循安全实践,...

    spring教程

    例如,在用户注册的例子中,IoC容器可以根据配置自动注入所需的数据库连接池、DAO接口的实现等。 【面向接口编程】 面向接口编程是Spring推荐的最佳实践,它提倡在设计时优先考虑接口而不是具体的实现。这样可以...

    IBM J2EE Development 精品教程

    - **配置管理**:如何设置和管理JDBC连接池。 ##### 14. JSP自定义标签 (UNIT14) - **定义**:JSP自定义标签是扩展JSP功能的一种方式。 - **创建流程**:从编写标签库描述符到标签处理程序的具体步骤。 ##### 15. ...

    iBatis-JPetStore-5.0

    它不完全是一个ORM工具,而是作为传统JDBC的一个补充,让开发者能够编写动态的SQL,而无需处理大量的JDBC代码。 **2. JPetStore示例** JPetStore是iBatis官方提供的一个经典示例项目,用于展示如何使用iBatis进行...

    基于NetBeans开发的java应用程序集锦8

    这涉及到JDBC(Java Database Connectivity)技术,包括连接池管理、SQL语句执行等。 - **测试安全性**:在J2EE环境中,安全性是至关重要的。这部分可能涉及了身份验证、授权以及加密等机制,比如使用JASPIC(Java...

    jsp教程.pdf

    - **数据源**:用于管理数据库连接池,提高性能。 - **JDBC-ODBC桥接器**:一种早期连接数据库的方式。 - **查询记录**:实现对数据库的读取操作。 - **更新记录**:实现对数据库的更新操作。 - **添加记录**:向...

Global site tag (gtag.js) - Google Analytics