连接不好时,有没有办法让JBoss连接池重新连接到Oracle?


Answers

虽然您可以使用旧的“从双重选择1”的技巧,但是这样做的缺点是每次从池中借用连接时都会发出额外的查询。 对于大批量,这是浪费。

JBoss提供了一个专门用于Oracle的连接验证器:

<valid-connection-checker-class-name>
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
</valid-connection-checker-class-name>

这使用Oracle JDBC Connection类上专有的ping()方法,并使用驱动程序的底层网络代码来确定连接是否仍然存在。

但是,每次连接都被借用时,运行此操作仍然是浪费的,因此您可能希望使用后台线程检查池中的连接的设施,并默默丢弃已死的连接。 这样做效率更高,但意味着如果连接失败,在后台线程运行检查之前使用它们的任何尝试都将失败。

请参阅wiki文档以了解如何配置后台检查(查找background-validation-millis )。

Question

我们有JBoss和Oracle在不同的服务器上。 这些连接似乎被删除,并导致与JBoss的问题。 如果连接不好,我怎么能让JBoss重新连接到Oracle?我们要弄清楚为什么连接首先被丢弃?




对@ skaffman的答案稍作更新。 在JBoss 7中,你必须在设置有效的连接检查器时使用“class-name”属性,并且包也是不同的:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />




JBoss提供了两种验证连接的方法: - 基于Ping的AND - 基于查询

您可以按照要求使用。 这是按照数据源配置文件中定义的持续时间由单独的线程调度的。

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

有些时候,如果你在Jboss没有正确的oracle驱动程序,你可能会得到classcast或者相关的错误,并且连接可能会从连接池中退出。 您可以尝试通过实现org.jboss.resource.adapter.jdbc.ValidConnectionChecker接口来创建自己的ConnectionValidator类。 这个接口只提供单一的方法' isValidConnection() ',期望'NULL'作为有效连接的返回。

例如:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable {

   private Method ping;

   // The timeout (apparently the timeout is ignored?)
   private static Object[] params = new Object[] { new Integer(5000) };

   public SQLException isValidConnection(Connection c) {

       try {
           Integer status = (Integer) ping.invoke(c, params);

           if (status.intValue() < 0) {
               return new SQLException("pingDatabase failed status=" + status);
           }

       }
       catch (Exception e) {
           log.warn("Unexpected error in pingDatabase", e);
       }

       // OK
       return null;
   }
}