java - 如何使用 Eclipse 的数据工具平台设置登录超时?
问题描述
我正在尝试为使用 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。
虽然我没有将它用于我的解决方案,但可以使用属性来设置登录超时(参见原始帖子)。但是,属性名称和值类型(秒或毫秒)取决于驱动程序。
以下是我测试的各个数据库的结果。
以下是我使用 setLoginTimeout 和低值(2 秒)和保证超时的 URL 的测试结果:
- DB2 UDB - 工作
- DB2 zOS - 工作
- 蜂巢 - 作品
- INFORMIX - 不起作用 - 使用自己的超时(20 秒以上)
- NETEZZA - 不起作用 - 使用自己的超时(20 秒以上)
- ORACLE - 工作(大约 2-3 秒慢)
- POSTGRES - 不起作用 - 使用自己的超时 10+ 秒
- SQL_SERVER - 有效
- SYBASE - 工作
- TERADATA - 作品
以下是使用属性的测试结果(括号中是属性名称和值类型):
- DB2 UDB (loginTimeout, seconds) - 有效
- DB2 zOS (loginTimeout, seconds) - 有效
- HIVE(登录超时,秒) - 有效
- INFORMIX (INFORMIXCONTIME, seconds) - 有效
- ORACLE (oracle.net.CONNECT_TIMEOUT, 毫秒) - 工作 (大约 2-3 秒慢)
- POSTGRES - 未找到任何属性
- NETEZZA (loginTimeout, seconds) - 如果属性在 URL 中而不是单独的属性中,则有效。
- SQL_SERVER (loginTimeout, seconds) - 有效
- SYBASE - 未找到任何属性
- TERADATA - 未找到任何属性
推荐阅读
- c++ - 如何在 C++ 中使用自动换行符实现日志记录宏
- kotlin - Kotlin 语言是如何用 Kotlin 编写的?
- php - PHP 在 0x03 End of Text 后停止在二进制字符串循环中工作
- amazon-web-services - AWS Lambda@Edge 的缓存选项
- javascript - jQuery UI,响应式调整最后一个 div
- openapi - 在属性中限制 openapi 类型的正确方法是什么?
- ios - 如何在 Swift 中使用滑块值更改 kCIInputBrightnessKey,无论滑块获得什么值,我都会得到白色或黑色图片
- machine-learning - 用户行为预测/分析
- php - Laravel:如果 foreach 为空
- python-3.x - 发送 HEX 命令并回读到 rfid reader tcp