首页 > 解决方案 > 如何使用 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设置超时?我可以处理具有不同名称和值类型的属性。

标签: javaeclipse-dtp

解决方案


经过一番研究,我发现创建 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 - 未找到任何属性

推荐阅读