数据库连接池技术
- 格式:doc
- 大小:763.00 KB
- 文档页数:24
MySQL中的连接池使用与配置方法在开发和运维过程中,数据库是一个非常重要的组成部分。
针对高并发的场景,数据库连接的创建和关闭是一个非常耗时的操作,通常会导致性能瓶颈。
为了解决这个问题,我们可以使用连接池来缓解数据库连接的创建和关闭带来的性能问题。
连接池是一种数据库连接的管理机制,它可以预先创建一定数量的数据库连接,并将这些连接保存在一个池中。
当应用程序需要访问数据库时,可以直接从连接池中获取一个空闲的连接,使用完毕后再将连接返回给连接池。
这样可以减少每次访问数据库时创建和关闭连接的时间,提高了应用程序的响应速度和并发处理能力。
在MySQL中,连接池是通过使用连接池软件实现的。
常见的连接池软件有C3P0、Druid等。
接下来,我们将重点介绍如何使用Druid连接池,并对其进行配置。
Druid是阿里巴巴开源的一个高性能、可扩展的数据库连接池。
它具有监控、可扩展、可配置等特点,并且在高并发环境下表现出色。
下面我们将分步骤介绍如何在MySQL中使用Druid连接池。
第一步:添加Druid依赖在项目的pom.xml文件中添加Druid的依赖。
可以通过以下方式引入其最新版本:```xml<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.5</version></dependency>```第二步:配置数据源在项目的配置文件中,添加Druid的数据源配置。
可以根据实际情况进行配置,以下是一个示例配置:```yamlspring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 123456# 配置数据源类型和驱动type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver# 配置Druid连接池的相关参数druid:# 初始化连接数initial-size: 5# 最小空闲连接数min-idle: 5# 最大活跃连接数max-active: 20# 获取连接时的最大等待时间,单位毫秒max-wait: 60000# 配置测试连接的SQL语句validation-query: SELECT 1# 配置获取连接时是否验证连接的有效性test-on-borrow: true```在上述配置中,需要注意以下几点:- `url`、`username`和`password`配置的是数据库的连接信息。
python. 连接池原理Python连接池原理连接池是一种常见的技术,用于管理数据库连接、网络连接或其他资源。
在Python中,连接池用于提高性能和效率,减少资源的重复创建和销毁。
本文将详细介绍Python连接池的原理、实现方式和使用方法。
一、连接池的概念连接池是一种管理和复用资源的技术。
在数据库或网络编程中,会频繁地创建和销毁连接,这样会消耗大量的时间和资源。
而连接池的作用就是将连接保存在一个池中,当需要连接时,从池中获取已存在的连接,而不是每次都创建新的连接。
这样可以避免频繁地创建和销毁连接,提高程序的性能和效率。
连接池通常包含以下几个关键组成部分:1. 连接池管理器(Pool Manager):负责管理连接池的创建、销毁和连接分配。
2. 连接池(Connection Pool):实际存储和管理连接的容器,通常是一个数据结构,如列表或哈希表。
3. 连接对象(Connection Object):具体的连接对象,如数据库连接对象或网络连接对象,它们需要实现获取和释放连接的方法。
二、连接池的实现方式Python中连接池的实现方式主要有两种:线程池和进程池。
下面将分别介绍这两种方式的原理和使用方法。
1. 线程池线程池是最常见的连接池实现方式之一。
它使用线程作为连接的载体,通过创建一定数量的线程,将连接保存在一个列表中。
当需要连接时,从列表中获取一个空闲的连接,并将其标记为使用中。
连接使用完毕后,再将其标记为空闲,放回连接池供其他线程使用。
下面是一个简单的线程池实现示例:pythonimport threadingimport queueclass ConnectionPool:def __init__(self, max_connections):self.connections = queue.Queue(max_connections)for _ in range(max_connections):self.connections.put(Connection())def get_connection(self):conn = self.connections.get()conn.set_busy(True)return conndef return_connection(self, conn):conn.set_busy(False)self.connections.put(conn)class Connection:def __init__(self):self.busy = Falsedef set_busy(self, value):self.busy = valuedef execute(self, sql):# 执行SQL语句pass在上面的示例中,ConnectionPool类表示线程池,connections队列保存连接对象。
数据库连接池配置参数对性能的影响分析及其在实际项目中的应用效果评估数据库连接池是一个常见的数据访问技术,它通过预先创建一定数量的数据库连接对象,将其保存在池中供客户端使用。
在实际项目中,正确配置数据库连接池的参数对性能有着重要的影响。
本文将分析不同数据库连接池配置参数对性能的影响,并评估其在实际项目中的应用效果。
数据库连接池的性能受多个相关参数的影响,其中包括最大连接数、最小空闲连接数、连接超时时间、连接验证查询等。
这些参数的配置需要根据具体的项目场景和需求进行调整。
首先,最大连接数是决定数据库连接池能同时处理的最大连接请求数量。
如果设置得过小,可能会导致同时连接请求过多而出现连接超时或连接被拒绝的情况。
相反,设置得过大会占用过多的系统资源。
因此,根据项目实际需求,合理设置最大连接数可以提高系统的稳定性和性能。
其次,最小空闲连接数是指连接池中保持的最小空闲连接数量。
这个参数的设置对于连接池中闲置连接的管理和性能优化至关重要。
设置过小,可能导致频繁创建和销毁连接,增加系统开销;设置过大,会占用过多的系统资源。
合理设置最小空闲连接数可以减少连接创建和销毁的开销,提高系统的性能表现。
连接超时时间是指一个连接在被返回给连接池之前所允许的最大空闲时间。
设置过短会导致频繁创建和销毁连接,降低系统性能。
而设置过长则可能导致连接对象长时间占用资源,限制了其他连接的可用性。
因此,根据业务需求和系统负荷,合理设置连接超时时间可以提高系统的性能和可靠性。
连接验证查询是一个配置参数,允许连接池通过执行SQL查询来验证每个连接的有效性。
这个验证功能可以防止因连接断开而在应用层面仍然保持连接。
由于数据库连接的创建和断开操作开销较大,通过连接验证查询可判断连接是否仍处于活动状态,从而复用已建立的连接,提高性能和资源利用率。
评估不同参数配置的实际应用效果时,可以通过性能测试工具和监控指标来进行评估。
例如,可以使用Apache JMeter等工具进行并发测试,观察各配置参数对系统响应时间和吞吐量的影响。
连接池技术c3po连接池主要功能,输出连接数据库的连接。
内部可以控制存贮多少个连接// c3p0两种配置⽅式,1代码内嵌式,2是配置⽂件读取// 1:默认去classpath路径下找c3p0-config.xml⽂件加载进来ComboPooledDataSource cpds = new ComboPooledDataSource();// 2:得到数据库连接Connection conn = cpds.getConnection();//以上是c3p0能做的事情Statement st = conn.createStatement();int sum = st.executeUpdate("insert user (username)values('1s');");System.out.println(sum);/**外部c3p0-config.xml⽂件* <c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property><property name="user">root</property><property name="password">root</property></default-config></c3p0-config>// 1:默认去classpath路径下找c3p0-config.xml⽂件加载进来,不能有这个配置⽂件不然代码内置的就不起作⽤。
连接池的概念及作⽤
定义:连接池是创建和管理⼀个连接的缓冲池的技术,这些连接准备好被任何需要它们的使⽤。
外⽂名:Connection Pool
性质:创建和管理连接的缓冲池的技术
作⽤
连接池的作⽤就是管理连接,因为如果单纯的⽤JDBC去连接的话,频繁的开启和关闭连接对于数据库也是⼀种负担。
使⽤连接池技术后,可以不必频繁开启关闭连接需要的时候就去⽤就好了,这样是资源重⽤,⽽且有更快的系统反应速度
什么是数据库连接池(原理)
所谓数据库连接池,可以看作:在⽤户和数据库之间创建⼀个”池”,这个池中有若⼲个连接对象,当⽤户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。
⼀旦连接池中的连接对象被拿光了,下⼀个想要操作数据库的⽤户必须等待,等待其他⽤户释放连接对象,把它放回连接池中,这时候等待的⽤户才能获取连接对象,从⽽操作数据库。
数据库连接池的属性
连接对象初始的数量:initSize,⼀开始就创建若⼲个,当不够时再添加
连接对象最⼤数量:maxSize,添加到最⼤值则不会再添加。
.Net与Oracle的数据库连接池(ConnectionPool)数据库连接池允许应用程序重用已存在于池中的数据库连接,以避免反复的建立新的数据库连接。
这种技术能有效提高应用程序的伸缩性,因为有限的数据库连接能够给大量的客户提供服务。
这种技术同时也提高的系统性能,避免了大量建立新连接的开销。
开发一个具有伸缩性的、高性能应用程序应该最大限度的减少建立连接所花费的时间,保持数据库连接最大限度的有效,以存取数据。
当一个数据库连接关闭时,它只是由连接池收回以待重用,并未真正释放。
但是,如果连接池被释放,数据库连接将会被释放掉。
开发人员应当注意不要依赖垃圾回收机制去释放数据库连接,因为当参数超出作用域时,数据库连接并没有得必要的关闭,这种数据库资源泄漏将导致建立新连接时抛出连接错误。
建立数据库连接池当打开一个数据库连接时,一个数据库连接池也就创建了。
数据库连接池的创建与数据库连接字符串精确的相关(包括空格、大小写)。
所有的连接池是根据连接字符串来区分的。
在创建一个新的数据库连接时,如果连接字符串不完全相同,将创建不同的连接池。
一旦数据库连接池被创建,它将一直存在直到该进程结束。
维护一个非活动状态的连接池几乎不需要什么系统开销。
连接池中的数据库连接连接池根据唯一的连接字符串被创建。
在连接池被创建的同时,连接池将创建最小的数据库连接,当连接不够用时,连接池将逐个添加数据库连接直到达到最大连接数,此后的连接请求将被加入请求队列里。
当调用数据库连接对象的Close方法或Dispose方法时,数据库连接将被数据库连接池回收。
当数据库连接使用完成后,要调用Close方法或Dispose方法将它返回连接池。
没有显式释放的数据库连接可能会没有返回连接池。
注意不要在类的Finalize方法中调用任何管理类如Connection,DataReader等的Finalize方法,必须将数据库连接的释放权交给连接池。
释放数据库连接当数据库连接超时或服务已经完成时,连接池将会将其资源释放,这只能通过试图与数据库通讯来判断。
1.将数据库驱动程序的JAR文件放在Tomcat的common/lib中;2.在server.xml中设置数据源,以MySQL数据库为例,如下:在<GlobalNamingResources></GlobalNamingResources>节点中加入,<Resourcename="jdbc/DBPool"type="javax.sql.DataSource"password="root"driverClassName="com.mysql.jdbc.Driver"maxIdle="2"maxWait="5000"username="root"url="jdbc:mysql://127.0.0.1:3306/test"maxActive="4"/>属性说明:name,数据源名称,通常取”jdbc/XXX”的格式;type,”javax.sql.DataSource”;password,数据库用户密码;driveClassName,数据库驱动;maxIdle,最大空闲数,数据库连接的最大空闲时间。
超过空闲时间,数据库连接将被标记为不可用,然后被释放。
设为0表示无限制。
MaxActive,连接池的最大数据库连接数。
设为0表示无限制。
maxWait,最大建立连接等待时间。
如果超过此时间将接到异常。
设为-1表示无限制。
3.在你的web应用程序的web.xml中设置数据源参考,如下:在<web-app></web-app>节点中加入,<resource-ref><description>MySQL DB Connection Pool</description><res-ref-name>jdbc/DBPool</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth><res-sharing-scope>Shareable</res-sharing-scope></resource-ref>子节点说明:description,描述信息;res-ref-name,参考数据源名字,同上一步的属性name;res-type,资源类型,”javax.sql.DataSource”;res-auth,”Container”;res-sharing-scope,”Shareable”;4.在web应用程序的context.xml中设置数据源链接,如下:在<Context></Context>节点中加入,<ResourceLinkname="jdbc/DBPool"type="javax.sql.DataSource"global="jdbc/DBPool"/>属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;type,同样取”javax.sql.DataSource”;global,同name值。
数据库连接池的最大超时时间数据库连接池的最大超时时间1. 引言数据库连接池是一种用于管理数据库连接的机制,它可以提高数据库访问的效率和性能。
连接池中的连接可以被多个线程共享,从而避免了频繁地创建和释放数据库连接。
在数据库连接池的配置中,一个重要的参数是最大超时时间。
2. 数据库连接池的概述数据库连接池是一个位于应用程序和数据库之间的中间层。
当应用程序需要访问数据库时,它可以从连接池中获取一个空闲的数据库连接,而不必重新创建一个新的连接。
使用连接池可以有效地管理数据库连接,降低数据库服务器的负载,提高系统的响应速度。
3. 最大超时时间的定义最大超时时间是指连接在连接池中闲置的最大时间。
当一个连接在连接池中空闲的时间超过最大超时时间时,它将被自动关闭,释放数据库连接资源。
这个参数的设置对数据库连接的有效利用和系统性能有着重要的影响。
4. 最大超时时间的重要性设置合理的最大超时时间可以避免连接在连接池中过长时间的闲置,减少连接资源的浪费。
如果最大超时时间设置得太短,连接可能会被过早地关闭,导致后续的数据库访问操作失败。
而如果最大超时时间设置得太长,连接池中的连接可能会一直占用着宝贵的资源,导致数据库服务器的负载过高。
5. 最大超时时间的配置在常见的数据库连接池实现中,如Apache Commons DBCP、C3P0等,都提供了设置最大超时时间的接口或参数。
一般情况下,最大超时时间的单位是毫秒,可以通过修改相应的配置文件或调用相关的API来进行设置。
6. 最大超时时间的选择选择合适的最大超时时间需要综合考虑应用程序的数据库访问模式、数据库服务器的负载情况和系统的性能需求等因素。
一般来说,对于短时任务或并发较高的系统,可以适当设置较短的超时时间以迅速释放连接资源。
而对于长时任务或连接稀缺的系统,可以适当设置较长的超时时间以减少连接的创建和释放频率。
7. 最大超时时间的监控与调优为了保证数据库连接池的性能和稳定性,需要及时监控和调优最大超时时间。
Java中⼏种常⽤数据库连接池的使⽤⽬录⼀、应⽤程序直接获取数据库连接的缺点⼆、使⽤数据库连接池优化程序性能2.1、数据库连接池的基本概念2.2、编写数据库连接池三、开源数据库连接池3.1、DBCP数据源3.2、在应⽤程序中加⼊dbcp连接池3.3、C3P0数据源(重点)四、Tomcat中配置数据库源4.1、JNDI技术简介4.2、配置Tomcat数据源包结构:注意了:有个问题坑了我⼀天具体请看:tomcat虚拟路径的配置⼀、应⽤程序直接获取数据库连接的缺点 ⽤户每次请求都需要向数据库获得链接,⽽数据库创建连接通常需要消耗相对较⼤的资源,创建时间也较长。
假设⽹站⼀天10万访问量,数据库服务器就需要创建10万次连接,极⼤的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
如下图所⽰:⼆、使⽤数据库连接池优化程序性能2.1、数据库连接池的基本概念 数据库连接是⼀种关键的有限的昂贵的资源,这⼀点在多⽤户的⽹页应⽤程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应⽤程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是重新建⽴⼀个。
如下图所⽰:数据库连接池在初始化时将创建⼀定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最⼩数据库连接数来设定的.⽆论这些数据库连接是否被使⽤,连接池都将⼀直保证⾄少拥有这么多的连接数量.连接池的最⼤数据库连接数量限定了这个连接池能占有的最⼤连接数,当应⽤程序向连接池请求的连接数超过最⼤连接数量时,这些请求将被加⼊到等待队列中.数据库连接池的最⼩连接数和最⼤连接数的设置要考虑到以下⼏个因素:最⼩连接数:是连接池⼀直保持的数据库连接,所以如果应⽤程序对数据库连接的使⽤量不⼤,将会有⼤量的数据库连接资源被浪费.最⼤连接数:是连接池能申请的最⼤连接数,如果数据库连接请求超过次数,后⾯的数据库连接请求将被加⼊到等待队列中,这会影响以后的数据库操作如果最⼩连接数与最⼤连接数相差很⼤:那么最先连接请求将会获利,之后超过最⼩连接数量的连接请求等价于建⽴⼀个新的数据库连接.不过,这些⼤于最⼩连接数的数据库连接在使⽤完不会马上被释放,他将被放到连接池中等待重复使⽤或是空间超时后被释放.2.2、编写数据库连接池 编写连接池需实现java.sql.DataSource接⼝。
lettuce连接池心跳检测原理Lettuce连接池是一种常用的数据库连接池技术,用于管理与数据库的连接。
在使用Lettuce连接池时,心跳检测是一项重要的功能,用于确保连接池中的连接的可用性和稳定性。
本文将介绍Lettuce 连接池心跳检测的原理及其作用。
一、Lettuce连接池简介Lettuce是一个基于Java的高性能Redis客户端,它提供了连接池的功能,用于管理与Redis服务器的连接。
连接池是一种重要的技术,它通过预先创建一定数量的连接,并将这些连接保存在连接池中,以便在需要时快速获取和释放连接,从而提高应用程序与数据库的交互效率。
二、连接池心跳检测的作用在使用连接池时,连接的可用性是非常重要的。
由于网络等原因,连接可能会出现断开或不稳定的情况,导致应用程序无法正常与数据库进行通信。
为了解决这个问题,连接池引入了心跳检测机制。
心跳检测可以定期检测连接的可用性,及时发现并处理连接异常,保证连接的稳定性和可靠性。
三、Lettuce连接池心跳检测原理Lettuce连接池的心跳检测原理非常简单,它通过定期向Redis服务器发送一个特定的命令来检测连接的可用性。
这个特定的命令通常是一个简单的Ping命令,它会向Redis服务器发送一个特定的请求,并等待服务器的响应。
如果服务器能够正常响应,说明连接正常;如果服务器无法响应或响应超时,则说明连接异常。
四、心跳检测的实现方式Lettuce连接池提供了多种方式来实现心跳检测。
其中一种常用的方式是通过配置连接池的参数来实现心跳检测。
在配置连接池时,可以设置一个心跳检测的时间间隔,连接池会定期向Redis服务器发送Ping命令,并等待响应。
如果在指定的时间内没有收到响应,则认为连接异常,并进行相应的处理,如重新建立连接或关闭连接。
五、心跳检测的优势连接池心跳检测的优势在于它可以提前发现连接异常,及时处理并进行相应的恢复操作。
通过心跳检测,可以避免连接异常导致的数据库操作失败或超时的情况,提高了应用程序与数据库之间的交互效率和稳定性。
数据库连接池的研究与实现摘要在基于JDBC的数据库实际应用开发中,对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作、多客户对数据库的并发访问,一定程度上决定了WEB系统的响应以及应用性能。
使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。
文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结了一些数据库连接池开发程序中容易忽略的问题。
并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略,在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和容易,从实际上论证了这种设计方案的可行性。
关键词:连接池;数据库;JDBC;并发访问Research and implementation of theDatabase Connection PoolAbstractIn the practically application development of database based on JDBC, the management of database connection is a key point and also a difficulty. The response and performance of the WEB system are depended on frequently connecting, closing and multi-user accessing in a certain extent. Using the Database Connection Pool can provide management and maintenance for connections of the database. The upper applications may access the database recourse via the Database Connection Pool, in order to upgrade system performance and fully utilize the system recourse. This article summarizes some issues which are easily ignored in the application development of the Database Connection Pool by the way of introducing, analyzing the basal theory of the Database Connection Pool and comprehending the using situation of the Database Connection Pool on the popular WEB servers. Besides, I established a comparatively highly effective policy of the Connection Pool management after having learned and comprehended key technique of implementing the Connectivity Pool,and actually had developed a Database Connection Pool module under the guidance of that policy, causing the access of system resource by the upper applications via current Connectivity Pool becoming relatively highly effective and easy, demonstrated the feasibility of this design project in practice.Key words:Database Connection Pool; Database; JDBC; Concurrence access目录论文总页数:22页1引言 (1)1.1课题背景 (1)1.2连接池的主要作用 (1)1.3目前流行的WEB服务器数据库连接池方面使用现状 (1)1.3.1DHCP介绍 (2)1.3.2Poolman介绍 (2)1.3.3C3P0介绍 (2)1.3.4其他连接池(自写连接池) (2)2相关理论基础 (3)2.1数据库概述 (3)2.2数据库连接池的基本原理 (3)2.3连接池中的关键技术 (4)2.3.1连接池的分配与释放 (4)2.3.2连接池的维护 (5)3系统总体设计思想及方案 (5)3.1连接池中的关键类设计 (6)3.2连接池中的管理机制 (7)3.3实现一个连接池的其他问题 (8)3.3.1事务处理 (8)3.3.2封装 (9)3.3.3并发 (9)3.3.4连接池的关闭 (9)4具体的设计流程和实现 (10)4.1连接池的建立 (10)4.2连接池的管理 (12)4.3连接池的关闭 (14)4.4连接池的测试 (15)5系统测试问题总结 (15)5.1连接池的泄露问题 (15)5.1.1产生现象 (15)5.1.2解决办法 (16)5.2多数据库服务器问题 (17)结论 (19)参考文献 (20)致谢........................................................................................................ 错误!未定义书签。
java连接池原理
连接池是一种用于管理数据库连接的技术,它的主要目的是通过复用数据库连接来提高系统的性能和效率。
Java连接池的原理如下:
1. 连接创建:在应用程序启动时,连接池会预先创建一定数量的数据库连接,并将它们存储在连接池中,这些连接被称为空闲连接。
2. 连接分配:当应用程序需要与数据库进行交互时,它可以从连接池中请求一个可用的连接。
连接池会检查是否有空闲连接可供使用。
3. 连接复用:如果连接池中存在空闲连接,则将连接分配给应用程序,并从连接池中删除这个连接。
如果连接池中没有空闲连接,则根据配置的最大连接数和等待超时时间等参数,决定是否创建新的连接或者等待一段时间后重新尝试获取连接。
4. 连接释放:在应用程序使用完连接后,需要将连接返回给连接池,连接池会将连接标记为空闲状态,并可用于给其他应用程序复用。
5. 连接定时检查:连接池通常会定期检查连接的可用性,例如使用心跳机制发送请求到数据库,保证连接仍然有效。
如果发现连接已经失效,连接池会自动关闭该连接并创建新的连接。
通过使用连接池,可避免频繁地创建和销毁数据库连接,从而
提高系统的响应速度和稳定性。
连接池还可以控制同一时间访问数据库的并发连接数,以防止数据库被过多的请求压垮,并且可以在高负载期间动态调整连接池的大小。
一些常见的Java连接池实现包括Apache Commons DBCP、
C3P0和HikariCP等。
每个连接池实现可能在细节上有所不同,但整体原理和基本工作流程是相似的。
数据库连接池技术 1 连接池原理 连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、治理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。另外,由于对JDBC中的原始连接进行了封装,从而方便了数据库应用对于连接的使用(非凡是对于事务处理),提高了开发效率,也正是因为这个封装层的存在,隔离了应用的本身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。连接池主要由三部分组成:连接池的建立、连接池中连接的使用治理、连接池的关闭。下面就着重讨论这三部分及连接池的配置问题。
1.1 连接池的建立 应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等,通过读取连接属性文件Connections.properties与数据库实例建立连接。在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就可以避免连接随意的建立、关闭造成的开销。
1.2 连接池的治理
连接池治理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行治理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配、释放策略。 连接池的分配、释放策略对于有效复用连接非常重要,我们采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是: 当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。假如存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。假如没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),假如没达到就重新创建一个连接给请求的客户;假如达到就按设定的maxWaitTime(最大等待时间)进行等待,假如等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。 当客户释放数据库连接时,先判定该连接的引用次数是否超过了规定值,假如超过就删除该连接,并判定当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池布满;假如没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。
1.3 连接池的关闭 当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。
1.4 连接池的配置 数据库连接池中到底要放置多少个连接,才能使系统的性能更佳,用minConn和maxConn来限制。minConn是当应用启动的时候连接池所创建的连接数,假如过大启动将变慢,但是启动后响应更快;假如过小启动加快,但是最初使用的用户将因为连接池中没有足够的连接不可避免的延缓了执行速度。因此应该在开发的过程中设定较小minConn,而在实际应用的中设定较大minConn。maxConn是连接池中的最大连接数,可以通过反复试验来确定此饱和点。为此在连接池类ConnectionPool中加入两个方法getActiveSize()和getOpenSize(),ActiveSize 表示某一时间有多少连接正被使用,OpenSize表示连接池中有多少连接被打开,反映了连接池使用的峰值。将这两个值在日志信息中反应出来, minConn的值应该小于平均ActiveSize,而maxConn的值应该在activeSize和OpenSize之间
2数据库连接池技术
在Java中开源的数据库连接池有以下几种 : 1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。 2,Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。 3,Jakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。 4,DDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。 5,DBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。 6,XAPool XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。 7,Primrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连接请求队列处理。 8,SmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。 9,MiniConnectionPoolManager MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。 10,BoneCP BoneCP是一个快速,开源的数据库连接池。帮你管理数据连接让你的应用程序能更快速地访问数据库。比C3P0/DBCP连接池快25倍。
3 常用开源数据库连接池的实现方式
现在常用的开源数据连接池主要有c3p0,dbcp,proxool和BoneCP四种,其中: ---hibernate开发组推荐使用c3p0; ---spring开发组推荐使用dbcp (dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect ,告诉连接被重置,这个设置可以解决); ---hibernate in action推荐使用c3p0和proxool; 下面一一介绍这三种数据库连接池的使用方法和配置信息 3.1 Apache-DBCP:
3.1.1相关的参数有: dataSource: 要连接的 datasource (通常我们不会定义在 server.xml) defaultAutoCommit: 对于事务是否 autoCommit, 默认值为 true defaultReadOnly: 对于数据库是否只能读取, 默认值为 false driverClassName:连接数据库所用的 JDBC Driver Class, maxActive: 可以从对象池中取出的对象最大个数,为0则表示没有限制,默认为8 maxIdle: 最大等待连接中的数量,设 0 为没有限制 (对象池中对象最大个数) minIdle:对象池中对象最小个数 maxWait: 最大等待秒数, 单位为 ms, 超过时间会丟出错误信息 password: 登陆数据库所用的密码 url: 连接数据库的 URL username: 登陆数据库所用的帐号 validationQuery: 验证连接是否成功, SQL SELECT 指令至少要返回一行 removeAbandoned: 是否自我中断, 默认是 false removeAbandonedTimeout: 几秒后会自我中断, removeAbandoned 必须为 true logAbandoned: 是否记录中断事件, 默认为 false minEvictableIdleTimeMillis:大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证;默认30分钟 timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程,默认-1 testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为false testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为false testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为false initialSize:初始化线程数
3.1.2实现:首先下载DBCP所需JAR包,http://jakarta.apache.org/commons/dbcp/ 还
有pool包,http://jakarta.apache.org/commons/pool/ 如果下载的pool包是1.2的版本,还要下载common-collections包,http://jakarta.apache.org/ commons/ collections/ 3.1.2.1 WEB项目中实现:我的实现方式是将包引入之后,在spring中注入,部分代码
如下,完整代码见DBCP_Demo destroy-method="close"> com.mysql.jdbc.Driver jdbc:mysql://127.0.0.1:3306/ConnTest?useUnicode=true&characterEncoding=GBK root root 50 100 50