我將在這個問題上瘋狂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
我會先嚐試手動創建,而不使用'createODBCSource'。作爲備註:使用與MS Access不同的東西將是值得的。像嵌入式數據庫Java Derby一樣。 –
其實,我做了這個。我從控制面板/管理工具創建了一個odbc,但它沒有工作。我正在使用另一個程序的輸出。它以mdb格式輸出文件。所以我必須使用訪問 – user725455