我正在从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()方法进行的操作一样。谢谢
答案 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,每个框架的超时属性都不同,因此,在这种情况下,超时是由
处理的管理池的大小和连接期限返回页首
不同的应用在权衡方面有不同的需求 性能,占用空间和可靠性之间的关系。 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));
}