当尝试通过Java连接到Oracle数据库时,我随机收到“IO错误:网络适配器无法建立连接”。有时我必须运行我的应用程序几次才能停止抛出错误。
// initializes database connection
private static Connection initializeDatabaseConnection(Properties prop) {
System.setProperty("oracle.net.tns_admin", prop.getProperty("tnsLocation"));
try {
Class.forName("oracle.jdbc.OracleDriver");
}
catch (ClassNotFoundException ex)
{
System.out.println(ex.getMessage());
}
String dbURL = "jdbc:oracle:thin:@" + prop.getProperty("serviceName");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
Connection conn = null;
try {
conn = DriverManager.getConnection(dbURL, username, password);
}
catch (SQLException ex)
{
System.out.println("Error initializing database connection. " + ex.getMessage());
System.exit(1);
}
return conn;
}
关于为什么它会随机抛出该错误的任何想法?我正在使用带有ojdbc6.jar驱动程序的JDK 1.7。
答案 0 :(得分:2)
下载PingPlotter并将其打开(让它保持运行24小时左右)。观看历史图表,在应用程序无法连接到Oracle的同时,您可能会发现IP地址下降或响应时间。您没有逻辑错误,服务器严重超载,或者您与它之间存在严重拥塞。你是通过VPN连接的吗?
或者只需在连续模式下从命令行使用ping一小时左右:
ping -t <IP address or hostname>
Ping绘图仪不经常ping,它会创建漂亮的图形。
如果您正在远程工作,那么它可能是您的ISP。否则,请与网络管理员或DBA联系。
显然,您无法通过糟糕的数据库连接进入生产阶段,因此希望您只是从开发环境中看到此问题。尝试部署到计划最终运行应用程序的计算机,看看它是否有所改进。
如果没有什么可以做的更好,我建议增加JDBC驱动程序的初始登录超时。
Google JDBC setLoginTimeout
这是一个例子,虽然有几种方法可以解决它,具体取决于你的驱动程序。