数据库连接池原理
——连接池用什么数据结构实现?
—— 实现连接池的代码
—— 线程安全问题
【数据库连接池的设计思路及 java 实现】【 http://blog.csdn.net/shijinupc/article/details/7836129】
【Java 的 JDBC 数据库连接池实现方法】【 http://developer.51cto.com/art/200907/137300.htm 】
|
【设计数据库连接池,要考虑哪些问题?】
1. 有一个简单的函数从连接池中得到一个 Connection。
2. close 函数必须将 connection 放回数据库连接池。
3. 当数据库连接池中没有空闲的 connection,数据库连接池必须能够自动增加connection 个数。
4. 当数据库连接池中的 connection 个数在某一个特别的时间变得很大,但是以后很长时间只用其中一小部分,自动将多余 connection 关闭。
5. 如果可能,应该提供 debug 信息报告没有关闭的new Connection。
【四个流行的 Java 连接池】
C3P0 是一个开放源代码的 JDBC 连接池,它在 lib 目录中与 Hibernate 一起发布, 包括了实现 jdbc3 和 jdbc2 扩展规范说明的 Connection 和 Statement 池的 DataSources 对象。
BoneCP 是一个开源的快速的 JDBC 连接池。BoneCP 很小,只有四十几 K(运行时需要 log4j 和 Google Collections 的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多 K。另外个人觉得 BoneCP 有个缺点是,JDBC 驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。
DBCP (Database Connection Pool)是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池,Tomcat 的数据源使用的就是 DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而 1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。
Proxool 是一个 Java SQL Driver 驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的 JDBC 驱动程序增加连接池功能。
BoneCP 是一个开源的快速的 JDBC 连接池。BoneCP 很小,只有四十几 K(运行时需要 log4j 和 Google Collections 的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多 K。另外个人觉得 BoneCP 有个缺点是,JDBC 驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。
DBCP (Database Connection Pool)是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池,Tomcat 的数据源使用的就是 DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而 1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。
Proxool 是一个 Java SQL Driver 驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的 JDBC 驱动程序增加连接池功能。
原文链接: http://coolshell.cn/articles/2483.html
【 java 数据库连接池实现原理 】 【 http://blog.csdn.net/frightingforambition/article/details/25464129 】
|
一、为什么在连接数据库时要使用连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。
数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池 (简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。
对于多于连接池中连接数的并发请求,应该在 请求队列中排队等待。
并且应用程序可以根据池中连接的使用率, 动态增加或减少池中的连接数。
连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。
通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的 管理机制来 监视数据库连接的数量、使用情况等。
二、数据库连接池的基本原理
数据库连接池的基本思想就是 为数据库连接建立一个“缓冲池”。
—— 预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
——我们可以通过 设定连接池最大连接数来防止系统无尽的与数据库连接。
——更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发测试及性能调整提供依据。
三、数据库连接池的工作原理
连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。
第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意 创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java 中提供了很多容器类可以方便的构建连接池,例如 Vector、Stack 等。
第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其 管理策略是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接, 如果存在空闲连接,则将连接分配给客户使用;
三、数据库连接池的工作原理
连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。
第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意 创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java 中提供了很多容器类可以方便的构建连接池,例如 Vector、Stack 等。
第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其 管理策略是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接, 如果存在空闲连接,则将连接分配给客户使用;
如果没有空闲连接,则查看当前所开的连接数 是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;
如果达到就按设定的 最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。
当客户释放数据库连接时,先判断 该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。
四、连接池关键问题分析
1、并发问题
为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为 Java 语言自身提供了对并发管理的支 持,使用 synchronized 关键字即可确保线程是同步的。使用方法为直接在类方法前面加上 synchronized 关键字,如:
public synchronized Connection getConnection()
当客户释放数据库连接时,先判断 该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。
四、连接池关键问题分析
1、并发问题
为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为 Java 语言自身提供了对并发管理的支 持,使用 synchronized 关键字即可确保线程是同步的。使用方法为直接在类方法前面加上 synchronized 关键字,如:
public synchronized Connection getConnection()
2、多数据库服务器和多用户
对于大型的企业级应用,常常需要同时连接不同的数据库 (如连接 Oracle 和 Sybase)。如何连接不同的数据库呢? 我们采用的策略是:设计 一个符合 单例模式的连接池管理类, 在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的 url 地址 ()? 用户名()? 密 码() 等信息。如 tx.url=172.21.15.123:5000/tx_it,tx.user=yang,tx.password=yang321。根据资源文件提 供的信息,创建 多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来 管理不同的连接池。
对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件处理,即在资源文件中设置多个具有相同 url 地址,但具有不同用户名和密码的数据库连接信息。
3、事务处理
我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则, 即对于一组 SQL 语句要么全做,要么全不做。
在 Java 语言中, Connection 类本身提供了对事务的支持,可以通过设置 Connection 的 AutoCommit 属性为 false, 然后显式的调用 commit 或 rollback 方法来实现。但要高效的进行 Connection 复用,就必须提供相应的事务支持机制。可采用 每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性。
4、连接池的分配与释放
连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。
对于连接的管理可使用 空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长 (通过容器的顺序存放实现) 的那个连接分配给他(实际是 先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接 );
如果没有则检查当前所开连接池 是否达到连接池所允许的最大连接数(maxConn), 如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间 (timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用 户,如果等待时间超过预定时间 timeout, 则返回空值 (null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲 连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。
5、连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳? 系统可采取设置 最小连接数 (minConn) 和最大连接数(maxConn)来 控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快; 如果创建过少,则系统 启动的很 快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连 接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。
如何确保连接池中的最小连接数呢? 有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接, 以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
【 http://qustlxhnb.blog.163.com/blog/static/1878100322011824105542751/ 】
创建和管理 [数据库连接] 的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用 JDBC 对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。
【连接池的优点】
第一、减少连接创建时间。连接池中的连接是已准备好的、可重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。
第二、简化的编程模式。当使用连接池时,每一个单独的线程能够像创建一个自己的 JDBC 连接一样操作,允许用户直接使用 JDBC 编程技术。
第三、控制资源的使用。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统连接需求影响很大,很容易产生资源浪费和高负载异 常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的连接数量,增强了系统在大量用户应用时的稳定性。
【连接池的工作原理】
连接池技术的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用、分配和管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。
连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。
第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java 中提供了很多容器类可以方便的构建连接池,例如 Vector、Stack等。
第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:
——当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;
——如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;
——如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。
——当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。