私はこの問題に2日間夢中になりそうです。1つのクライアントプロジェクト(UI)、アプリケーションサーバー、1つのクライアントプロジェクト(別のプログラムを使用していくつかの計算を行う)を持つアプリケーションがあります。クライアントとサーバーは、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();
}
}
次に、次の関数を呼び出して接続を取得します
private static final String 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;
}
編集
計算クライアントは、jmsメッセージをリッスンすることで機能します(MessageListenerを実装します)。サーバーからjmsメッセージを受信するとジョブを実行します(onMessageメソッド)。この時点以降、アクセス接続の取得は機能しません。それがどのように論理であるかはわかりません。それはスレッドに関連していると思います。
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