这个和类似的问题被问了很多次,但没有一个推荐的设置对我有用。
如果数据库主机不可用或 Oracle DB 仍未启动和运行,我需要为这种情况配置超时。
我需要检查 Docker 中 Oracle DB 服务器的状态,所以我select 1 from dual
在 bash 循环中执行,但是DriverManager.getConnection
20 秒后返回(除了提到的异常),这对我来说太多了。我想将此超时减少到 1 秒。
我知道有一个名为 TNSPING 的 Oracle 工具,用于检查 Oracle DB 服务器状态,但不幸的是,该工具不是官方 Oracle DB 映像的一部分,我不想仅仅因为 TNSPING 在 Docker 中安装任何 Oracle 产品。
这是我到目前为止所尝试的,但我使用的设置对这个超时没有影响。java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection
20 秒后出现异常。而不是 1 秒。没关系,我在 java 代码中使用 1、1000 或 10000,超时始终为 20 秒。
private Connection getConnection(String jdbcUrl) throws SQLException {
String timeout = "100";
Properties p = new Properties();
p.put(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CONNECT_TIMEOUT, timeout);
p.put(OracleConnection.CONNECTION_PROPERTY_THIN_READ_TIMEOUT, timeout);
p.put(OracleConnection.CONNECTION_PROPERTY_THIN_JNDI_LDAP_CONNECT_TIMEOUT, timeout);
p.put(OracleConnection.CONNECTION_PROPERTY_THIN_JNDI_LDAP_READ_TIMEOUT, timeout);
p.put(OracleConnection.CONNECTION_PROPERTY_THIN_OUTBOUND_CONNECT_TIMEOUT, timeout);
p.put(OracleConnection.CONNECTION_PROPERTY_DOWN_HOSTS_TIMEOUT, timeout);
p.put("oracle.jdbc.ReadTimeout", timeout);
p.put("oracle.net.CONNECT_TIMEOUT", timeout);
p.put (OracleConnection.CONNECTION_PROPERTY_USER_NAME, user);
p.put (OracleConnection.CONNECTION_PROPERTY_PASSWORD, password);
System.setProperty("oracle.net.READ_TIMEOUT", timeout);
System.setProperty("oracle.jdbc.ReadTimeout", timeout);
System.setProperty("oracle.jdbc.javaNetNio", "true");
DriverManager.setLoginTimeout(Integer.valueOf(timeout));
Connection connection = DriverManager.getConnection(jdbcUrl, p);
connection.setNetworkTimeout(Executors.newSingleThreadExecutor(), Integer.valueOf(timeout));
return connection;
}
我不想在我的简单应用程序中添加连接池解决方案,只有纯 JDBC 对我来说就足够了。
我在这里错过了什么?
- 更新 -
似乎问题是特定于环境的,可能与 Java 无关,但仍不确定。
如果我在我的机器和 Docker 中执行完全相同的命令,那么我会得到不同的执行时间:
命令:
$ time java -jar sql-runner-0.2.0-SNAPSHOT-with-dependencies.jar -j jdbc:oracle:thin:@//somehost:1521/somedb -U "doesnotmatter" -P "password" "select 1 from dual"
码头工人的结果:
IO Error: Unknown host specified
real 0m20.521s
user 0m0.764s
sys 0m0.097s
如果我在我的机器上执行它的结果:
IO Error: Unknown host specified
real 0m0.501s
user 0m0.715s
sys 0m0.095s
完整的源代码可在此处获得。
这种行为太奇怪了。