2013-02-13 24 views
0

當我在控制檯中運行應用程序時,通過手動啓動jetty手動連接到Jetty上的Scala應用程序中的DB2,工作正常(1-2秒)「java - jar start.jar「。但是,當我啓動Jetty作爲服務時,連接需要30-60秒才能建立。當應用程序作爲服務運行時,建立到DB2的連接需要時間

這是我花了幾天試圖解決的事情。

首先,我認爲這與使用的iSeries Access ODBC驅動程序有關。我有另一個用Javascript編寫的應用程序,運行在Node.js之上,似乎可以正常工作。我也玩過這個驅動提供的大部分選項,但他們似乎沒有幫助。然後,我認爲問題必須與JDBC,我試圖使用com.ibm.db2.jcc.DB2Jcc,但這似乎並沒有解決這個問題。

我放了一個記錄器來檢查連接發生了什麼,但是這並沒有帶來任何額外的幫助。這兩個連接似乎相似,除非以服務運行,建立連接所用的時間至少要延長十倍。

我認爲這個問題可能是因爲DB2驅動程序試圖對正在使用的Activer目錄進行身份驗證,所以我創建了一個本地用戶「foobar」。我將iSeries設置爲默認使用此用戶標識。這也沒有幫助。我也嘗試用我的用戶名運行服務,但這並沒有幫助。

我目前沒有想法。是否有可能在控制檯上手動啓動Jetty加載不同的設置,而不是將其作爲服務啓動(網絡啓動應用程序)。

任何幫助將不勝感激!

堆棧:

  • DB2外部服務器上。沒有進入配置。
  • 的iSeries訪問ODBC驅動程序,版本9.00.00.00
  • 斯卡拉應用,Scalatra的框架
  • 碼頭8.1.3容器
  • NSSM包裹碼頭的服務。使用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,[email protected]] 

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

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 
+0

直覺是它是DNS問題或JVM差異(不同的JVM或不同的配置) – 2013-02-13 15:59:46

+1

通用指令獲取更多信息:1)啓用驅動程序中的跟蹤。請參閱http://www.ibm.com/developerworks/data/library/techarticle/dm-0506fechner/。 2)當發生問題時,查看DB2的db2diag.log。 3)也生成ODBC跟蹤:http://support.microsoft.com/kb/274551 4)當等待提到的30-60秒時強制JVM的線程轉儲會讓你知道什麼組件可能導致問題...在* nix你會殺死-3 ,不知道Windows .. – user918176 2013-02-13 17:54:45

回答

0

經過幾天的跟蹤和使用Wireshark,我設法通過將本地用戶添加到Windows服務器來解決此問題。在這種情況下,本地用戶的名稱並不重要(不必與DB2連接中使用的用戶名相同)。如果本地用戶屬於管理員組,那麼問題仍然存在,所以我創建了沒有此組的本地用戶。這聽起來像只有域上的用戶或管理員組中的用戶都通過活動目錄進行檢查。

相關問題