c3p0连接死锁
笔主今天遇到了c3p0连接池死锁的问题,c3p0发生死锁大多跟配置文件有关。如果c3p0连接池设置过小。当连接池满时。由于没有对各个线程设置优先级。导致后面的线程一直等待连接。造成死锁。
解决办法:把max_statements设置为0。
c3p0在同时关闭statement和connection的时候,或者关闭他们之间的时间很短的时候,有时候connection并没有被关闭,因为有些preparedstatement还在被cached住。
说点题外话:当两个用户(或会话)具有不同对象的锁,并且每个用户需要另一个对象的锁时,就会出现死锁。每个用户都等待另一个用户释放他的锁。当两个连接陷入死锁时,Microsoft? SQL Server? 会进行检测。其中一个连接被选作死锁牺牲品。该连接的事务回滚,同时应用程序收到错误。
使用分布式事务时,也可能发生死锁或阻塞。任何基于锁的并发系统都不可避免地具有可能在某些情况下发生阻塞的特征。当一个连接控制了一个锁,而另一个连接需要冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,或在第一个连接上阻塞。
术语"连接"是指数据库的单个登录会话。每个连接都作为系统进程 ID (SPID) 出现。尽管每一个 SPID 一般都不是单独的进程上下文,但这里常常用来指一个进程。更确切的说,每个 SPID 都是由服务器资源和数据结构(为 给定客户单个连接的请求提供服务)组成。单个客户应用程序可能有一个或多个连接。就 SQL Server 而言,从单个客户机上的单个客户应用程序来的多个连接和从多个客户应用程序或多个客户机来的多个连接是没有区别的。不管是来自同一应用程序还是来自两台不 同客户机上单独的应用程序,一个连接都可以阻塞另一个连接。)
下面的代码说明了次c3p0的详细配置参数:
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class ConnectionManager {
private ComboPooledDataSource ds;
private ConnectionManager connManger;
private ConnectionManager() throws PropertyVetoException {
ds = new ComboPooledDataSource();
// 设置c3p0连接池的数据库驱动类
ds.setDriverClass("com.mysql.jdbc.Driver");
// 设置c3p0连接池数据库连接URL
ds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/school");
// 设置c3p0连接池数据库用户名
ds.setUser("root");
// 设置c3p0连接池数据库密码
ds.setPassword("root");
// 当连接池中的连接用完时,C3P0一次性创建新连接的数目2
ds.setAcquireIncrement(2);
// acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30秒
ds.setAcquireRetryAttempts(30);
// 两次连接中间隔时间,单位毫秒,默认为1000;
ds.setAcquireRetryDelay(3000);
// 连接关闭时默认将所有未提交的操作回滚。默认为false;
ds.setAutoCommitOnClose(false);
/**
* C3P0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数,那么属性preferredTestQuery将被忽略。
* 你不能在这张Test表上进行任何操作,它将中为C3P0测试所用,默认为null;
*/
// ds.setAutomaticTestTable("teacher");
/**
* 获取连接失败将会引起所有等待获取连接的线程抛出异常。但是数据源仍有效保留, 并在下次调 用getConnection()的时候继续尝试获取连接。如果设为true,
* 那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认为 false;
*/
ds.setBreakAfterAcquireFailure(false);
/**
* 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException, 如设为0则无限期等待。单位毫秒,默认为0;
*/
ds.setCheckoutTimeout(1000);
/**
* 通过实现ConnectionTester或QueryConnectionTester的类来测试连接,类名需设置为全限定名。 默认为
* com.mchange.v2.C3P0.impl.DefaultConnectionTester;
*/
ds.setConnectionTesterClassName(new DefaultConnectionTester().getClass().getName());
// hook方法,在对相关资源做操作的时候,''他所操作的connection是真实的数据库连接,而不是proxy过的connection''
// ds.setConnectionCustomizerClassName("");
// 连接池数据源
// ds.setConnectionPoolDataSource(ConnectionPoolDataSource 对象);
// idleConnectionTestPeriod:隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查
ds.setIdleConnectionTestPeriod(10);
// 初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3;
ds.setInitialPoolSize(5);
// 最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0;
ds.setMaxIdleTime(3);
// 连接池中保留的最大连接数。默认为15;
ds.setMaxPoolSize(100);
/**
* JDBC的标准参数,用以控制数据源内加载的PreparedStatement数量。 但由于预缓存的Statement属 于单个Connection而不是整个连接池。
* 所以设置这个参数需要考虑到多方面的因素,如果maxStatements与 maxStatementsPerConnection均为0, 则缓存被关闭。默认为0;
*/
ds.setMaxStatements(1000);
// 连接池内单个连接所拥有的最大缓存Statement数。默认为0;
ds.setMaxStatementsPerConnection(100);
// C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3;
ds.setNumHelperThreads(5);
/**
* preferredTestQuery:定义所有连接测试都执行的测试语句。 在使用连接测试的情况下这个参数能显著提高测试速度。测试的表必须在初始数据源的时候就存在。默认为null; propertyCycle:
* 用户修改系统配置参数执行前最多等待的秒数。默认为300; testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。 如果设为true那么在每个connection提交的时候都
* 将校验其有效性。 建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。默认为false;
* testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。默认为false。
*
*/
}
public static void main(String[] args) {
try {
ConnectionManager connManger = new ConnectionManager();
Connection conn = connManger.ds.getConnection();
Statement st = conn.createStatement();
String sql = "select * from teacher";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt("id") + "," + rs.getString("name"));
}
}
catch (PropertyVetoException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
参考文献: CSDN c3p0实力和参数详解
分享到:
相关推荐
C3P0连接池是Java应用中常用的数据库连接池组件,它允许程序在不关闭物理连接的情况下,管理和重用数据库连接,从而提高了应用程序的性能和效率。C3P0库依赖于其他几个JAR包来实现其功能,包括`c3p0-0.9.2.1.jar`、`...
C3P0提供了一些高级特性,例如自动检测死锁、自动重试失败的连接、连接健康检查等。它还支持细粒度的连接池配置,可以根据应用需求调整各种参数,比如最小空闲连接数、获取连接超时时间、测试连接的SQL语句等。通过...
C3P0连接池是Java开发中广泛使用的数据库连接池技术,它允许应用程序高效、便捷地管理和重用数据库连接,从而提升系统性能并减少资源消耗。C3P0由Miquel Armandariz开发,它是一个开源项目,基于Apache 2.0许可证...
C3P0的主要优点包括自动检测死锁、连接测试、连接池大小动态调整等,这些特性使得C3P0在处理多并发和长时间运行的应用中表现优秀。 **三、配置C3P0连接池** 在Spring项目中使用C3P0,首先需要在项目的`pom.xml`文件...
1. 自动管理连接:C3P0会自动检测并关闭无效的连接,避免死锁问题。 2. 连接池大小动态调整:可以根据实际负载自动调整连接池的大小。 3. 空闲连接测试:定期对连接进行有效性检查,确保获取的连接都是可用的。 4. ...
C3P0由Mchange公司开发,它具有自动检测死锁、空闲连接检测以及多种配置参数以优化性能的特点。 1. **C3P0核心概念** - 数据库连接:是应用程序与数据库交互的桥梁,创建和关闭都需要消耗资源。 - 连接池:预先...
C3P0是一款开源的Java连接池,全称为ComMChange V2 C3P0,由M. J. Franklin创建并维护。它提供了一种高效、灵活且强大的数据库连接管理方式,广泛应用于Java应用程序中,特别是对于那些需要大量并发数据库访问的Web...
2. **自动检测和回收死锁**:C3P0具有内置的机制来检测和处理长时间未使用的连接,避免因数据库连接泄漏导致的问题。 3. **连接测试**:在分配给应用程序之前,C3P0会自动对数据库连接进行有效性测试,确保获取的...
C3P0的主要功能包括自动检测死锁、自动重试失败的数据库操作、支持多线程并发等。配置C3P0时,开发者可以通过调整各种参数来优化性能,如初始化连接数、最大连接数、超时时间等。 接下来是MySQL的JDBC驱动,即mysql...
C3P0提供了一些高级特性,如自动检测死锁、空闲连接测试、连接池大小动态调整等。 二、C3P0的配置 1. 添加依赖:在项目中引入C3P0的依赖库,通常是在Maven的pom.xml文件中添加对应的依赖项。 2. 配置文件:C3P0的...
C3P0提供了一些高级特性,如自动检测死锁、空闲连接测试、连接池大小动态调整等。使用C3P0时,开发者需要配置一些关键参数,例如初始连接数量、最大连接数量、最小连接数量、超时时间等,以满足应用的需求。 接下来...
C3P0具备自动检测死锁、空闲连接回收、连接测试等特性,能够帮助开发者更有效地管理数据库连接,提高系统性能和稳定性。 2. Ojdbc14.jar: 这个文件是Oracle JDBC驱动的旧版本,用于与Oracle数据库进行通信。JDBC...
1. **连接池管理**:C3P0能够创建和维护一个数据库连接池,这些连接可以被多个线程共享,从而避免了频繁地创建和关闭连接带来的开销。这显著提升了应用的运行效率,减少了数据库服务器的压力。 2. **自动管理连接**...
2. **自动检测死锁**:c3p0可以定期检测并回收可能存在的死锁连接,保证系统的稳定运行。 3. **连接测试**:在返回给应用程序之前,c3p0会对连接进行有效性检查,确保获取到的是健康的数据库连接。 4. **多线程支持*...
c3p0的其他高级特性还包括自动检测死锁、空闲连接测试、连接生命周期管理等。开发者可以根据需要调整配置参数,优化数据库性能。通过熟练掌握c3p0的使用,可以有效地提升应用程序处理数据库的能力,减少资源浪费,...
此外,c3p0还提供了自动检测死锁、空闲连接回收、连接超时等多种特性,确保了数据库连接的稳定性和效率。 3. **c3p0-oracle-thin-extras-0.9.5.5.jar**: 这个JAR文件是针对Oracle数据库的特定扩展,它提供了对...
2. **自动检测与回收**:C3P0会定期检查连接的有效性,发现死锁或超时的连接会自动回收,确保应用使用的是健康状态的连接。 3. **连接池配置**:C3P0提供丰富的配置选项,如最小、最大连接数,测试连接的SQL语句,...
2. **自动检测与修复**:c3p0可以定期检查连接的有效性,如果发现死锁或超时,会自动关闭并重新创建新的连接。 3. **连接池扩展性**:允许用户自定义连接创建、验证和销毁的策略,以适应不同的数据库环境。 4. **...
2. **c3p0特性**: c3p0具有自动检测死锁、空闲连接测试、自动扩缩容连接数量等特性,提高了系统的并发处理能力和资源利用效率。 **二、c3p0配置** 1. **初始化配置**: 开发者可以通过`c3p0-config.xml`文件或程序...
C3P0的主要特性包括自动检测死锁、自动重试失败的数据库连接、多线程并发控制等。 **2. C3P0的配置** C3P0的配置主要通过XML文件进行,一般会放在项目的`conf`目录下,文件名为`c3p0-config.xml`。以下是一些基本...