java c3p0:如何配置 autoreconnect=true?

Posted

技术标签:

【中文标题】java c3p0:如何配置 autoreconnect=true?【英文标题】:java c3p0: how can i configure autoreconnect=true? 【发布时间】:2010-08-18 11:12:07 【问题描述】:

我正在使用 Java 编写一个 red5 应用程序 我正在使用 c3p0 进行数据库交互。

似乎在我的 mysql 服务器中的连接超时后,我的应用程序停止工作,并建议配置 autoreconnect=true。

我该怎么做?

这是我用来创建数据源的函数:

private ComboPooledDataSource _createDataSource() 
    Properties props = new Properties();
    // Looks for the file 'database.properties' in TOMCAT_HOME\webapps\RED5_HOME\WEB-INF\
    try 
        FileInputStream in = new FileInputStream(System.getProperty("red5.config_root") + "/database.properties");
        props.load(in);
        in.close();
     catch (IOException ex) 
        log.error("message: ", ex.getMessage());
        log.error("stack trace: " + ExceptionUtils.getFullStackTrace(ex));
        return null;
    

    // It will load the driver String from properties
    String drivers = props.getProperty("jdbc.drivers");
    String url = props.getProperty("jdbc.url");
    String username = props.getProperty("jdbc.username");
    String password = props.getProperty("jdbc.password");

    ComboPooledDataSource cpds = new ComboPooledDataSource();
    try 
        cpds.setDriverClass(drivers);
     catch (PropertyVetoException ex) 
        log.error("message: ", ex.getMessage());
        log.error("stack trace: " + ExceptionUtils.getFullStackTrace(ex));
        return null;
    

    cpds.setJdbcUrl(url);
    cpds.setUser(username);
    cpds.setPassword(password);
    cpds.setMaxStatements(180);

    return cpds;

【问题讨论】:

【参考方案1】:

创建一个文件c3p0.properties,该文件必须位于类路径的根目录中:

# c3p0.properties
c3p0.testConnectionOnCheckout=true

有关更多文档,请参阅this。

This post 也可能有帮助。

【讨论】:

有人能解释一下什么是连接签入和签出吗?【参考方案2】:

属性 autoreconnect 不是 C3p0 对象的一部分要使用 C3P0 池,建议配置其他选项(如 testConnectionOnCheckout),并使用工厂。

你在这里http://www.mchange.com/projects/c3p0/index.html获得所有C3p0信息和样本

您可以使用外部属性文件,或通过代码添加:例如如何使用数据源创建自定义池数据源并添加自定义选项(C3p0 文档网址中的更多示例)

// Your datasource fetched from the properties file
DataSource ds_unpooled = DataSources.unpooledDataSource("url", "user", "password");


// Custom properties to add to the Source
// See http://www.mchange.com/projects/c3p0/index.html#configuration_properties                           

Map overrides = new HashMap();
overrides.put("maxStatements", "200");         //Stringified property values work
overrides.put("maxPoolSize", new Integer(50)); //"boxed primitives" also work

// Your pooled datasource with all new properties
ds_pooled = DataSources.pooledDataSource( ds_unpooled, overrides ); 

【讨论】:

是的!好多了。 MYSQL 官方强烈建议不要使用 autoreconnect - 它可能会导致损坏问题。抱歉,没有链接 - 几年前看到的。

以上是关于java c3p0:如何配置 autoreconnect=true?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA连接池技术

Spring配置c3p0数据源时出错报:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

如何配置 JavaMelody 以监控 C3p0 数据源中的 Jdbc 连接

Java 配置C3P0数据连接池存入数据存入数据库出现中文乱码问题

spring配置c3p0连接池

如何在 Play 1.4.3 中更改另一个数据源(不是默认的 c3p0)