2
回答
JFinal:如何通过C3p0Plugin配置C3p0的其它参数?
华为云实践训练营,热门技术免费实践!>>>   

@JFinal 你好,想跟你请教个问题:

使用JFinal的C3p0Plugin时,如果跨防火墙访问数据库,而且在若干时间内没人访问应用的时候,就会出现

2015-03-19 09:23:48,254 [Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@1bf97ff7] INFO  [com.mchange.v2.c3p0.impl.NewPooledConnection] - [c3p0] NewPooledConnection close Exception.
java.sql.SQLRecoverableException: IO 错误: Software caused connection abort: recv failed

之前在SpringMVC也遇到这样的问题,后来为C3p0配置了

<property name="preferredTestQuery">select x from xx</property> 

参数之后就解决了。

现在使用C3p0Plugin貌似没有直接配置preferredTestQuery的方法,请问没有简便办法,在不重写C3p0Plugin的情况可以实现此参数配置呢?谢谢。

举报
车开源
发帖于3年前 2回/427阅
共有2个答案 最后回答: 3年前

想更简单点:

public class MyC3p0Plugin extends C3p0Plugin {
  public boolean start() {
    boolean result = super.start();
    ((ComboPooledDataSource)getDataSource()).setPreferredTestQuery(...);
    return result;
  }
}
  然后在用的时候 me.add(new MyC3p0Plugin());
--- 共有 2 条评论 ---
车开源另外还有建议,干脆就把getDataSource方法返回ComboPooledDataSource类型,这样是否好些呢 3年前 回复
车开源这个办法没抛出异常,正在验证是否有效。谢谢 3年前 回复

用如下方法即可:

C3p0Plugin cp = new C3p0Plugin(...);
ComboPooledDataSource ds = (ComboPooledDataSource)cp.getDataSource();
ds.setPreferredTestQuery("select x from xx");

即从 C3p0Plugin 对象中获取到 DataSource 强转成 com.mchange.v2.c3p0.ComboPooledDataSource 并调用它的 setPreferredTestQuery() 方法即可,要活学活用。

--- 共有 4 条评论 ---
车开源回复 @JFinal : 原来是这样。明白晒 3年前 回复
JFinal回复 @车开源 : 先要 cp.start(),然后才不会抛出异常,在手动调用 start() 方法的情况下,记得不要 me.add(c3p0plugin),防止两次 start() 的错误 3年前 回复
车开源经过测试,用此办法会抛出空指针异常。 3年前 回复
车开源[13],学会了 3年前 回复
顶部