我正在尝试为使用 Eclipse 数据工具平台的项目设置连接超时。目的是防止在数据库连接建立时间过长时出现等待。该项目支持多种数据库类型。
如果项目使用纯java.sql,我可以按如下方式设置超时:
final int TIMEOUT_SECONDS = 5;
DriverManager.setLoginTimeout(TIMEOUT_SECONDS);
Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
我尝试在 org.eclipse.datatools.connectivity 类中寻找类似的内容,例如 IConnectionProfile。到目前为止,我一直无法找到像DriverManager.setLoginTimeout这样的特定方法。
java.sql和org.eclipse.datatools.connectivity都支持添加属性来设置连接信息:
java.sql
Properties properties = new Properties();
properties.setProperty("user", connectionInfo.username);
properties.setProperty("password", connectionInfo.password);
String connectionTimeoutProperty = getConnectionTimeoutProperty(); // depends on the database vendor
String connectionTimeoutValue = getConnectionTimeoutPropertyValue(); // The value in seconds or milliseconds - also depends on the vendor
properties.setProperty(connectionTimeoutProperty, connectionTimeoutValue);
connection = DriverManager.getConnection(jdbcUrl, properties);
org.eclipse.database.connectivity
Properties properties = new Properties();
// Similar property setup as above.
ProfileManager.getInstance().createProfile(profileName, "Auto Generated", "org.eclipse.datatools.connectivity.db.generic.connectionProfile", properties, "", false);
return ProfileManager.getInstance().getProfileByName(profileName);
使用属性,我已经能够为大多数数据库设置超时。例如,Oracle 支持以毫秒表示的名为 oracle.net.CONNECT_TIMEOUT 的属性,而 Microsoft SQL Server 支持以秒表示的名为 loginTimeout 的属性。
我尚未找到 Sybase、Teradata 和 Netezza 的值。
问题1:是否有更简单的机制来设置数据工具平台的登录超时时间? 问题2:如果没有更好的解决方案,有没有办法为Sybase、Teradata和Netezza设置超时?我可以处理具有不同名称和值类型的属性。
最佳答案
经过一些研究,我发现创建 IConnectionProfile 实际上在幕后使用了 java.sql.DriverManager。如果我在创建连接配置文件之前设置 DriverManager.setLoginTimeout,则会识别超时。
但是,我还了解到 setLoginTimeout 并不能保证被所有驱动程序识别。例如,Informix、Netezza 和 PostgreSQL 没有使用 setLoginTimeout 设置的时间。对于我的用例,这些数据库不适用,所以我只使用了 setLoginTimeout。
虽然我没有将它用于我的解决方案,但可以使用属性来设置登录超时(请参阅原始帖子)。但是,属性名称和值类型(秒或毫秒)取决于驱动程序。
以下是我测试的各个数据库的结果。
以下是我使用具有低值(2 秒)的 setLoginTimeout 和保证超时的 URL 进行的测试的结果:
- DB2 UDB - 有效
- DB2 zOS - 有效
- HIVE - 有效
- INFORMIX - 不起作用 - 使用自己的超时(20 秒以上)
- NETEZZA - 不起作用 - 使用自己的超时(20 秒以上)
- ORACLE - 可以运行(大约慢 2-3 秒)
- POSTGRES - 不起作用 - 使用自己的超时 10+ 秒
- SQL_SERVER - 有效
- SYBASE - 有效
- TERADATA - 有效
以下是使用属性的测试结果(属性名称和值类型在括号中):
- DB2 UDB(loginTimeout,秒)- 有效
- DB2 zOS(登录超时,秒)- 有效
- HIVE(登录超时,秒)- 有效
- INFORMIX(INFORMIXCONTIME,秒)- 有效
- ORACLE(oracle.net.CONNECT_TIMEOUT,毫秒)- 有效(大约慢 2-3 秒)
- POSTGRES - 未找到属性
- NETEZZA(loginTimeout,秒) - 如果属性位于 URL 中而不是单独的属性中,则有效。
- SQL_SERVER(loginTimeout,秒)- 有效
- SYBASE - 未找到属性
- TERADATA - 未找到属性
关于java - 如何使用 Eclipse 的数据工具平台设置登录超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56759566/