首页 > 解决方案 > 如何使用 c3p0 库设置驱动程序连接属性?

问题描述

我正在从 dbcp2 迁移到 c3p0,

我们通过从 dbcp2 扩展 BasicDataSource 并设置属性来创建数据源。某些属性是通过 setConnectionProperties 方法在驱动程序级别设置的。

扩展 AbstractComboPooledDataSource 时,我在 c3p0 中没有看到这样的规定。有没有另一种设置方法?

挖掘文档,我发现了一个叫做 connectionCustomizer 的东西,但不确定它是否一样

这就是我当前使用 dbcp2 设置属性的方式:

this.setConnectionProperties("driver:oracle.jdbc.ReadTimeout=180000");
this.setConnectionProperties("driver:oracle.net.CONNECT_TIMEOUT=180000");

其中“this”是扩展 BasicDataSource 的类

c3p0 中是否有同样的结果?

编辑:

为了清楚起见,我能够设置 c3p0 库提供的属性,我正在寻找的是在驱动程序级别设置属性,dbcp2 允许通过 SetConnectionProperties() 方法执行此操作。谢谢

标签: jdbcc3p0apache-commons-dbcp

解决方案


您可以从以下答案中获取详细信息,

https://stackoverflow.com/a/51838455/1529092

所以基本上你必须做这样的事情,

@Bean
public ComboPooledDataSource dataSource(){
    ComboPooledDataSource dataSource = new ComboPooledDataSource();

    try {
        dataSource.setDriverClass(env.getProperty("db.driver"));
        dataSource.setJdbcUrl(env.getProperty("db.url"));
        dataSource.setUser(env.getProperty("db.username"));
        dataSource.setPassword(env.getProperty("db.password"));
        dataSource.setMinPoolSize(Integer.parseInt(env.getProperty("minPoolSize")));
        dataSource.setMaxPoolSize(Integer.parseInt(env.getProperty("maxPoolSize")));
        dataSource.setMaxIdleTime(Integer.parseInt(env.getProperty("maxIdleTime")));
        dataSource.setMaxStatements(Integer.parseInt(env.getProperty("maxStatements")));
        dataSource.setMaxStatementsPerConnection(Integer.parseInt(env.getProperty("maxStatementsPerConnection")));
        dataSource.setMaxIdleTimeExcessConnections(10000);

    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
    return dataSource;
}

编辑:

根据文档,每个框架的超时属性都不同,因此在这种情况下,超时由以下人员处理,

  • 最大连接年龄
  • 最大空闲时间
  • maxIdleTimeExcessConnections

管理池大小和连接年龄 Go To Top

不同的应用程序在性能、占用空间和可靠性之间的权衡方面有不同的需求。C3P0 提供了多种选项来控制在负载下变大的池恢复到 minPoolSize 的速度,以及是否应主动替换池中的“旧”连接以保持其可靠性。

  • 最大连接年龄
  • 最大空闲时间
  • maxIdleTimeExcessConnections

默认情况下,池永远不会过期连接。如果您希望连接随着时间的推移而过期以保持“新鲜度”,请设置 maxIdleTime 和/或 maxConnectionAge。maxIdleTime 定义在从池中剔除之前应允许连接未使用的秒数。maxConnectionAge 强制池剔除从数据库获取的任何连接数超过过去设置的秒数。

maxIdleTimeExcessConnections 是关于在池未加载时最小化 c3p0 池持有的连接数。默认情况下,c3p0 池会在负载下增长,但只有在连接测试失败或通过上述参数过期时才会缩小。一些用户希望他们的池在强制使用大池大小的使用高峰后快速释放不必要的连接。您可以通过将 maxIdleTimeExcessConnections 设置为比 maxIdleTime 短得多的值来实现此目的,如果连接闲置超过很短的时间,则强制释放超出设置的最小大小的连接。

关于所有这些超时参数的一些一般建议: 慢下来!Connection pooling 的要点是只承担一次获取 Connection 的成本,然后多次重用 Connection。大多数数据库支持一次保持打开数小时的连接。无需每隔几秒或几分钟就翻阅所有的连接。将 maxConnectionAge 或 maxIdleTime 设置为 1800(30 分钟)是相当激进的。对于大多数数据库,几个小时可能更合适。您可以通过测试而不是扔掉它们来确保连接的可靠性。(请参阅配置连接测试。)这些参数中唯一一个通常应该设置为几分钟或更短的参数是 maxIdleTimeExcessConnections。


推荐阅读