1、概念
数据库连接,是一种关键的、有限的、昂贵的资源;对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标;(百度百科)
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
2、原理
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
3、流程机制
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
4、常用数据库连接池
4.1 DBCP
DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的。
依赖jar
1 <dependency> 2 <groupId>commons-dbcp</groupId> 3 <artifactId>commons-dbcp</artifactId> 4 <version>1.4</version> 5 </dependency> 6 <dependency> 7 <groupId>commons-pool</groupId> 8 <artifactId>commons-pool</artifactId> 9 <version>1.5.4</version> 10 </dependency>
4.2 C3P0
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
依赖
1 <dependency> 2 <groupId>c3p0</groupId> 3 <artifactId>c3p0</artifactId> 4 <version>0.9.1.2</version> 5 </dependency>
4.3 Druid
Druid是阿里推出,它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化。
依赖
1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>druid</artifactId> 4 <version>1.0.9</version> 5 </dependency>
4.4、相互间区别
5.1 基本配置是指连接池进行数据库连接的四个基本必需配置:传递给JDBC驱动的用于连接数据库的用户名、密码、URL以及驱动类名。
DBCP | c3p0 | Druid | |
用户名 | username | user | username |
密码 | password | password | password |
URL | url | jdbcUrl | jdbcUrl |
驱动类名 | driverClassName | driverClass | driverClassName |
5.2 关键配置是指初始化连接池参数:
DBCP | c3p0 | Druid | |
最小连接数 | minIdle(0) | minPoolSize(3) | minIdle(0) |
初始化连接数 | initialSize(0) | initialPoolSize(3) | initialSize(0) |
最大连接数 | maxTotal(8) | maxPoolSize(15) | maxActive(8) |
最大等待时间 | maxWaitMillis(毫秒) | maxIdleTime(0秒) | maxWait(毫秒) |
DBCP | c3p0 | Druid | |
开启缓存功能 | poolPreparedStatements | maxStatements | poolPreparedStatements |
单个连接拥有的最大缓存数 | maxOpenPrepared- Statements |
maxStatementsPer- Connection |
maxOpenPrepared- Statements |
DBCP | c3p0 | Druid | |
申请连接检测 | testOnBorrow | testConnectionOnCheckin | testOnBorrow |
是否超时检测 | testWhileIdle | testWhileIdle | |
空闲时间 | timeBetweenEvictionRunsMillis | idleConnectionTestPeriod | timeBetweenEvictionRunsMillis |
校验用sql语句 | validationQuery | preferredTestQuery | validationQuery |
归还连接检测 | testOnReturn | testConnectionOnCheckout | testOnReturn |
DBCP | c3p0 | Druid | |
是否超时关闭连接 | removeAbandoned | breakAfterAcquireFailure | removeAbandoned |
超时时间 | removeAbandonedTimeout | checkoutTimeout | removeAbandonedTimeout |
是否记录日志 | logAbandoned | logAbandoned |
DBCP | c3p0 | Druid | |
重连次数 | acquireRetryAttempts | ||
间隔时间 | acquireRetryDelay |
5.4 各个参数,已经配置示例
属性(Parameter) | 默认值(Default) | 描述(Description) |
username | 传递给JDBC驱动的用于建立连接的用户名(The connection username to be passed to our JDBC driver to establish a connection.) | |
password | 传递给JDBC驱动的用于建立连接的密码(The connection password to be passed to our JDBC driver to establish a connection.) | |
url | 传递给JDBC驱动的用于建立连接的URL(The connection URL to be passed to our JDBC driver to establish a connection.) | |
driverClassName | 使用的JDBC驱动的完整有效的java 类名(The fully qualified Java class name of the JDBC driver to be used.) | |
defaultAutoCommit | driver default | 连接池创建的连接的默认的auto-commit状态,没有设置则不会自动提交(The default auto-commit state of connections created by this pool. If not set then the setAutoCommit method will not be called.) |
initialSize | 0 | 初始化连接:连接池启动时创建的初始化连接数量(The initial number of connections that are created when the pool is started. |
maxTotal | 8 | 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制(The maximum number of active connections that can be allocated from this pool at the same time, or negative for no limit.) |
maxIdle | 8 | 最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制(The maximum number of connections that can remain idle in the pool, without extra ones being released, or negative for no limit.) |
minIdle | 0 | 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,负数表示没有现在(The maximum number of connections that can remain idle in the pool, without extra ones being released, or negative for no limit.) |
注意:如果在某些负载比较大的系统中将maxIdel设置过小时,很可能会出现连接关闭的同时新连接马上打开的情况.这是由于关闭连接的线程比打开的快导致的.所以,对于这种系统中,maxIdle的设定值是不同的但是通常首选默认值 | ||
(NOTE: If maxIdle is set too low on heavily loaded systems it is possible you will see connections being closed and almost immediately new connections being opened. This is a result of the active threads momentarily closing connections faster than they are opening them, causing the number of idle connections to rise above maxIdle. The best value for maxIdle for heavily loaded system will vary but the default is a good starting point.) | ||
maxWaitMillis | indefinitely | 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待(The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception, or -1 to wait indefinitely.) |
validationQuery | SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录(The SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row. If not specified, connections will be validation by calling the isValid() method.) | |
testOnCreate | false | 指明是否在建立连接之后进行验证,如果验证失败,则尝试重新建立连接(The indication of whether objects will be validated after creation. If the object fails to validate, the borrow attempt that triggered the object creation will fail.) |
testOnBorrow | true | 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串(The indication of whether objects will be validated before being borrowed from the pool. If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.) |
testOnReturn | false | 指明是否在归还到池中前进行检验(The indication of whether objects will be validated before being returned to the pool.) |
testWhileIdle | false | 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串(The indication of whether objects will be validated by the idle object evictor (if any). If an object fails to validate, it will be dropped from the pool.) |
timeBetweenEviction- RunsMillis |
-1 | 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.如果设置为非正数,则不运行空闲连接回收器线程(The number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no idle object evictor thread will be run.) |
numTestsPerEvictionRun | 3 | 在每次空闲连接回收器线程(如果有)运行时检查的连接数量(The number of objects to examine during each run of the idle object evictor thread (if any).) |
minEvictableIdleTime-Millis | 1000*60*30 | 连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒(The minimum amount of time an object may sit idle in the pool before it is eligable for eviction by the idle object evictor (if any).) |
softMiniEvictableIdle- TimeMillis | -1 | 说明(The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction by the idle connection evictor, with the extra condition that at least "minIdle" connections remain in the pool. When miniEvictableIdleTimeMillis is set to a positive value, miniEvictableIdleTimeMillis is examined first by the idle connection evictor - i.e. when idle connections are visited by the evictor, idle time is first compared against miniEvictableIdleTimeMillis (without considering the number of idle connections in the pool) and then against softMinEvictableIdleTimeMillis, including the minIdle constraint.) |
maxConnLifetimeMillis | -1 | 说明(The maximum lifetime in milliseconds of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.) |
logExpiredConnections | true | 说明(Flag to log a message indicating that a connection is being closed by the pool due to maxConnLifetimeMillis exceeded. Set this property to false to suppress expired connection logging that is turned on by default. |
connectionInitSqls | null | 说明(A Collection of SQL statements that will be used to initialize physical connections when they are first created. These statements are executed only once - when the configured connection factory creates the connection.) |
info | true | 说明(True means that borrowObject returns the most recently used ("last in") connection in the pool (if there are idle connections available). False means that the pool behaves as a FIFO queue - connections are taken from the idle instance pool in the order that they are returned to the pool.) |
poolPreparedState-ments | false | 开启池的prepared statement 池功能(Enable prepared statement pooling for this pool.) |
maxOpenPreparedState-ments | unlimited | statement池能够同时分配的打开的statements的最大数量, 如果设置为0表示不限制(The maximum number of open statements that can be allocated from the statement pool at the same time, or negative for no limit.) |
NOTE - Make sure your connection has some resources left for the other statements. Pooling PreparedStatements may keep their cursors open in the database, causing a connection to run out of cursors, especially if maxOpenPreparedStatements is left at the default (unlimited) and an application opens a large number of different PreparedStatements per connection. To avoid this problem, maxOpenPreparedStatements should be set to a value less than the maximum number of cursors that can be open on a Connection. | ||
accessToUnderlyingConnectionAllowed | false | 控制PoolGuard是否容许获取底层连接(Controls if the PoolGuard allows access to the underlying connection.) 默认false不开启, 这是一个有潜在危险的功能, 不适当的编码会造成伤害.(关闭底层连接或者在守护连接已经关闭的情况下继续使用它).请谨慎使用,并且仅当需要直接访问驱动的特定功能时使用.注意: 不要关闭底层连接, 只能关闭前面的那个. Default is false, it is a potential dangerous operation and misbehaving programs can do harmful things. (closing the underlying or continue using it when the guarded connection is already closed) Be careful and only use when you need direct access to driver specific extensions. NOTE: Do not close the underlying connection, only the original one. |
removeAbandoned | false | 标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制.如果设置为true, 连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout. 设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接. (Flags to remove abandoned connections if they exceed the removeAbandonedTimout. A connection is considered abandoned and eligible for removal if it has not been used for longer than removeAbandonedTimeout. Setting one or both of these to true can recover db connections from poorly written applications which fail to close connections.) |
removeAbandonedTimeout | 300 | 泄露的连接可以被删除的超时值, 单位秒 (Timeout in seconds before an abandoned connection can be removed.) |
logAbandoned | false | 标记当Statement或连接被泄露时是否打印程序的stack traces日志。被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,因为需要生成stack trace。(Flag to log stack traces for application code which abandoned a Statement or Connection. Logging of abandoned Statements and Connections adds overhead for every Connection open or new Statement because a stack trace has to be generated.) |
abandonedUsageTracking | false | 如果为true, 那么连接池会记录每个方法调用时候的堆栈信息以及废弃连接的调试信息(If true, the connection pool records a stack trace every time a method is called on a pooled connection and retains the most recent stack trace to aid debugging of abandoned connections. There is significant overhead added by setting this to true.) |
注:如果开启"removeAbandoned",那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() < 2)and (getNumActive() > getMaxActive() - 3)时被触发. 举例当maxActive=20, 活动连接为18,空闲连接为1时可以触发"removeAbandoned".但是活动连接只有在没有被使用的时间超过"removeAbandonedTimeout"时才被删除,默认300秒.在resultset中游历不被计算为被使用. | ||
If you have enabled removeAbandonedOnMaintenance or removeAbandonedOnBorrow then it is possible that a connection is reclaimed by the pool because it is considered to be abandoned. This mechanism is triggered when (getNumIdle() < 2) and (getNumActive() > getMaxTotal() - 3) and removeAbandonedOnBorrow is true; or after eviction finishes and removeAbandonedOnMaintenance is true. For example, maxTotal=20 and 18 active connections and 1 idle connection would trigger removeAbandonedOnBorrow, but only the active connections that aren't used for more then "removeAbandonedTimeout" seconds are removed (default 300 sec). Traversing a resultset doesn't count as being used. Creating a Statement, PreparedStatement or CallableStatement or using one of these to execute a query (using one of the execute methods) resets the lastUsed property of the parent connection. |
示例
1 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 2 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 3 <property name="url" value="jdbc:oracle:thin:@192.168.1.254:1521/ORCL"/> 4 <property name="username" value="orcl"/> 5 <property name="password" value="orclpp"/> 6 <!--initialSize: 初始化连接--> 7 <property name="initialSize" value="5"/> 8 <!--maxIdle: 最大空闲连接--> 9 <property name="maxIdle" value="10"/> 10 <!--minIdle: 最小空闲连接--> 11 <property name="minIdle" value="5"/> 12 <!--maxActive: 最大连接数量--> 13 <property name="maxActive" value="15"/> 14 <!--removeAbandoned: 是否自动回收超时连接--> 15 <property name="removeAbandoned" value="true"/> 16 <!--removeAbandonedTimeout: 超时时间(以秒数为单位)--> 17 <property name="removeAbandonedTimeout" value="180"/> 18 <!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒--> 19 <property name="maxWait" value="3000"/> 20 <property name="validationQuery"> 21 <value>SELECT 1</value> 22 </property> 23 <property name="testOnBorrow"> 24 <value>true</value> 25 </property> 26 </bean>
属性(Parameter) | 默认值(Default) | 描述(Description) |
user | 同DBCP中的username属性 | |
password | 同DBCP中的password属性 | |
jdbcUrl | 同DBCP中的jdbcUrl属性 | |
driverClass | 同DBCP中的driverClass属性 | |
autoCommitOnClose | false | 默认值false表示回滚任何未提交的任务,设置为true则全部提交,而不是在关闭连接之前回滚 (C3P0's default policy is to rollback any uncommitted, pending work.Setting autoCommitOnClose to true causes uncommitted pending work to be committed, rather than rolled back on Connection close.) *参见DBCP中的defaultAutoCommit属性 |
initialPoolSize | 3 | 初始化连接:连接池启动时创建的初始化连接数量(The initial number of connections that are created when the pool is started. *参见DBCP中的initialSize属性 |
maxPoolSize | 15 | 连接池中保留的最大连接数(Maximum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxIdle属性 |
minPoolSize | 3 | 连接池中保留的最小连接数(Minimum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxIdle属性 |
maxIdleTime | 0 | 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以秒计数),超过时间则抛出异常,如果设置为0表示无限等待(Seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire.) *参见DBCP中maxWaitMillis 属性 |
preferredTestQuery | null | 定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。(Defines the query that will be executed for all connection tests, if the default ConnectionTester (or some other implementation of QueryConnectionTester, or better yet FullQueryConnectionTester) is being used. Defining a preferredTestQuery that will execute quickly in your database may dramatically speed up Connection tests.) |
testConnectionOn- Checkin | false | 如果设为true那么在取得连接的同时将校验连接的有效性。(If true, an operation will be performed asynchronously at every connection checkin to verify that the connection is valid. Use in combination with idleConnectionTestPeriod for quite reliable, always asynchronous Connection testing.) *参见DBCP中的testOnBorrow属性 |
testConnectionOn- Checkout | false | 如果设为true那么在每个connection提交的时候都将校验其有效性,但是要确保配置的preferredTestQuery的有效性(If true, an operation will be performed at every connection checkout to verify that the connection is valid. Be sure to set an efficient preferredTestQuery or automaticTestTable if you set this to true.) *参见DBCP中的testOnBorrow属性 |
idleConnectionTest- Period | 0 | 如果设置大于0,表示过了多少秒检查一次空闲连接,结合testConnectionOnCheckin以及testConnectionOnCheckout使用(If this is a number greater than 0, c3p0 will test all idle, pooled but unchecked-out connections, every this number of seconds.) |
acquireRetryAttempts | 30 | 定义在从数据库获取新连接失败后重复尝试的次数, 如果小于0则表示无限制的连接。(Defines how many times c3p0 will try to acquire a new Connection from the database before giving up. If this value is less than or equal to zero, c3p0 will keep trying to fetch a Connection indefinitely.) |
acquireRetryDelay | 1000 | 两次连接中的间隔时间,单位毫秒。(Milliseconds, time c3p0 will wait between acquire attempts.) |
breakAfterAcquire- Failure |
false | 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用 getConnection() 的时候继续尝试获取连接。如果为 true,那么在尝试获取连接失败后该数据源将声明已断开并永久关闭。(If true, a pooled DataSource will declare itself broken and be permanently closed if a Connection cannot be obtained from the database after making acquireRetryAttempts to acquire one. If false, failure to obtain a Connection will cause all Threads waiting for the pool to acquire a Connection to throw an Exception, but the DataSource will remain valid, and will attempt to acquire again following a call to getConnection().) |
checkoutTimeout | 0 | 当连接池用完时客户端调用 getConnection() 后等待获取新连接的时间,潮湿后将抛出SQLException,如设为0,则为无限期等待。单位毫秒。(The number of milliseconds a client calling getConnection() will wait for a Connection to be checked-in or acquired when the pool is exhausted. Zero means wait indefinitely. Setting any positive value will cause the getConnection() call to time-out and break with an SQLException after the specified number of milliseconds.) |
maxStatements | 0 | 控制数据源内加载的PreparedStatements数量(Enable prepared statement pooling for this pool.) |
maxStatementsPer- Connection | 0 | 定义了连接池内单个连接所拥有的最大缓存statements数(The maximum number of open statements that can be allocated from the statement pool at the same time, or negative for no limit.) |
示例
1 <!-- 使用c3p0连接池注册数据源 --> 2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 3 <!-- 基础配置 --> 4 <property name="jdbcUrl" value="${jdbc.url}"></property> 5 <property name="driverClass" value="${jdbc.driver}"></property> 6 <property name="user" value="${jdbc.user}"></property> 7 <property name="password" value="${jdbc.password}"></property> 8 9 <!-- 关键配置 --> 10 <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 11 <property name="initialPoolSize" value="3"></property> 12 <!--连接池中保留的最小连接数。Default: 2 --> 13 <property name="minPoolSize" value="2"></property> 14 <!--连接池中保留的最大连接数。Default: 15 --> 15 <property name="maxPoolSize" value="15"></property> 16 <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 17 <property name="acquireIncrement" value="3"></property> 18 19 <!-- 性能配置 --> 20 <!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> 21 <property name="maxStatements" value="8"></property> 22 <!-- maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --> 23 <property name="maxStatementsPerConnection" value="5"></property> 24 <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 25 <property name="maxIdleTime" value="1800"></property> 26 </bean>
属性(Parameter) | 默认值(Default) | 描述(Description) |
username | 连接数据库的用户名 | |
password | 连接数据库的密码 | |
jdbcUrl | 同DBCP中的jdbcUrl属性 | |
driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 *参见DBCP中的initialSize属性 |
maxActive | 8 | 最大连接池数量(Maximum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxTotal属性 |
maxIdle | 8 | 已经不再使用,配置了也没效果*参见DBCP中的maxIdle属性 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 | |
poolPreparedState- ments | false | 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。 |
maxOpenPrepared- Statements | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 |
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
validationQuery | 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。在mysql中通常为select 'x',在oracle中通常为select 1 from dual | |
timeBetweenEviction-RunsMillis | 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据 | |
minEvictableIdle- TimeMillis | Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接。 | |
removeAbandoned | 对于建立时间超过removeAbandonedTimeout的连接强制关闭 | |
removeAbandoned-Timeout | 指定连接建立多长时间就需要被强制关闭 | |
logAbandoned | false | 指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 1)监控统计用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall |
示例
1 <!-- 一、使用druid数据库连接池注册数据源 --> 2 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 3 <!-- 基础配置 --> 4 <property name="url" value="${jdbc.url}"></property> 5 <property name="driverClassName" value="${jdbc.driver}"></property> 6 <property name="username" value="${jdbc.user}"></property> 7 <property name="password" value="${jdbc.password}"></property> 8 9 <!-- 关键配置 --> 10 <!-- 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 --> 11 <property name="initialSize" value="3" /> 12 <!-- 最小连接池数量 --> 13 <property name="minIdle" value="2" /> 14 <!-- 最大连接池数量 --> 15 <property name="maxActive" value="15" /> 16 <!-- 配置获取连接等待超时的时间 --> 17 <property name="maxWait" value="10000" /> 18 19 <!-- 性能配置 --> 20 <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 21 <property name="poolPreparedStatements" value="true" /> 22 <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> 23 24 <!-- 其他配置 --> 25 <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 26 <property name="timeBetweenEvictionRunsMillis" value="60000" /> 27 <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 28 <property name="minEvictableIdleTimeMillis" value="300000" /> 29 <!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 30 执行validationQuery检测连接是否有效。 --> 31 <property name="testWhileIdle" value="true" /> 32 <!-- 这里建议配置为TRUE,防止取到的连接不可用 ,申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。--> 33 <property name="testOnBorrow" value="true" /> 34 <!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 --> 35 <property name="testOnReturn" value="false" /> 36 </bean>
1 config.properties: 2 #数据库驱动 3 jdbc.driver=com.mysql.jdbc.Driver 4 #数据库连接url 5 jdbc.url=jdbc:mysql://192.168.0.7:3306/pooltest?useUnicode=true&characterEncoding=utf-8 6 #数据库用户名 7 jdbc.user=tuzongxun 8 #数据库密码 9 jdbc.password=123456
复制完了,各位看官。。。