通过 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 连接不记得用户名和密码