Java_Web mysql的连接池与分页

1. 连接池

2. 分页

1. 连接池

思考:

程序中连接如何管理?

1. 连接资源宝贵;需要对连接管理

2. 连接:

a) 操作数据库,创建连接

b) 操作结束,  关闭!

分析:

涉及频繁的连接的打开、关闭,影响程序的运行效率!

连接管理:

预先创建一组连接,有的时候每次取出一个; 用完后,放回;

 

学习连接池:

a. 自定义一个连接池

b. 学习优秀的连接池组件

a) DBCP

b) C3P0

自定义连接池

 

 

 

 

代理:

如果对某个接口中的某个指定的方法的功能进行扩展,而不想实现接口里所有方法,可以使用(动态)代理模式!

Java中代理模式:静态/动态/Cglib代理(spring)

使用动态代理,可以监测接口中方法的执行!

 

如何对Connection对象,生成一个代理对象:

|--Proxy

static Object newProxyInstance(

ClassLoader loader,    当前使用的类加载器

Class<?>[] interfaces,   目标对象(Connection)实现的接口类型

InvocationHandler h    事件处理器:当执行上面接口中的方法的时候,就会自动触发事件处理器代码,把当前执行的方法(method)作为参数传入。

)  

 

 

 

/**

 * 自定义连接池, 管理连接

 * 代码实现:

1.  MyPool.java  连接池类,   

2.  指定全局参数:  初始化数目、最大连接数、当前连接、   连接池集合

3.  构造函数:循环创建3个连接

4.  写一个创建连接的方法

5.  获取连接

------>  判断: 池中有连接, 直接拿

 ------>                池中没有连接,

------>                 判断,是否达到最大连接数; 达到,抛出异常;没有达到最大连接数,

创建新的连接

6. 释放连接

 ------->  连接放回集合中(..)

 *

 */

public class MyPool {

 

private int init_count = 3;// 初始化连接数目

private int max_count = 6;// 最大连接数

private int current_count = 0;  // 记录当前使用连接数

// 连接池 (存放所有的初始化连接)

private LinkedList<Connection> pool = new LinkedList<Connection>();

//1.  构造函数中,初始化连接放入连接池

public MyPool() {

// 初始化连接

for (int i=0; i<init_count; i++){

// 记录当前连接数目

current_count++;

// 创建原始的连接对象

Connection con = createConnection();

// 把连接加入连接池

pool.addLast(con);

}

}

//2. 创建一个新的连接的方法

private Connection createConnection(){

try {

Class.forName("com.mysql.jdbc.Driver");

// 原始的目标对象

final Connection con = DriverManager.getConnection("jdbc:mysql:///jdbc_demo", "root", "root");

/**********con对象代理**************/

// con创建其代理对象

Connection proxy = (Connection) Proxy.newProxyInstance(

con.getClass().getClassLoader(),    // 类加载器

//con.getClass().getInterfaces(),   // 当目标对象是一个具体的类的时候

new Class[]{Connection.class},      // 目标对象实现的接口

new InvocationHandler() {// 当调用con对象方法的时候, 自动触发事务处理器

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

// 方法返回值

Object result = null;

// 当前执行的方法的方法名

String methodName = method.getName();

// 判断当执行了close方法的时候,把连接放入连接池

if ("close".equals(methodName)) {

System.out.println("begin:当前执行close方法开始!");

// 连接放入连接池

pool.addLast(con);

System.out.println("end: 当前连接已经放入连接池了!");

} else {

// 调用目标对象方法

result = method.invoke(con, args);

}

return result;

}

}

);

return proxy;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

//3. 获取连接

public Connection getConnection(){

// 3.1 判断连接池中是否有连接, 如果有连接,就直接从连接池取出

if (pool.size() > 0){

return pool.removeFirst();

}

// 3.2 连接池中没有连接: 判断,如果没有达到最大连接数,创建;

if (current_count < max_count) {

// 记录当前使用的连接数

current_count++;

// 创建连接

return createConnection();

}

// 3.3 如果当前已经达到最大连接数,抛出异常

throw new RuntimeException("当前连接已经达到最大连接数目 !");

}

//4. 释放连接

public void realeaseConnection(Connection con) {

// 4.1 判断: 池的数目如果小于初始化连接,就放入池中

if (pool.size() < init_count){

pool.addLast(con);

} else {

try {

// 4.2 关闭

current_count--;

con.close();

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

}

public static void main(String[] args) throws SQLException {

MyPool pool = new MyPool();

System.out.println("当前连接: " + pool.current_count);  // 3

// 使用连接

pool.getConnection();

pool.getConnection();

Connection con4 = pool.getConnection();

Connection con3 = pool.getConnection();

Connection con2 = pool.getConnection();

Connection con1 = pool.getConnection();

// 释放连接, 连接放回连接池

//pool.realeaseConnection(con1);

/*

 * 希望:当关闭连接的时候,要把连接放入连接池!【当调用Connection接口的close方法时候,希望触发pool.addLast(con);操作】

 * 把连接放入连接池

 * 解决1:实现Connection接口,重写close方法

 * 解决2:动态代理

 */

con1.close();

// 再获取

pool.getConnection();

System.out.println("连接池:" + pool.pool.size());      // 0

System.out.println("当前连接: " + pool.current_count);  // 3

}

}

 

 

代理的总结:(了解会用)

使用代理,可以在不实现接口的情况,对接口的方法进行扩展,添加额外的用户需要的业务逻辑!

 

 

 

 

2.开源的连接池技术

概述:

Sun公司约定: 如果是连接池技术,需要实现一个接口!

javax.sql.DataSource;

 

连接池:

DBCP

C3P0

 

2.1 DBCP连接池:

l DBCP Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:

• Commons-dbcp.jar:连接池的实现

• Commons-pool.jar:连接池实现的依赖库

l Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

核心类:BasicDataSource

使用步骤

• 引入jar文件

l commons-dbcp-1.4.jar

l commons-pool-1.5.6.jar

 

public class App_DBCP {

 

// 1. 硬编码方式实现连接池

@Test

public void testDbcp() throws Exception {

// DBCP连接池核心类

BasicDataSource dataSouce = new BasicDataSource();

// 连接池参数配置:初始化连接数、最大连接数 / 连接字符串、驱动、用户、密码

dataSouce.setUrl("jdbc:mysql:///jdbc_demo");//数据库连接字符串

dataSouce.setDriverClassName("com.mysql.jdbc.Driver");  //数据库驱动

dataSouce.setUsername("root");//数据库连接用户

dataSouce.setPassword("root"); //数据库连接密码

dataSouce.setInitialSize(3);  // 初始化连接

dataSouce.setMaxActive(6);  // 最大连接

dataSouce.setMaxIdle(3000);   // 最大空闲时间

// 获取连接

Connection con = dataSouce.getConnection();

con.prepareStatement("delete from admin where id=3").executeUpdate();

// 关闭

con.close();

}

@Test

// 2. 【推荐】配置方式实现连接池  ,  便于维护

public void testProp() throws Exception {

// 加载prop配置文件

Properties prop = new Properties();

// 获取文件流

InputStream inStream = App_DBCP.class.getResourceAsStream("db.properties");

// 加载属性配置文件

prop.load(inStream);

// 根据prop配置,直接创建数据源对象

DataSource dataSouce = BasicDataSourceFactory.createDataSource(prop);

// 获取连接

Connection con = dataSouce.getConnection();

con.prepareStatement("delete from admin where id=4").executeUpdate();

// 关闭

con.close();

}

}

配置方式实现DBCP连接池,  配置文件中的keyBaseDataSouce中的属性一样:

db.properties

url=jdbc:mysql:///jdbc_demo

driverClassName=com.mysql.jdbc.Driver

username=root

password=root

initialSize=3

maxActive=6

maxIdle=3000

 

 

2.2 C3P0连接池:

C3P0连接池:

最常用的连接池技术!Spring框架,默认支持C3P0连接池技术!

C3P0连接池,核心类:

CombopooledDataSource ds;

使用:

1. 下载,引入jar文件:  c3p0-0.9.1.2.jar

2. 使用连接池,创建连接

a) 硬编码方式

b) 配置方式(xml)(默认在项目的src目录下存放配置文件  c3p0-config.xml)

格式为:

<c3p0-config>
    <default-config>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo
        </property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">3</property>
        <property name="maxPoolSize">6</property>
        <property name="maxIdleTime">1000</property>
    </default-config>


    <named-config name="oracle_config">
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">3</property>
        <property name="maxPoolSize">6</property>
        <property name="maxIdleTime">1000</property>
    </named-config>


</c3p0-config>


 

 

public class App {

 

@Test

//1. 硬编码方式,使用C3P0连接池管理连接

public void testCode() throws Exception {

// 创建连接池核心工具类

ComboPooledDataSource dataSource = new ComboPooledDataSource();

// 设置连接参数:url、驱动、用户密码、初始连接数、最大连接数

dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc_demo");

dataSource.setDriverClass("com.mysql.jdbc.Driver");

dataSource.setUser("root");

dataSource.setPassword("root");

dataSource.setInitialPoolSize(3);

dataSource.setMaxPoolSize(6);

dataSource.setMaxIdleTime(1000);

// ---> 从连接池对象中,获取连接对象

Connection con = dataSource.getConnection();

// 执行更新

con.prepareStatement("delete from admin where id=7").executeUpdate();

// 关闭

con.close();

}

@Test

//2. XML配置方式,使用C3P0连接池管理连接

public void testXML() throws Exception {

// 创建c3p0连接池核心工具类

// 自动加载srcc3p0的配置文件【c3p0-config.xml

ComboPooledDataSource dataSource = new ComboPooledDataSource();// 使用默认的配置

// 获取连接

Connection con = dataSource.getConnection();

// 执行更新

con.prepareStatement("delete from admin where id=5").executeUpdate();

// 关闭

con.close();

}

}

 

 

2.3 优化

项目,连接的管理,交给连接池!

 

 

3. 分页技术


分页技术:

JSP页面,用来显示数据! 如果数据有1000条,分页显示,每页显示10条,共100;   好处:  利于页面布局,且显示的效率高!

 

分页关键点:

1. 分页SQL语句;

2. 后台处理: dao/service/servlet/JSP

 

实现步骤:

0. 环境准备

a) 引入jar文件及引入配置文件

i. 数据库驱动包

ii. C3P0连接池jar文件 及 配置文件

iii. DbUtis组件:    QueryRunner qr = new QueryRuner(dataSouce);

qr.update(sql);

b) 公用类: JdbcUtils.java

1. 先设计:PageBean.java

2. Dao接口设计/实现:   2个方法

3. Service/servlet

4. JSP

 

作业:

需求:自拟

要求功能:

1. 列表展示、分页 【必须有】

2. 注册、登陆

a) 登陆后,进入第1步骤的列表页面(分页)

b) 注册成功,跳转到登陆页面,让用户登陆

3. 扩展

a) 对列表数据修改

b) 对列表数据删除

c) 新增数据

 

C3P0连接池参数解释

<c3p0-config>
  <default-config>
 <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
 <property name="acquireIncrement">3</property>
 
 <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
 <property name="acquireRetryAttempts">30</property>
 
 <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
 <property name="acquireRetryDelay">1000</property>
 
 <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
 <property name="autoCommitOnClose">false</property>
 
 <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
  属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试
  使用。Default: null-->
 <property name="automaticTestTable">Test</property>
 
 <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
  保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
  获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
 <property name="breakAfterAcquireFailure">false</property>
 
 <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
  SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
 <property name="checkoutTimeout">100</property>
 
 <!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。
  Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
 <property name="connectionTesterClassName"></property>
 
 <!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可
  Default: null-->
 <property name="factoryClassLocation">null</property>
 
 <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.
  (文档原文)作者强烈建议不使用的一个属性-->
 <property name="forceIgnoreUnresolvedTransactions">false</property>
 
 <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
 <property name="idleConnectionTestPeriod">60</property>
 
 <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
 <property name="initialPoolSize">3</property>
 
 <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
 <property name="maxIdleTime">60</property>
 
 <!--连接池中保留的最大连接数。Default: 15 -->
 <property name="maxPoolSize">15</property>
 
 <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
  属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
  如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
 <property name="maxStatements">100</property>
 
 <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0  -->
 <property name="maxStatementsPerConnection"></property>
 
 <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
  通过多线程实现多个操作同时被执行。Default: 3-->
 <property name="numHelperThreads">3</property>
 
 <!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0
  的数据源时。Default: null-->
 <property name="overrideDefaultUser">root</property>
 
 <!--与overrideDefaultUser参数对应使用的一个参数。Default: null-->
 <property name="overrideDefaultPassword">password</property>
 
 <!--密码。Default: null-->
 <property name="password"></property>
 
 <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:
  测试的表必须在初始数据源的时候就存在。Default: null-->
 <property name="preferredTestQuery">select id from test where id=1</property>
 
 <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
 <property name="propertyCycle">300</property>
 
 <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
  时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
  等方法来提升连接测试的性能。Default: false -->
 <property name="testConnectionOnCheckout">false</property>
 
 <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
 <property name="testConnectionOnCheckin">true</property>
 
 <!--用户名。Default: null-->
 <property name="user">root</property>
 
 <!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数
  允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始
  广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到
  支持,但今后可能的版本可能不支持动态反射代理。Default: false-->
 <property name="usesTraditionalReflectiveProxies">false</property>

    <property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">25</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">0</property>
    <user-overrides user="swaldman">
    </user-overrides>
  </default-config>
  <named-config name="dumbTestConfig">
    <property name="maxStatements">200</property>
    <user-overrides user="poop">
      <property name="maxStatements">300</property>
    </user-overrides>
   </named-config>
</c3p0-config>




DBCP连接池参数解释

1.<!-- 数据源1 -->  
2.    <bean id="dataSource"  
3.          class="org.apache.commons.dbcp.BasicDataSource"  
4.          destroy-method="close">  
5.        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
6.        <property name="url" value="jdbc:mysql://192.168.0.109:3306/test?        useUnicode=true&characterEncoding=UTF-8"/>  
7.        <property name="username" value="root"/>  
8.        <property name="password" value="root"/>  
9.        <!--maxActive: 最大连接数量-->    
10.        <property name="maxActive" value="150"/>  
11.        <!--minIdle: 最小空闲连接-->    
12.        <property name="minIdle" value="5"/>  
13.        <!--maxIdle: 最大空闲连接-->    
14.        <property name="maxIdle" value="20"/>  
15.        <!--initialSize: 初始化连接-->    
16.        <property name="initialSize" value="30"/>  
17.        <!-- 连接被泄露时是否打印 -->  
18.        <property name="logAbandoned" value="true"/>  
19.        <!--removeAbandoned: 是否自动回收超时连接-->    
20.        <property name="removeAbandoned"  value="true"/>  
21.        <!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->    
22.        <property name="removeAbandonedTimeout" value="10"/>  
23.        <!--maxWait: 超时等待时间以毫秒为单位-->  
24.        <property name="maxWait" value="1000"/>  
25.        <!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->  
26.        <property name="timeBetweenEvictionRunsMillis" value="10000"/>  
27.        <!--  在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->  
28.        <property name="numTestsPerEvictionRun" value="10"/>  
29.        <!-- 1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程-->  
30.        <property name="minEvictableIdleTimeMillis" value="10000"/>  
31.    <property name="validationQuery" value="SELECT NOW() FROM DUAL"/>  
32.    </bean>  



参数  描述
username  传递给JDBC驱动的用于建立连接的用户名
password  传递给JDBC驱动的用于建立连接的密码
url  传递给JDBC驱动的用于建立连接的URL
driverClassName  使用的JDBC驱动的完整有效的java 类名
connectionProperties  当建立新连接时被发送给JDBC驱动的连接参数,
格式必须是 [propertyName=property;]*
注意 :参数user/password将被明确传递,所以不需要包括在这里。

参数  默认值  描述
defaultAutoCommit  true  连接池创建的连接的默认的auto-commit状态
defaultReadOnly  driver default  连接池创建的连接的默认的read-only状态.
如果没有设置则setReadOnly方法将不会被调用. (某些驱动不支持只读模式,比如:Informix)
defaultTransactionIsolation  driver default  连接池创建的连接的默认的TransactionIsolation状态.
下面列表当中的某一个: (参考javadoc)

    * NONE
    * READ_COMMITTED
    * READ_UNCOMMITTED
    * REPEATABLE_READ
    * SERIALIZABLE

defaultCatalog   连接池创建的连接的默认的catalog

参数  默认值  描述
initialSize  0  初始化连接:连接池启动时创建的初始化连接数量,1.2版本后支持
maxActive  8  最大活动连接:连接池在同一时间能够分配的最大活动连接的数量,
如果设置为非正数则表示不限制
maxIdle  8  最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,
如果设置为负数表示不限制
minIdle  0  最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,
如果设置为0则不创建
maxWait  无限  最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),
超过时间则抛出异常,如果设置为-1表示无限等待

参数  默认值  描述
validationQuery   SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,
则查询必须是一个SQL SELECT并且必须返回至少一行记录
testOnBorrow  true  指明是否在从池中取出连接前进行检验,如果检验失败,
则从池中去除连接并尝试取出另一个.
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testOnReturn  false  指明是否在归还到池中前进行检验
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testWhileIdle  false  指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,
则连接将被从池中去除.
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
timeBetweenEvictionRunsMillis  -1  在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.
 如果设置为非正数,则不运行空闲连接回收器线程
numTestsPerEvictionRun  3  在每次空闲连接回收器线程(如果有)运行时检查的连接数量
minEvictableIdleTimeMillis  1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程
(如果有)回收的最小时间值,单位毫秒

参数  默认值  描述
poolPreparedStatements  false  开启池的prepared statement 池功能
maxOpenPreparedStatements  不限制  statement池能够同时分配的打开的statements的最大数量,
如果设置为0表示不限制


这里可以开启PreparedStatements池. 当开启时, 将为每个连接创建一个statement池,
并且被下面方法创建的PreparedStatements将被缓存起来:
    * public PreparedStatement prepareStatement(String sql)
    * public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
注意: 确认连接还有剩余资源可以留给其他statement
参数  默认值  描述
accessToUnderlyingConnectionAllowed  false  控制PoolGuard是否容许获取底层连接


如果容许则可以使用下面的方式来获取底层连接:
    Connection conn = ds.getConnection();
    Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();
    ...
    conn.close();

默认false不开启, 这是一个有潜在危险的功能, 不适当的编码会造成伤害.
(关闭底层连接或者在守护连接已经关闭的情况下继续使用它).请谨慎使用,
并且仅当需要直接访问驱动的特定功能时使用.
注意: 不要关闭底层连接, 只能关闭前面的那个.
参数  默认值  描述
removeAbandoned  false  标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制.
如果设置为true, 连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout.
设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接.
removeAbandonedTimeout  300  泄露的连接可以被删除的超时值, 单位秒
logAbandoned  false  标记当Statement或连接被泄露时是否打印程序的stack traces日志。
被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,
因为需要生成stack trace。


如果开启"removeAbandoned",那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() < 2)
 and (getNumActive() > getMaxActive() - 3)时被触发.
举例当maxActive=20, 活动连接为18,空闲连接为1时可以触发"removeAbandoned".
但是活动连接只有在没有被使用的时间超过"removeAbandonedTimeout"时才被删除,默认300秒.
在resultset中游历不被计算为被使用.



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓 5

有啥不懂的可以单聊解答....

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值