2013-01-17 46 views
0

我將在這個問題上瘋狂2天。我有一個應用程序,它有一個客戶端項目(UI),一個應用程序服務器,一個客戶端項目(使用另一個程序進行一些計算)。客戶端和服務器使用jms相互通信。我試圖訪問數據庫中計算客戶端連接,應用程序掛起在執行DriverManager類在嘗試從訪問數據庫獲取連接時掛起應用程序

di.driver.connect(url, info); 

我能夠從服務器使用相同的代碼連接,也UI客戶端的下面的語句。我的系統不是分佈式的。所有的項目都駐留在我的本地環境中。所以他們的操作環境一樣。他們使用相同的jdk。請告訴我可能是什麼問題

我在獲得連接之前調用以下函數,它創建odbc數據源。

public static void createODBCSource(String dbPath) { 

    // ODBC parameters 
    String[] argsXP = { "ODBCCONF", "CONFIGDSN", 
      "Microsoft Access Driver (*.mdb)", 
      "DSN=datasource-db;Server=localhost;Port=3306;DBQ=" + dbPath }; 
    String[] argsVistaSeven = { "C:\\Windows\\SysWOW64\\odbcconf.exe", 
      "CONFIGDSN", "Microsoft Access Driver (*.mdb)", 
      "DSN=psa-db;Server=localhost;Port=3306;DBQ=" + dbPath }; 

    // creating a process for the ODBC 
    ProcessBuilder pb = null; 
    String version = System.getProperty("os.name"); 

    if (version.equals("Windows XP")) { 
     pb = new ProcessBuilder(argsXP); 
    } else if (version.equals("Windows 7") 
      || version.equals("Windows Vista")) { 
     pb = new ProcessBuilder(argsVistaSeven); 
    } 

    // starting the process 
    pb.directory(new File(".")); 
    try { 
     Process p = pb.start(); 
     p.getInputStream().close(); 
     p.getOutputStream().close(); 
     p.getErrorStream().close(); 
     try { 
      p.waitFor(); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
      return; 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

然後調用下面的函數獲取連接

私有靜態最後絃樂URL_MS_ACCESS = 「JDBC:ODBC:數據源-DB」;

public static Connection connect(String user, String pass, int db) throws SQLException { 
    Connection conn = null; 
    if (db == MYSQL) { 
     try { 
      Class.forName(DRIVER_MYSQL); 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(DatabaseConnector.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     conn = DriverManager.getConnection(URL_MYSQL, user, pass); 
    } else if(db == ACCESS) { 
     try { 
      Class.forName(DRIVER_MS_ACCESS); 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(DatabaseConnector.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     conn = DriverManager.getConnection(URL_MS_ACCESS, "", ""); 
    } 
    return conn; 
} 

編輯

計算客戶端的工作方式是監聽JMS消息(實現的MessageListener)。它不工作,當它接收來自服務器(onMessage方法)JMS消息。在此之後獲得訪問連接不起作用。我不知道它是如何邏輯的。我認爲這是線程相關的。

我將DriverManager的日誌寫入器設置爲調試。這是寫的日誌。它掛起SQLAllocConnect。請給我看一個辦法。

JdbcOdbcDriver class loaded 
registerDriver: driver[className=com.mysql.jdbc.Driver,[email protected]] 
DriverManager.initialize: jdbc.drivers = null 
JDBC DriverManager initialized 
registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,[email protected]] 
DriverManager.getConnection("jdbc:odbc:romania-db") 
    trying driver[className=com.mysql.jdbc.Driver,[email protected]] 
    trying driver[className=sun.jdbc.odbc.JdbcOdbcDriver,[email protected]] 
*Driver.connect (jdbc:odbc:datasource-db) 
JDBC to ODBC Bridge: Checking security 
No SecurityManager present, assuming trusted application/applet 
JDBC to ODBC Bridge 2.0001 
Current Date/Time: Fri Jan 18 17:25:53 EET 2013 
Loading JdbcOdbc library 
Allocating Environment handle (SQLAllocEnv) 
hEnv=404691320 
Allocating Connection handle (SQLAllocConnect) 
hDbc=404691488 
Connecting (SQLDriverConnect), hDbc=404691488, szConnStrIn=DSN=datasource-db 
+0

我會先嚐試手動創建,而不使用'createODBCSource'。作爲備註:使用與MS Access不同的東西將是值得的。像嵌入式數據庫Java Derby一樣。 –

+0

其實,我做了這個。我從控制面板/管理工具創建了一個odbc,但它沒有工作。我正在使用另一個程序的輸出。它以mdb格式輸出文件。所以我必須使用訪問 – user725455

回答

0

我的事喬普建議第一次嘗試使用手動創建的DSN是好的。在使用JDBC-ODBC橋時,您可以通過跟蹤功能監視ODBC調用,而不是通過ODBC管理器啓用ODBC調用。這是我的跟蹤sql.log的一部分,當我從Jython的連接使用jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Nwind.mdb訪問:

*" org.python.u 83c-928 ENTER SQLAllocEnv 
     HENV *    00A6F3F0 

*" org.python.u 83c-928 EXIT SQLAllocEnv with return code 0 (SQL_SUCCESS) 
     HENV *    0x00A6F3F0 (0x044a1c18) 

*" org.python.u 83c-928 ENTER SQLAllocConnect 
     HENV    044A1C18 
     HDBC *    00A6F350 

*" org.python.u 83c-928 EXIT SQLAllocConnect with return code 0 (SQL_SUCCESS) 
     HENV    044A1C18 
     HDBC *    0x00A6F350 (0x044a1cc0) 

*" org.python.u 83c-928 ENTER SQLDriverConnectW 
     HDBC    044A1CC0 
     HWND    00000000 
     WCHAR *    0x74609110 [  -3] "******\ 0" 
     SWORD      -3 
     WCHAR *    0x74609110 
     SWORD      2 
     SWORD *    0x00000000 
     UWORD      0 <SQL_DRIVER_NOPROMPT> 

*" org.python.u 83c-928 EXIT SQLDriverConnectW with return code 0 (SQL_SUCCESS) 
     HDBC    044A1CC0 
     HWND    00000000 
     WCHAR *    0x74609110 [  -3] "******\ 0" 
     SWORD      -3 
     WCHAR *    0x74609110 
     SWORD      2 
     SWORD *    0x00000000 
     UWORD      0 <SQL_DRIVER_NOPROMPT> 
... 

正如你看到有ENTEREXIT對每個API調用,因此它會很容易看到哪些API函數掛起。

相關問題