繁体   English   中英

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

[英]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调用都有ENTEREXIT对,因此很容易看到哪个API函数挂起。

暂无
暂无

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

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