当应用程序作为服务运行时,建立与DB2的连接需要时间

时间:2013-02-13 13:44:49

标签: odbc db2 jetty

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

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

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

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

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

我目前没有想法。是否有可能在控制台上手动启动Jetty加载不同的设置,而不是将其作为服务启动(net start app)。

非常感谢任何帮助!

堆栈:

  • 外部服务器上的DB2。无权访问configure。
  • iSeries Access ODBC驱动程序,版本9.00.00.00
  • Scala app,Scalatra framework
  • Jetty 8.1.3容器
  • NSSM将Jetty包装为服务。使用java.exe(复制到app-directory),选项为“-jar start.jar”。
  • Windows 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

1 个答案:

答案 0 :(得分:0)

经过几天的跟踪和使用Wireshark后,我设法通过在Windows服务器中添加本地用户来解决这个问题。在这种情况下,本地用户的名称无关紧要(不必与DB2连接中使用的用户名相同)。如果本地用户属于Administrator-group,则问题仍然存在,因此我创建了没有该组的本地用户。听起来只有域名或admin-group上的用户才能被活动目录检查。