Jfinal多数据源问题

super_oop 发布于 2013/11/12 17:27
阅读 1K+
收藏 2

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

@JFinal

我现在这有一个项目,使用了JFinal 并且使用了多数据源,其中包括一个在configPlugin(Plugins plu)配置的主数据源和3个在服务启动时在 afterJFinalStart()方法中用分线程加载的3个辅助数据源,这几个数据源都用的是阿里巴巴的Druid数据库连接池,配置如图:

这是主数据源的配置

启动的时候我调用

在loadData中用分线程去执行加载数据源

将加载出来的数据源放到一个集合中

然后在获取数据源的方法中,根据需求用对应的ip作为键值 获取数据源

数据源的使用 是用的jfinal支持的Db模式

因为知道在为指定数据源的时候activerecord Db 的一系列操作都是针对于主数据源的 所以也有在项目其他地方使用Db模式操作主数据源

项目的其他一些地方都是遵循的jfinal activerecord Db 支持多数据源的规则,只是其中我在执行存储过程的时候操作数据源的方式不同
我是直接根据相关条件获取到的一个数据源获取的链接

上面这些就是我在项目中使用jfinal操作多数据源的步骤

问题:但是在使用的过程中,或两三天,或四五天,就会出现一个获取链接超时的错误


获取不到链接..每次只有重启tomcat才能解决,这个问题出现了有些时候了,当时以为是数据库服务器的配置问题,因为只是会有一台服务器会出现获取链接超时的问题,可是后来改了服务器的配置,还是不行,所以我不知道是不是代码的问题,那如果是代码的问题,我是哪里出错了吗?希望波波给予解答,谢谢
加载中
0
JFinal
JFinal

   可能与你在本问答中的 DbKit.close(cs, con) 这行代码有关系。看一下 JFinal 中的DbKit.close源码,里面会有这样的判断:

// in transaction if conn in threadlocal
if (threadLocal.get() == null) {
  if (conn != null) {
    try {conn.close();
    } catch (SQLException e) {
      throw new ActiveRecordException(e);
    }
  }
}
假定上面的程序在执行 DbKit.close(cs, con)时正好threadLocal中有正好取到了值,那么当前的 connection 就无法正常关闭,当越来越多的连接未关闭,势必连接池就不能按在预计时间内得到连接,就会造成超时。解决办法是自己手动关闭连接,而不要使用DbKit.close(..)。

    记得解决问题后回来分享给大家


0
s
super_oop

引用来自“JFinal”的答案

   可能与你在本问答中的 DbKit.close(cs, con) 这行代码有关系。看一下 JFinal 中的DbKit.close源码,里面会有这样的判断:

// in transaction if conn in threadlocal
if (threadLocal.get() == null) {
  if (conn != null) {
    try {conn.close();
    } catch (SQLException e) {
      throw new ActiveRecordException(e);
    }
  }
}
假定上面的程序在执行 DbKit.close(cs, con)时正好threadLocal中有正好取到了值,那么当前的 connection 就无法正常关闭,当越来越多的连接未关闭,势必连接池就不能按在预计时间内得到连接,就会造成超时。解决办法是自己手动关闭连接,而不要使用DbKit.close(..)。

    记得解决问题后回来分享给大家


嗯,我也考虑到了,在代码中,除了调用存储过程的地方是手动关闭链接的,其他地方都是用的Db的系列方法,而Db的系列方法会自动的关闭链接。

谢谢@JFinal的细心解答,等我改过之后,如是这个问题,我再来分享。

JFinal
JFinal
其实只有多数据下DbKit.close才可能有此问题,单数据源没关系
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部