Java数据库连接池毕业论文.docx

上传人:b****6 文档编号:4431355 上传时间:2022-12-01 格式:DOCX 页数:25 大小:160.87KB
下载 相关 举报
Java数据库连接池毕业论文.docx_第1页
第1页 / 共25页
Java数据库连接池毕业论文.docx_第2页
第2页 / 共25页
Java数据库连接池毕业论文.docx_第3页
第3页 / 共25页
Java数据库连接池毕业论文.docx_第4页
第4页 / 共25页
Java数据库连接池毕业论文.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

Java数据库连接池毕业论文.docx

《Java数据库连接池毕业论文.docx》由会员分享,可在线阅读,更多相关《Java数据库连接池毕业论文.docx(25页珍藏版)》请在冰豆网上搜索。

Java数据库连接池毕业论文.docx

Java数据库连接池毕业论文

Java数据库连接池毕业论文

SJCP2

第二章课题背景3

1.设计目的3

2.连接池优点3

3.减少连接创建时间3

4.简化的编程模式3

5.受控的资源使用4

6.开源连接池4

6.1C3P0C3P04

6.2Proxool4

6.3JakartaDBCPDBCP4

6.4DDConnectionBrokerDDConnectionBroker4

6.5DBPoolDBPool4

6.6XAPoolXAPoo4

6.7PrimrosePrimrose5

6.8SmartPoolSmartPool5

6.9MiniConnectionPoolManagerMiniConnectionPoolManager5

6.10BoneCPBoneCP5

第三章数据库6

1.数据库概述6

2.数据库连接池的基本原理6

3.连接池的工作原理7

第四章连接池概念8

1.连接池中的关键技术8

2.连接池的分配与释放8

3.连接池的维护8

第五章系统总体设计思想及方案9

设计理念9

1.连接池中的管理机制9

2.并发问题10

3.连接池的分配与释放10

4.连接池的关闭10

第六章设计流程11

1.连接池的管理17

2.连接池的关闭17

3.连接池的测试18

4.性能优化23

事务23

连接管理23

使用更新23

5.连接池的泄露问题23

6.产生现象24

7.解决办法24

第七章结论26

第八章参考文献27

 

SJCP

[摘要]在基于JDBC的数据库实际应用开发中,对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作、多客户对数据库的并发访问,一定程度上决定了WEB系统的响应以及应用性能。

使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。

文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结一了些数据库连接池开发程序中容易忽略的问题。

并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略,在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和容易,从实际上论证了这种设计方案的可行性。

[关键字]连接池;数据库;JDBC;并发访问

 

第一章课题背景

1.设计目的

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。

对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。

数据库连接池正是针对这个问题提出来的。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

这项技术能明显提高对数据库操作的性能。

2.连接池优点

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

  这种把连接“汇集”起来的技术基于这样的一个事实:

对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC连接的1个线程。

当不处理事务时,这个连接就会闲置。

相反,连接池允许闲置的连接被其它需要的线程使用。

  事实上,当一个线程需要用JDBC对一个GBase或其它数据库操作时,它从池中请求一个连接。

当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。

  当连接从池中“借出”,它被请求它的线程专有地使用。

从编程的角度来看,这和用户的线程每当需要一个JDBC连接的时候调用DriverManager.getConnection()是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。

  连接池可以极大的改善用户的Java应用程序的性能,同时减少全部资源的使用。

连接池主要的优点有:

3.  减少连接创建时间

  虽然与其它数据库相比GBase提供了较为快速连接功能,但是创建新的JDBC连接仍会招致网络和JDBC驱动的开销。

如果这类连接是“循环”使用的,使用该方式这些花销就可避免。

4.  简化的编程模式

  当使用连接池时,每一个单独的线程能够像创建了一个自己的JDBC连接一样操作,允许用户直接使用JDBC编程技术。

5.  受控的资源使用

  如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并由可能会导致高负载下的异常发生。

  注意,每个连到GBase的连接在客户端和服务器端都有花销(存,CPU,上下文切换等等)。

每个连接均会对应用程序和GBase服务器的可用资源带来一定的限制。

不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。

  连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

6.开源连接池

6.1C3P0C3P0

C3P0C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规说明的Connection和Statement池的DataSources对象。

6.2Proxool

Proxool这是一个JavaSQLDriver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。

可以非常简单的移植到现存的代码中。

完全可配置。

快速,成熟,健壮。

可以透明地为你现存的JDBC驱动程序增加连接池功能。

6.3JakartaDBCPDBCP

JakartaDBCPDBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。

6.4DDConnectionBrokerDDConnectionBroker

DDConnectionBrokerDDConnectionBroker是一个简单,轻量级的数据库连接池。

6.5DBPoolDBPool

DBPoolDBPool是一个高效的易配置的数据库连接池。

它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。

6.6XAPoolXAPoo

XAPoolXAPool是一个XA数据库连接池。

它实现了javax.sql.XADataSource并提供了连接池工具。

6.7PrimrosePrimrose

PrimrosePrimrose是一个Java开发的数据库连接池。

当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。

Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。

在重负荷的情况下可进行连接请求队列处理。

6.8SmartPoolSmartPool

SmartPoolSmartPool是一个连接池组件,它模仿应用服务器对象池的特性。

SmartPool能够解决一些临界问题如连接泄漏(connectionleaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等.SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象,在所设定time-outs之后察觉连接泄漏,追踪连接使用情况,强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。

6.9MiniConnectionPoolManagerMiniConnectionPoolManager

MiniConnectionPoolManagerMiniConnectionPoolManager是一个轻量级JDBC数据库连接池。

它只需要Java1.5(或更高)并且没有依赖第三方包。

6.10BoneCPBoneCP

  BoneCPBoneCP是一个快速,开源的数据库连接池。

帮你管理数据连接让你的应用程序能更快速地访问数据库。

比C3P0/DBCP连接池快25倍。

 

第二章数据库

1.数据库概述

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。

数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。

2.数据库连接池的基本原理

传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程式环境中这种耗费资源的动作对系统的性能影响尤为明显。

在多层结构的应用程式中通过连接池(connectionpooling)技术能使系统的性能明显得到提到,连接池意味着当应用程式需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连接来代替重新创建一个数据库连接。

通过这种方式,应用程式能减少对数据库连接操作,尤其在多层环境中多个客户端能通过共享少量的物理数据库连接来满足系统需求。

通过连接池技术Java应用程式不仅能提高系统性能同时也为系统提高了可测量性。

数据库连接池是运行在后台的而且应用程式的编码没有所有的影响。

此中状况存在的前提是应用程式必须通过DataSource对象(一个实现javax.sql.DataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。

一个实现javax.sql.DataSource接口的类能支持也能不支持数据库连接池,不过两者获得数据库连接的代码基本是相同的。

3.连接池的工作原理

在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。

数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:

Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。

  数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。

  数据库连接池的主要操作如下:

  

(1)建立数据库连接池对象(服务器启动)。

  

(2)按照事先指定的参数创建初始数量的数据库连接(即:

空闲连接数)。

  (3)对于一个数据库访问请求,直接从连接池中得到一个连接。

如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:

最大活跃连接数),创建一个新的数据库连接。

  (4)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。

如实际空闲连接数大于初始空闲连接数则释放连接)。

第三章连接池概念

1.连接池中的关键技术

连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

2.连接池的分配与释放

3.连接池的维护

packageorg.whvcse.dbms;

importjava.io.Serializable;

importjava.sql.SQLException;

importjava.util.Vector;

importorg.whvcse.dbms.domain.ConnectionInfo;

publicinterfaceIValidateextendsSerializable

{

publicVectorvalidate(Vectorv)throwsSQLException;

}

第四章系统总体设计思想及方案

设计理念

1.连接池中的管理机制

连接池管理策略是连接池机制的核心。

当连接池建立后,如何对连接池中的连接进行管理,解决好连接池连接的分配和释放,对系统的性能有很大的影响。

连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。

下面介绍连接池中连接的分配、释放策略。

  连接池的分配、释放策略对于有效复用连接非常重要,我们采用的方法是一个很有名的设计模式:

ReferenceCounting(引用记数)。

该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。

具体的实现方法是:

  当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。

如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。

如果没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最接数),如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。

  当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。

可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。

2.并发问题

 为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。

这个问题相对比较好解决,因为Java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。

使用方法为直接在类方法前面加上synchronized关键字,如:

  publicsynchronizedConnectiongetConnection()

3.连接池的分配与释放

  连接池的分配与释放,对系统的性能有很大的影响。

合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

  对于连接的管理可使用空闲池。

即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。

每当用户请求一个连接时,系统首先检查空闲池有没有空闲连接。

如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最接数(maxConn),如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。

如果在等待的时间有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)。

系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。

对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。

也可采取不开辟专门线程,只是在分配前检测的方法。

4.连接池的关闭

publicsynchronizedbooleandestory()throwsSQLException并发控制关闭连接池资源.

publicsynchronizedbooleandestory()throwsSQLException{

if(null==this.connectionPool)

thrownewSQLException("ConnectionUnInitializing");

for(ConnectionInfocon:

this.connectionPool){

con.getConnection().close();

con.setStartTime(0);

}

if(null!

=this.validateLink)

this.validateLink.clear();

this.validateLink=null;

this.connectionPool=null;

returnthis.connectionPool==null&&this.validateLink==null;

}

第五章设计流程

流程和实现

packageorg.whvcse.dbms.base;

importjava.io.Serializable;

importjava.sql.Connection;

importjava.sql.SQLException;

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Vector;

importorg.whvcse.dbms.IConnectionLoader;

importorg.whvcse.dbms.IConnectionPoolLoader;

importorg.whvcse.dbms.ISQLBase;

importorg.whvcse.dbms.IValidate;

importorg.whvcse.dbms.domain.ConnectionInfo;

importorg.whvcse.dbms.domain.Information;

importorg.whvcse.dbms.exception.LoadErrorException;

importorg.whvcse.dbms.loader.DefaultConnectionLoader;

importorg.whvcse.dbms.loader.PerpertiesLoader;

/**

*连接池总控制器

*author孟德军

*

*/

publicclassDriverManagerimplementsSerializable

{

privatestaticDriverManagermanager=null;

privateVectorconnectionPool=null;

privateISQLBasedataSource=null;

privateListvalidateLink=null;

privateConnectionInfoinfo=null;

//privateTransactiontransaction=null;

publicDriverManager(ISQLBasebase)throwsSQLException

{

this.dataSource=base;

//info.getConnection().

this.connectionPool=this.InitFromDataSource();

}

publicDriverManager(IConnectionPoolLoaderloader)throwsSQLException

{

this.connectionPool=this.InitFromConnectionPoolLoader(loader);

}

publicDriverManager(Stringpath)throwsSQLException,LoadErrorException

{

this.connectionPool=this.InitFromProperties(path);

}

/**

*添加验证联

*paramv验证程序

*return验证后的集合

*throwsNullPointerException

*/

publicsynchronizedintaddValidate(IValidatev)

throwsNullPointerException{

if(null==this.validateLink)

this.validateLink=newArrayList();

this.validateLink.add(v);

returnthis.validateLink.size();

}

privateVectorInitFromDataSource()throwsSQLException

{

Vectortv=newVector(this.dataSource.getMax());

if(null==this.dataSource)

thrownewSQLException("DataSourceInitializingFailture");

for(inti=0;i

{

try

{

Connectiontemp=this.dataSource.getConnection();

if(null!

=temp&&!

temp.isClosed())

{

ConnectionInfoinfo=newConnectionInfo();

info.setStartTime(System.currentTimeMillis());

info.setConnection(temp);

info.setId(tv.size()+1);

tv.add(info);

}

}

catch(SQLExceptione){

e.printStackTrace();

}

}

returntv;

}

privateVectorInitFromConnectio

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1