JDBC驱动失效怎么办?

Posted

技术标签:

【中文标题】JDBC驱动失效怎么办?【英文标题】:What to Do when JDBC Driver is Invalid? 【发布时间】:2017-07-22 17:07:51 【问题描述】:

我正在开发一个使用 Oracle 数据库的 Java 项目。当我创建一个新的 Oracle 驱动程序时:

jdbcDriver driver = new jdbcDriver();

...我检查它是否有效:

if (!driver.isValid())

   throw new UncheckedSqlException("jdbcDriver not valid");

如果驱动程序无效,正确的程序是什么?也就是说,由于数据库不可用,因此无法存储数据并稍后异步重试(即不锁定应用程序)。是否假设如果我只是重试几次,我会得到一个有效的驱动程序?

更新

感谢 EJP 正确指出 jdbcDriver 是我代码中的一个类。这是正确的——它是我正在研究的代码库中的一个类。 EJP 要求发布相关详细信息。他们来了。

package us.mydev.jdbc.util;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

import org.apache.log4j.Logger;
import us.mydev.data.exception.UncheckedSqlException;

public class jdbcDriver

  [.....]
  public jdbcDriver()
  
    try
    
      m_iActiveConnections++;
      if (showLogMessages)
      
        log.debug("jdbcDriver() created, hashcode = " + this.hashCode()
            + ",Active Connection Count is " + m_iActiveConnections);
        log.debug("Data Source is " + DS_STANDARDUSER);
      

      InitialContext ctx = new InitialContext();
      DataSource ds = (DataSource)ctx.lookup(DS_STANDARDUSER);

      mydevGetJDBCConn getConn = new sqlConn(ds);
      m_conn = getConn.getConnection();
      m_iDatabaseType = getConn.getDBType();

    
    catch (NamingException _exp)
     // handle any errors
      log.error("failed", _exp);
    
  


  public boolean isValid() throws SQLException
  
    return m_conn != null && m_conn.isValid(10);
  

  [.....]

我发现在这段代码之后:

jdbcDriver driver = new jdbcDriver();
boolean driverIsValid = driver.isValid();

...driverIsValid 是 false 大约每 1000 次左右的数据库访问一次。我想这是我当前开发系统的产物——我让 Oracle 在虚拟机中运行。

在这种情况下,driverIsValid 在生产中出现错误会是不寻常的(或闻所未闻的)吗?如果它不是闻所未闻——考虑到我无法将相关数据保存到数据库中,通常如何处理——也就是说,我可以重试几次获取数据库连接并期望得到一个?

更新 #2

根据我从回复中了解到的情况,我需要使用我正在处理的代码库中定义的对象中的任何代码来提出这个问题。我将接受罗文斌提供的答案,并更恰当地重新提出问题。

【问题讨论】:

jdbcDriver 是什么? jdbcDriver 是什么?你是说java.sql.Driver接口吗? 如果您想在 JDBC 级别访问数据库(而不是通过 JPA、SpringData 等更高级别的抽象),那么您应该从以下内容开始:mkyong.com/jdbc/connect-to-oracle-db-via-jdbc-driver-java 接口从import java.sql.*;导入 我什至不会评论不完整的代码或 cmets 中的代码。如果您希望我们为您的代码提供帮助,您必须在您的问题中以一种有意义的形式发布它,所有相关的东西,而不是关于它是什么的错误断言。您提到的类不是java.sql中的接口或类,并且java.sql中除了java.sql.Connection.isValid(int timeout)之外没有isValid()方法,这不是您要调用的。帮我们和你自己一个忙,并正确地解释你自己。或查看您的问题已结束。 【参考方案1】:

我认为您的意思是在检查时连接是否仍然有效。 isValid 方法返回连接是否可用。您可以随时调用此方法,并允许您设置超时。 根据官方手册,方法是

    特别适用于与重试机制结合使用。 与连接超时和连接收集功能结合使用时很有帮助。

您当然可以重试该方法,希望之后数据库问题得到解决,但更一般的情况是您设置超时,然后您可能需要采取适当的措施并关闭连接。

try  conn = poolDataSouorce.getConnection ...  catch (SQLException sqlexc)

    if (conn == null || !((ValidConnection) conn).isValid())        
        // take the appropriate action   
    conn.close

更多信息请查看https://docs.oracle.com/cd/B28359_01/java.111/e10788/connect.htm#CHDIDEEB

【讨论】:

驱动程序在创建后立即失效的常见情况,例如这里:jdbcDriver driver = new jdbcDriver(); boolean isValid = driver.isValid();? @VikR 您告诉我们:这是您的代码,而不是普通的 JDBC 驱动程序。我建议你扔掉你的代码,并开始使用来自数据源的普通 JDBC 连接,而不是引入 - 似乎是 - 不必要的复杂性。

以上是关于JDBC驱动失效怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

win10系统 禁用驱动程序强制签名 成功后。电脑再次开机后就失效怎么处理?

java 怎么加载oracle驱动

加载MYSQL JDBC驱动问题

怎么安装MYSQL5.0的JDBC驱动

java中怎么报没有驱动,我已经添加了jar包

如何MySQL JDBC驱动程序到Android工作室