简体   繁体   English

尝试从Access数据库获取连接时挂起应用程序

[英]Hangs on application while trying to get connection from access database

I am about to be crazy for this problem for 2 days. 我将为这个问题疯狂2天。 I have an application which has one client project(UI), an application server, one client project( makes some computations using another program).Clients and server communicate with each other using jms. 我有一个具有一个客户端项目(UI),一个应用程序服务器,一个客户端项目(使用另一个程序进行一些计算)的应用程序。客户端和服务器使用jms相互通信。 I am trying to connect access database from computation client, Application hangs on while executing following statement of DriverManager class 我正在尝试从计算客户端连接访问数据库,执行以下DriverManager类语句时应用程序挂起

di.driver.connect(url, info);

I am able to connect from server, also UI client with the same code. 我能够使用相同的代码从服务器以及UI客户端进行连接。 My system is not distributed .All Projects are reside in my local environment. 我的系统不是分布式的。所有项目都位于我的本地环境中。 So their operating environment same. 因此它们的操作环境相同。 They use same jdk. 他们使用相同的jdk。 Please tel me what can be the problem 请给我打电话可能是什么问题

I call following function before getting connection.It creates odbc data source. 我在连接之前先调用以下函数,它将创建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();
    }
}

Then I call following function to get connection 然后我调用以下函数来获得连接

private static final String URL_MS_ACCESS = "jdbc:odbc: datasource-db "; 私有静态最终字符串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;
}

EDIT 编辑

Computation Client works by listening jms messages(Implements MessageListener).It does jobs when it receive a jms message from server(onMessage method). Computation Client通过侦听jms消息(Implements MessageListener)来工作。当它从服务器(onMessage方法)接收到jms消息时,它将执行作业。 Getting access connection does not work after this point. 此后无法访问连接。 I do not know how it is logic.I think that is is thread related. 我不知道这是怎么回事,我认为这与线程有关。

I set log writer of DriverManager to debugging. 我将DriverManager的日志编写器设置为调试。 This is the log written. 这是写的日志。 It hangs SQLAllocConnect. 它挂起SQLAllocConnect。 Please show me a way to handle. 请告诉我一种处理方法。

    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

I thing Joop advice to first try to use manually created DSN is good. 我建议先尝试使用手动创建的DSN的Joop建议是好的。 While you use JDBC-ODBC bridge you can monitor ODBC calls via Trace feature than can be enabled from ODBC Manager. 当您使用JDBC-ODBC桥时,与通过ODBC管理器启用的功能相比,您可以通过跟踪功能监视ODBC调用。 This is part of my trace sql.log when I connected from Jython to Access using jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\\\Nwind.mdb : 当我使用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>
...

As you see there is ENTER , EXIT pair of each API call so it would be easy to see which API function hung. 如您所见,每个API调用都有ENTEREXIT对,因此很容易看到哪个API函数挂起。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM