数据库连接池原理
1. 什么是java web开发中数据库的连接池技术,它的原理大致是什么
什么是连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
为什么要使用连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
2. 什么是数据库连接池,有什么作用
数据库连接是一种有限的昂贵的资源,
数据库连接影响到程序的性能指标。
数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、
管理和释放数据库连接,
它允许应用程序重复使用一个现有的数据库连接,
而再不是重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数
据库连接而引起的数据库连接遗漏。
这项技术能明显提高对数据库操作的性能。
3. 简单介绍连接池的优点和原理。
连接池运作原理在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。数据库连接池的主要操作如下:(1)建立数据库连接池对象(服务器启动)。(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。(4)存取数据库。(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。连接池的实现1、连接池模型 本文讨论的连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)。连接池类是对某一数据库所有连接的“缓冲池”,主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕之后,把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占用的系统资源;④还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。 连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:①装载并注册特定数据库的JDBC驱动程序;②根据属性文件给定的信息,创建连接池对象;③为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现连接池名字与其实例之间的映射;④跟踪客户使用连接情况,以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的用户使用不同的名称和密码。 2、连接池实现 下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口: public class DBConnectionPool implements TimerListener{ private int checkedOut;//已被分配出去的连接数 private ArrayList freeConnections = new ArrayList();//容器,空闲池,根据//创建时间顺序存放已创建但尚未分配出去的连接 private int minConn;//连接池里连接的最小数量 private int maxConn;//连接池里允许存在的最大连接数 private String name;//为这个连接池取个名字,方便管理 private String password;//连接数据库时需要的密码 private String url;//所要创建连接的数据库的地址 private String user;//连接数据库时需要的用户名 public Timer timer;//定时器 public DBConnectionPool(String name, String URL, String user, String password, int maxConn)//公开的构造函数 public synchronized void freeConnection(Connection con) //使用完毕之后,//把连接返还给空闲池 public synchronized Connection getConnection(long timeout)//得到一个连接,//timeout是等待时间 public synchronized void release()//断开所有连接,释放占用的系统资源 private Connection newConnection()//新建一个数据库连接 public synchronized void TimerEvent() //定时器事件处理函数 } public class DBConnectionManager { static private DBConnectionManager instance;//连接池管理类的唯一实例 static private int clients;//客户数量 private ArrayList drivers = new ArrayList();//容器,存放数据库驱动程序 private HashMap pools = new HashMap ();//以name/value的形式存取连接池//对象的名字及连接池对象 static synchronized public DBConnectionManager getInstance()//如果唯一的//实例instance已经创建,直接返回这个实例;否则,调用私有构造函数,创//建连接池管理类的唯一实例 private DBConnectionManager()//私有构造函数,在其中调用初始化函数init() public void freeConnection(String name, Connection con)// 释放一个连接,//name是一个连接池对象的名字 public Connection getConnection(String name)//从名字为name的连接池对象//中得到一个连接 public Connection getConnection(String name, long time)//从名字为name //的连接池对象中取得一个连接,time是等待时间 public synchronized void release()//释放所有资源 private void createPools(Properties props)//根据属性文件提供的信息,创建//一个或多个连接池 private void init()//初始化连接池管理类的唯一实例,由私有构造函数调用 private void loadDrivers(Properties props)//装载数据库驱动程序 } 3、连接池使用 上面所实现的连接池在程序开发时如何应用到系统中呢?下面以Servlet为例说明连接池的使用。 Servlet的生命周期是:在开始建立servlet时,调用其初始化(init)方法。之后每个用户请求都导致一个调用前面建立的实例的service方法的线程。最后,当服务器决定卸载一个servlet时,它首先调用该servlet的 destroy方法。 根据servlet的特点,我们可以在初始化函数中生成连接池管理类的唯一实例(其中包括创建一个或多个连接池)。如: public void init() throws ServletException { connMgr = DBConnectionManager.getInstance(); } 然后就可以在service方法中通过连接池名称使用连接池,执行数据库操作。最后在destroy方法中释放占用的系统资源,如: public void destroy() { connMgr.release(); super.destroy(); } 结束语在使用JDBC进行与数据库有关的应用开发中,数据库连接的管理是一个难点。很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈。对于众多用户访问的Web应用,采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。本文阐述了使用JDBC访问数据库的技术?讨论了基于连接池技术的数据库连接管理的关键问题并给出了一个实现模型。文章所给出的是连接池管理程序的一种基本模式,为提高系统的整体性能,在此基础上还可以进行很多有意义的扩展。 http://www.webdevelopersjournal.com/columns/connection_pool.html http://www.webdevelopersjournal.com/columns/DBConnectionManager.java
4. 数据库连接池的工作机制是什么
数据库连接池在初始悄嫌化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。对数据库连接的管理能显着影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。
数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个,释放空闲时间超过最大空闲时间的数据库连接来避免因为没启衫手有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
(4)数据库连接池原理扩展阅读:
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的塌衡数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
5. 说出数据连接池的工作机制是什么
以典型的数据库连接池为例: 首先普通的数据库访问是这样的:程序和数据库建立连接,发送数据操作的指令,完成后断开连接。等下一次请求的时候重复这个过程,即每个请求都需要和数据库建立连接和断开连接,这样当数据量大的时候系统的消耗是很大的。连接池就是为了解决这个问题:在一个空间中预先建立好一定数量的连接,当程序请求数据时直接使用池中的现存的连接,不需要重复建立连接和断开的过程,节省了时间提高了性能