0

当我在控制台中运行应用程序时,通过手动启动码头“java -jar start.jar”,从码头顶部的 Scala 应用程序连接到 DB2 工作正常(1-2 秒)。但是,当我将 Jetty 作为服务启动时,建立连接需要 30-60 秒。

这是我花了几天时间试图解决的问题。

首先,我认为这与使用的 iSeries Access ODBC 驱动程序有关。我有另一个用 Javascript 编写的应用程序,在 Node.js 之上运行,它似乎可以与这种连接一起工作。我也玩过这个驱动程序提供的大多数选项,但它们似乎没有帮助。然后我认为问题出在 JDBC 上,我尝试使用 com.ibm.db2.jcc.DB2Jcc,但这似乎并没有解决问题。

我放置了一个记录器来检查连接发生了什么,但这并没有带来任何额外的帮助。两个连接看起来很相似,除了作为服务运行时,建立连接需要至少十倍的时间。

我认为问题可能是如果 DB2-driver 尝试对正在使用的 Activer 目录进行身份验证,所以我创建了一个本地用户“foobar”。我将 iSeries 设置为默认使用此用户 ID。这也没有帮助。我还尝试使用我的用户名运行该服务,但没有帮助。

我目前没有想法。是否有可能在控制台上手动启动 Jetty 加载不同的设置而不是将其作为服务启动(网络启动应用程序)。

任何帮助将非常感激!

堆:

  • 外部服务器上的 DB2。无权配置。
  • iSeries Access ODBC 驱动程序,版本 9.00.00.00
  • Scala 应用程序,Scalatra 框架
  • 码头 8.1.3 容器
  • NSSM 将 Jetty 包装为服务。使用 java.exe(复制到 app-directory),选项是“-jar start.jar”。
  • 视窗 2003 服务器

使用 DriverManager 简单地设置连接:

private def foobarDbConnection: Connection = {
  Class.forName(Settings.foobarDbDriver)
  DriverManager.getConnection(Settings.foobarDatabase, 
                              Settings.foobarUsername, 
                              Settings.foobarPassword)
}

设置:

def foobarDbDriver = "com.ibm.db2.jcc.DB2Jcc"
def foobarDatabase = "jdbc:odbc:FOOBAR"
def foobarUsername = "foo"
def foobarPassword = "bar"

这是来自连接的日志:

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: DriverManager.getConnection("jdbc:odbc:FOOBAR")

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO:     trying driver[className=com.ibm.db2.jcc.DB2Driver,com.ibm.db2.jcc.DB2Driver@f6e15e]

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO:     trying driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@e8fdc9]

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: *Driver.connect (jdbc:odbc:FOOBAR)

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: JDBC to ODBC Bridge: Checking security

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: No SecurityManager present, assuming trusted application/applet

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: Allocating Environment handle (SQLAllocEnv)

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: hEnv=92738208

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: Allocating Connection handle (SQLAllocConnect)

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: hDbc=92739360

13.2.2013 13:45:54 com.foo.lib.DbConnectionFactory$JDBCLogWriter write
INFO: Connecting (SQLDriverConnect), hDbc=92739360, szConnStrIn=DSN=FOOBAR;UID=foo;PWD=bar
4

1 回答 1

0

经过几天的跟踪和使用 Wireshark,我设法通过将本地用户添加到 Windows 服务器来解决这个问题。在这种情况下,本地用户的名称无关紧要(不必与 DB2 连接中使用的用户名相同)。如果本地用户属于管理员组,那么问题仍然存在,所以我创建了没有这个组的本地用户。听起来只有域上的用户或管理员组上的用户会被活动目录检查。

于 2013-02-25T09:29:41.313 回答