通过 DSN 的 Java MySql 连接

Posted

技术标签:

【中文标题】通过 DSN 的 Java MySql 连接【英文标题】:Java MySql Connection Through DSN 【发布时间】:2014-10-06 19:58:11 【问题描述】:

我正在尝试通过我设置的系统 DSN 连接到我的 mysql 数据库之一。使用我的 SSL 证书、用户名、密码、端口正确设置了 DSN,并且数据库填充了 DSN 数据库下拉列表,并且“测试”连接通过。我似乎无法在 Java 中建立连接。我花了 2 天时间查看 Stack 上的一些示例,但它们都引用 Access 数据库并使用 Java 8 中不再可用的 JDBC-ODBC 桥接器。我尝试将 UCanAccess 与 Jackcess 一起使用,但我无处可去。下面的代码是我最近几个小时一直在修改的。我通常使用 php 连接到 MySql 数据库并以 JSON 或直接使用 JDBC 驱动程序接收结果,但对于这个项目来说,这两者都不是一个真正的选择。有任何想法吗。我很感激帮助。

//String username = "<username>";
//String password = "<password>";
//String database = "<database_name>";

try 
    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

    //Connect to cllients MySql Database
    Connection conn = DriverManager.getConnection("jdbc:ucanaccess:" + database);

    //Call VerifyLabel(<MAC>,<MODEL>); Call provided client
    CallableStatement cStmt = conn.prepareCall("CALL verify(?, ?)");

    //MAC
    cStmt.setString(1, "mac address");

    //model            
    cStmt.setString(2, "model");

    cStmt.execute();

    //Getting results from "Status" column
    ResultSet rs1 = cStmt.getResultSet();

    //Iterate results and print.
    while (rs1.next()) 
        System.out.println(rs1.getString("Status"));
    

    //Close connection conn
    rs1.close();

 catch (SQLException ex) 
    Logger.getLogger(CambiumStoredTest.class.getName()).log(Level.SEVERE, null, ex);
 catch (ClassNotFoundException ex) 
    Logger.getLogger(CambiumStoredTest.class.getName()).log(Level.SEVERE, null, ex);

使用 MySql 驱动程序:

    Class.forName("com.mysql.jdbc.Driver"); 

    Connection conn = DriverManager.getConnection("jdbc:mysql:"+ database);

也试过了:

  Class.forName("com.mysql.jdbc.Driver"); 

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+ database);

MySql 驱动错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

【问题讨论】:

UCanAccess 仅适用于 Access。我根本不希望它与 MySQL 一起工作,就像我不希望 MySQL JDBC 驱动程序能够与 SQL Server 数据库通信一样。您能解释一下为什么不能选择使用 MySQL JDBC 驱动程序吗? MySQL 驱动程序未创建任何JDBC-ODBC bridge 连接。您应该首先检查要使用的驱动程序类型。正如@LukeWoodward 指定的那样,DSN 与 ACCESS 和 Sql Server 一起使用。 我最初使用的是 MySql JDBC 驱动程序,但没有获得连接。应用程序的另一部分是用 Visual C 编写的,我们通过在安装 MySql 驱动程序后创建系统 DSN 来设置它。此应用程序成功将数据发布到 MySql 数据库。因此,DSN 也可以与 MySql 一起使用。我最初使用的是 MySql JDBC 驱动程序,但我认为由于 SSL 证书,设置 DSN 会更容易。 即使在 Java 8 之前,ODBC 桥也有问题,而且速度很慢。使用本机 JDBC 驱动程序始终是更好的选择。 @VighaneshGursale:这不是真的。 ODBC 数据源可以很好地指向具有包括 MySQL 在内的 ODBC 驱动程序的任何 DBMS(当然还有许多其他 DBMS 以及 Postgres、Oracle、DB2 - 不仅仅是 SQL Server)。但是在 Java 中使用 ODBC 桥并不是一个好主意。 【参考方案1】:

1) DSN 最常与 ODBC 相关联(通常与 MS-Access 相关联)。因此所有的链接。 DSN 不需要 ODBC。

2)使用 Ucanaccess。对 mySQL 使用 J/Connector。

3) 确保您可以从命令行与 mySQL 进行通信。然后专注于让一个小的“hello world”JDBC 应用程序进行连接。您的第二个和第三个示例看起来不错。请务必检查 mySQL 日志中是否有任何警告/错误。

【讨论】:

【参考方案2】:

好吧,经过一整天的努力让它工作并在上面睡了几个小时,我终于让它工作了。 UCanAccess 和 mysql-connector 不起作用。由于没有其他方法可以连接到此客户端数据库,因此最简单的事情是在 Java 7 而不是 8 中推送此应用程序。这使我可以毫无问题地 Coo=nnect 到我的 DSN。我知道这种方法不是最好的解决方案,但它可以完美有效地工作。此外,我可以使用 Connector/J,而不是使用一些被操纵的 3rd 方库和罐子。感谢大家试图帮助我。以防万一其他人遇到这个问题,我就是这样做的。

    在 Java 7 而非 8 中开发应用程序。

    设置系统 DSN

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

    //如果在DSN中设置,则无需提供用户名或密码 连接连接 = DriverManager.getConnection("jdbc:odbc:"+ 数据库);

【讨论】:

以上是关于通过 DSN 的 Java MySql 连接的主要内容,如果未能解决你的问题,请参考以下文章

delphi连接mysql不用添加DSN(mysql connector odbc 5.1版)

在 ms-access 中与 mysql 服务器的 DSN-less 连接不记得用户名和密码

ODBC创建DSN,连接EA

在 Java 中为 MS Access 创建无 DSN 连接

如何通过c++连接ODBC DSN

如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?