我正在开发一个使用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
根据我从回复中学到的东西,我需要使用我正在处理的代码库中定义的对象中没有代码来提出这个问题。我将接受罗文斌提供的答案,并更正确地重新提出问题。
答案 0 :(得分:0)
我认为如果连接在检查时仍然有效,则表示您的意思。 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