![](/img/trans.png)
[英]Application hangs while getting a connection from a “stale connection pool”
[英]Hangs on application while trying to get connection from access database
我將為這個問題瘋狂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: datasource-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;
}
編輯
Computation Client通過偵聽jms消息(Implements MessageListener)來工作。當它從服務器(onMessage方法)接收到jms消息時,它將執行作業。 此后無法訪問連接。 我不知道這是怎么回事,我認為這與線程有關。
我將DriverManager的日志編寫器設置為調試。 這是寫的日志。 它掛起SQLAllocConnect。 請告訴我一種處理方法。
JdbcOdbcDriver class loaded
registerDriver: driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@1e88b35]
DriverManager.initialize: jdbc.drivers = null
JDBC DriverManager initialized
registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@b655a]
DriverManager.getConnection("jdbc:odbc:romania-db")
trying driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@1e88b35]
trying driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@b655a]
*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
我建議先嘗試使用手動創建的DSN的Joop建議是好的。 當您使用JDBC-ODBC橋時,與通過ODBC管理器啟用的功能相比,您可以通過跟蹤功能監視ODBC調用。 當我使用jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\\\Nwind.mdb
從Jython連接到Access時,這是我的跟蹤sql.log
一部分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>
...
如您所見,每個API調用都有ENTER
, EXIT
對,因此很容易看到哪個API函數掛起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.