如何使用c3p0库设置驱动程序连接属性?

时间:2019-04-12 10:28:14

标签: jdbc c3p0 apache-commons-dbcp

我正在从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()方法进行的操作一样。谢谢

2 个答案:

答案 0 :(得分:0)

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

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;
}

编辑:

根据documentation,每个框架的超时属性都不同,因此,在这种情况下,超时是由

处理的
  • maxConnectionAge
  • maxIdleTime
  • maxIdleTimeExcessConnections
  

管理池的大小和连接期限返回页首

     

不同的应用在权衡方面有不同的需求   性能,占用空间和可靠性之间的关系。 C3P0提供了广泛的   用于控制池增长速度的多种选项   较大的负载将还原为minPoolSize,以及是否为“旧”连接   池中应积极更换以保持其   可靠性。

     
      
  • maxConnectionAge
  •   
  • maxIdleTime
  •   
  • maxIdleTimeExcessConnections
  •   
     

默认情况下,池永远不会使连接失效。如果您希望连接随着时间的推移而过期   为了保持“新鲜”,请设置maxIdleTime和/或maxConnectionAge。   maxIdleTime定义应允许多少秒的连接   从池中扑杀前,不要使用。 maxConnectionAge   强制池取消从连接中获取的所有连接   数据库超过了过去设置的秒数。

     

maxIdleTimeExcessConnections旨在最大程度地减少   当池未处于负载状态时,c3p0池所拥有的连接。通过   默认情况下,c3p0池在负载下增长,但仅在“连接”时收缩   连接测试失败或通过参数过期   如上所述。一些用户希望他们的池快速释放   在使用量激增后强制不必要的连接   游泳池的大小。您可以通过设置   maxIdleTimeExcessConnections的值比maxIdleTime短得多,   如果出现以下情况,将强制释放超出设置的最小大小的连接   他们闲置了不止一小段时间。

     

有关所有这些超时参数的一些一般建议:放慢速度!   连接池的重点是承担获取连接的成本。   连接一次,然后重用Connection,很多很多   次。大多数数据库都支持可保持开放状态数小时的连接   一次。无需每次都遍历所有连接   几秒钟或几分钟。将maxConnectionAge或maxIdleTime设置为   1800(30分钟)相当激进。对于大多数数据库,几个   小时可能更合适。您可以确保您的可靠性   通过测试而不是通过扔掉它们来建立连接。 (看到   配置连接测试。)这些参数中只有一个   通常应设置为几分钟或更短的时间   maxIdleTimeExcessConnections。

答案 1 :(得分:0)

我在以下答案中找到了答案: c3p0 hangs on getConnection when there is a network failure

private ConditionList _selectedCondition;
public ConditionList SelectedCondition
{
    get { return _selectedCondition; }
    set
    {
        _selectedCondition = value;
        NotifyPropertyChanged();
        //populate the list...
        TypeList = new List<TypeList> { ... };
    }
}

public IEnumerable<TypeList> TypeList
{
    get { return _TypeList; }
    private set { _TypeList = value; NotifyPropertyChanged(); }
}

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] String propertyName = "")
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}