??xml version="1.0" encoding="utf-8" standalone="yes"?>卡一卡二国产精品,а√在线中文在线新版,亚洲传媒在线http://www.aygfsteel.com/machilansing/category/13992.htmlLansing--Coding 不是? zh-cnWed, 28 Feb 2007 21:11:40 GMTWed, 28 Feb 2007 21:11:40 GMT60ZJDBC的数据库q接池技术研I与应用http://www.aygfsteel.com/machilansing/articles/61313.htmlLansingLansingWed, 02 Aug 2006 03:15:00 GMThttp://www.aygfsteel.com/machilansing/articles/61313.htmlhttp://www.aygfsteel.com/machilansing/comments/61313.htmlhttp://www.aygfsteel.com/machilansing/articles/61313.html#Feedback0http://www.aygfsteel.com/machilansing/comments/commentRss/61313.htmlhttp://www.aygfsteel.com/machilansing/services/trackbacks/61313.html
Java应用E序讉K数据库的基本原理

  在Java语言中,JDBCQJava DataBase ConnectionQ是应用E序与数据库沟通的桥梁,

  即Java语言通过JDBC技术访问数据库。JDBC是一U“开䏀的ҎQ它为数据库应用开发h员﹑数据库前台工具开发h员提供了一U标准的应用E序设计接口Q开发h员可以用UJava语言~写完整的数据库应用E序。JDBC提供两种APIQ分别是面向开发h员的API和面向底层的JDBC驱动E序APIQ底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实C数据库的q接?/p>

  一般来_Java应用E序讉K数据库的q程Q如?所C)是:

  ①装载数据库驱动E序Q?/p>

  ②通过JDBC建立数据库连接;

  ③访问数据库Q执行SQL语句Q?/p>

  ④断开数据库连接?/p>
? Java数据库访问机制  JDBC作ؓ一U数据库讉K技术,h单易用的优点。但使用q种模式q行Web应用  E序开发,存在很多问题Q首先,每一ơWebh都要建立一ơ数据库q接。徏立连接是一个费时的zdQ每ơ都得花?.05s?s的时_而且pȝq要分配内存资源。这个时间对于一ơ或几次数据库操作,或许感觉不出pȝ有多大的开销。可是对于现在的Web应用Q尤其是大型电子商务|站Q同时有几百人甚臛_千h在线是很正常的事。在q种情况下,频繁的进行数据库q接操作势必占用很多的系l资源,|站的响应速度必定下降Q严重的甚至会造成服务器的崩溃。不是危a耸听Q这是制约某些电子商务|站发展的技术瓶颈问题。其ơ,对于每一ơ数据库q接Q用完后都得断开。否则,如果E序出现异常而未能关闭,会D数据库系l中的内存泄漏,最l将不得不重启数据库。还有,q种开发不能控制被创徏的连接对象数Q系l资源会被毫无顾及的分配出去Q如q接q多Q也可能D内存泄漏Q服务器崩溃?    数据库连接池Qconnection poolQ的工作原理  1、基本概念及原理  ׃面的分析可以看出Q问题的Ҏ在于对数据库连接资源的低效理。我们知道,  对于׃n资源Q有一个很著名的设计模式:资源池(Resource PoolQ。该模式正是Z解决资源的频J分配﹑释放所造成的问题。ؓ解决上述问题Q可以采用数据库q接池技术。数据库q接池的基本思想是为数据库q接建立一个“缓冲池”。预先在~冲池中攑օ一定数量的q接Q当需要徏立数据库q接Ӟ只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过讑֮q接池最大连接数来防止系l无的与数据库q接。更为重要的是我们可以通过q接池的理机制监视数据库的q接的数量﹑使用情况Qؓpȝ开发﹑试及性能调整提供依据。连接池的基本工作原理见下图2?
? q接池的基本工作原理  2、服务器自带的连接池  JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere{提供了q接池的机制Q但是必L其第三方的专用类Ҏ支持q接池的用法。  q接池关键问题分析  1、ƈ发问题  Z使连接管理服务具有最大的通用性,必须考虑多线E环境,卛_ƈ发问题。这个问题相Ҏ较好解决Q因为Java语言自n提供了对q发理的支持,使用synchronized关键字即可确保线E是同步的。用方法ؓ直接在类Ҏ前面加上synchronized关键字,如: public synchronized Connection getConnectionQ)   2、多数据库服务器和多用户  对于大型的企业应用Q常帔R要同时连接不同的数据库(如连接Oracle和SybaseQ。如何连接不同的数据库呢Q我们采用的{略是:设计一个符合单例模式的q接池管理类Q在q接池管理类的唯一实例被创建时d一个资源文Ӟ其中资源文g中存攄多个数据库的url地址Q?lt;poolName.url>Q﹑用户名(<poolName.user>Q﹑密码Q?lt;poolName.password>Q等信息。如tx.url=172.21.15.123Q?000/tx_itQtx.user=yangQtx.password=yang321。根据资源文件提供的信息Q创建多个连接池cȝ实例Q每一个实例都是一个特定数据库的连接池。连接池理cd例ؓ每个q接池实例取一个名字,通过不同的名字来理不同的连接池。  对于同一个数据库有多个用户用不同的名称和密码访问的情况Q也可以通过资源文g处理Q即在资源文件中讄多个h相同url地址Q但h不同用户名和密码的数据库q接信息。  3、事务处理  我们知道Q事务具有原子性,此时要求Ҏ据库的操作符合“ALL-ALL-NOTHING”原?卛_于一lSQL语句要么全做Q要么全不做。  在Java语言中,ConnectioncLw提供了对事务的支持Q可以通过讄Connection的AutoCommit属性ؓfalse,然后昑ּ的调用commit或rollbackҎ来实现。但要高效的q行Connection复用Q就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现Q这U方法可以大大降低事务管理的复杂性。  4、连接池的分配与释放  q接池的分配与释放,对系l的性能有很大的影响。合理的分配与释放,可以提高q接的复用度Q从而降低徏立新q接的开销Q同时还可以加快用户的访问速度。  对于q接的管理可使用I闲池。即把已l创Z未分配出去的连接按创徏旉存放C个空闲池中。每当用戯求一个连接时Q系l首先检查空闲池内有没有I闲q接。如果有把建立旉最长(通过容器的顺序存攑֮玎ͼ的那个连接分配给他(实际是先做连接是否有效的判断Q如果可用就分配l用P如不可用把q个q接从空闲池删掉Q重新检空闲池是否q有q接Q;如果没有则检查当前所开q接池是否达到连接池所允许的最大连接数QmaxConnQ?如果没有辑ֈQ就新徏一个连接,如果已经辑ֈQ就{待一定的旉QtimeoutQ。如果在{待的时间内有连接被释放出来可以把q个q接分配l等待的用户Q如果等待时间超q预定时间timeout,则返回空|nullQ。系l对已经分配出去正在使用的连接只做计敎ͼ当用完后再q还l空闲池。对于空闲连接的状态,可开辟专门的U程定时,q样会花费一定的pȝ开销Q但可以保证较快的响应速度。也可采取不开辟专门线E,只是在分配前的Ҏ。  5、连接池的配|与l护  q接池中到底应该攄多少q接Q才能ɾpȝ的性能最佻Ipȝ可采取设|最连接数QminConnQ和最大连接数QmaxConnQ来控制q接池中的连接。最连接数是系l启动时q接池所创徏的连接数。如果创多,则系l启动就慢,但创建后pȝ的响应速度会很快;如果创徏q少Q则pȝ启动的很快,响应h却慢。这P可以在开发时Q设|较的最连接数Q开发v来会快,而在pȝ实际使用时设|较大的Q因样对讉K客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体讄多少Q要看系l的讉K量,可通过反复试Q找到最佳点。  如何保q接池中的最连接数呢?有动态和静态两U策略。动态即每隔一定时间就对连接池q行,如果发现q接数量于最连接数Q则补充相应数量的新q接,以保证连接池的正常运转。静态是发现I闲q接不够时再L查?    q接池的实现  1、连接池模型  本文讨论的连接池包括一个连接池c(DBConnectionPoolQ和一个连接池理c(DBConnetionPoolManagerQ。连接池cLҎ一数据库所有连接的“缓冲池”,主要实现以下功能Q①从连接池获取或创建可用连接;②用完毕之后,把连接返q给q接池;③在pȝ关闭前,断开所有连接ƈ释放q接占用的系l资源;④还能够处理无效q接Q原来登Cؓ可用的连接,׃某种原因不再可用Q如时Q通讯问题Q,q能够限制连接池中的q接L不低于某个预定值和不超q某个预定倹{  q接池管理类是连接池cȝ外覆c(wrapperQ?W合单例模式Q即pȝ中只能有一个连接池理cȝ实例。其主要用于对多个连接池对象的管理,h以下功能Q①装蝲q注册特定数据库的JDBC驱动E序Q②Ҏ属性文件给定的信息Q创接池对象Q③为方便管理多个连接池对象Qؓ每一个连接池对象取一个名字,实现q接池名字与其实例之间的映射Q④跟踪客户使用q接情况Q以侉K要是关闭q接释放资源。连接池理cȝ引入主要是ؓ了方便对多个q接池的使用和管理,如系l需要连接不同的数据库,或连接相同的数据库但׃安全性问题,需要不同的用户使用不同的名U和密码。  2、连接池实现  下面l出q接池类和连接池理cȝ主要属性及所要实现的基本接口Q?public class DBConnectionPool implements TimerListener{
private int checkedOut;//已被分配出去的连接数
private ArrayList freeConnections = new ArrayList();//容器Q空闲池Q根?/创徏旉序存放已创Z未分配出去的连?br />private int minConn;//q接池里q接的最数?br />private int maxConn;//q接池里允许存在的最大连接数
private String name;//个连接池取个名字Q方便管?br />private String password;//q接数据库时需要的密码
private String url;//所要创接的数据库的地址
private String user;//q接数据库时需要的用户?br />public Timer timer;//定时?br />public DBConnectionPool(String name, String URL, String user, String
password, int maxConn)//公开的构造函?br />public synchronized void freeConnection(Connection con) //使用完毕之后Q?/把连接返q给I闲?br />public synchronized Connection getConnection(long timeout)//得到一个连接,//timeout是等待时?br />public synchronized void release()//断开所有连接,释放占用的系l资?br />private Connection newConnection()//新徏一个数据库q接
public synchronized void TimerEvent() //定时器事件处理函?} public class DBConnectionManager {
static private DBConnectionManager instance;//q接池管理类的唯一实例
static private int clients;//客户数量
private ArrayList drivers = new ArrayList();//容器Q存放数据库驱动E序 private HashMap pools = new HashMap ();//以name/value的Ş式存取连接池//对象的名字及q接池对?br />static synchronized public DBConnectionManager getInstance()//如果唯一?/实例instance已经创徏Q直接返回这个实?否则Q调用私有构造函敎ͼ?/接池理cȝ唯一实例 private DBConnectionManager()//U有构造函?在其中调用初始化函数init() public void freeConnection(String name, Connection con)// 释放一个连接,//name是一个连接池对象的名?public Connection getConnection(String name)//从名字ؓname的连接池对象//中得C个连?public Connection getConnection(String name, long time)//从名字ؓname //的连接池对象中取得一个连接,time是等待时?public synchronized void release()//释放所有资?private void createPools(Properties props)//Ҏ属性文件提供的信息Q创?/一个或多个q接?private void init()//初始化连接池理cȝ唯一实例Q由U有构造函数调?private void loadDrivers(Properties props)//装蝲数据库驱动程?}    3、连接池使用  上面所实现的连接池在程序开发时如何应用到系l中呢?下面以ServletZ说明q接池的使用。  Servlet的生命周期是Q在开始徏立servletӞ调用其初始化QinitQ方法。之后每个用戯求都D一个调用前面徏立的实例的serviceҎ的线E。最后,当服务器军_卸蝲一个servletӞ它首先调用该servlet?destroyҎ。  Ҏservlet的特点,我们可以在初始化函数中生成连接池理cȝ唯一实例Q其中包括创Z个或多个q接池)。如Q?public void init() throws ServletException
{
 connMgr = DBConnectionManager.getInstance();
}    然后可以在serviceҎ中通过q接池名UC用连接池Q执行数据库操作。最后在destroyҎ中释攑֍用的pȝ资源Q如Q?public void destroy() {
 connMgr.release(); super.destroy();
}   l束语  在用JDBCq行与数据库有关的应用开发中Q数据库q接的管理是一个难炏V很多时候,q接的؜q理所造成的系l资源开销q大成ؓ制约大型企业U应用效率的瓉。对于众多用戯问的Web应用Q采用数据库q接技术的pȝ在效率和E_性上比采用传l的其他方式的系l要好很多。本文阐qC使用JDBC讉K数据库的技术﹑讨论了基于连接池技术的数据库连接管理的关键问题q给Z一个实现模型。文章所l出的是q接池管理程序的一U基本模式,为提高系l的整体性能Q在此基上还可以q行很多有意义的扩展?/span>

Lansing 2006-08-02 11:15 发表评论
]]>
վ֩ģ壺 ƽ| º| | ˮ| ˮ| | | ˮ| ͬ| | | | ˼| | ͷ| Ϫ| | | | | | | ֬| | | | Ϫ| | | | ƴ| ƽɽ| | | | | ƽ| | ʵ| ء| |