JDBC使用Unix Socket进行MySQL连接

时间:2014-09-18 17:01:36

标签: java mysql sockets unix jdbc

我在Linux上使用 - skip-networking 选项使用MySQL。

尝试使用JDBC将基于J2EE的应用程序(使用servlet)连接到MySQL数据库。

当使用MySQL与 - skip-networking 选项禁用时,我正在连接数据库:

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","myuser","mypassword");

启用 - skip-networking 选项后,我尝试将其连接为:

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","myuser","mypassword");

但这似乎不起作用,当我尝试连接到我的应用程序中的数据库时,我得到 java.lang.NullPointerException

在注释掉 - skip-networking 选项并使用旧的JDBC语句后,我可以连接到数据库。

注意 - 我可以通过命令行mysql客户端连接到数据库,并启用 - skip-networking 选项。

有人能告诉我如何连接数据库来自JDBC 吗?我试图寻找它,但没有任何令人满意的答案有效。提前谢谢。

4 个答案:

答案 0 :(得分:11)

如果要将UNIX套接字与Mysql JDBC Connector / J一起使用,则需要提供socketFactory

  

jdbc:mysql:///?user=test&password=test&socketFactory=<classname>&<socket>=/tmp/mysql.sock

所以这会因您使用的实现而有所不同。默认情况下,Mysql没有附带任何实现,只是为它的源代码中的这样一个工厂提供了一个例子。

现有的UNIX套接字Java库名为junixsocket,它还具有这样的 socketFactory 类实现。 Connecting to a MySQL database via Unix Domain Sockets中概述了一个示例,这是其文档的一部分。

您可以在相关的Q&amp; A材料中找到更多Java UNIX套接字库替代品:

答案 1 :(得分:8)

您根本无法做到这一点:MySQL JDBC驱动程序仅支持TCP / IP和 - 在Windows上 - 命名管道以连接到数据库。因此,指定--skip-networking将不允许您使用JDBC MySQL Connector / J.

另见http://lists.mysql.com/java/8749

  

Java本身并不支持unix域套接字,但由于你在windows上,你可以使用命名管道,[..]

上述帖子中的死链接现在是http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

答案 2 :(得分:4)

MariaDB项目的JDBC驱动程序支持Unix域套接字,同时与MySQL Connector / J JDBC驱动程序保持兼容。 MariaDB驱动程序的示例jdbc url是: jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock

值得注意的是,这需要包含JNA库,因为MariaDB驱动程序在内部通过JNA使用域套接字。在使用unix域套接字时,我看到了CPU绑定java进程的速度提升。我相信这主要是因为从java进程到本机代码的工作卸载,为已经CPU瓶颈的Java进程释放了CPU周期。

答案 3 :(得分:2)

正如another answer所指出的,可能(至少在Intellij IDE中)使用Mysql JDBC Connector/J的套接字连接(我使用的是版本5.1)没有必须提供的SocketFactory,

  

JDBC:MySQL的://本地主机:3306 / DATABASE_NAME插座= / TMP /的mysql.sock