JDBC使用Unix Socket连接MySQL

我在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语句之后,我可以连接到数据库。

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

任何人都可以告诉我如何从JDBC连接到数据库? 我试图寻找它,但没有任何满意的答案,工作。 提前致谢。

你不能这样做: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

如果你想使用Mysql JDBC Connector / J的UNIX套接字,你需要提供一个socketFactory

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

所以这会随着你使用的实现而变化。 默认情况下,Mysql没有为此提供任何实现,只是在源代码中为这样一个工厂提供了一个示例。

有一个名为junixsocket的 UNIX套接字Java库,它也有这样一个socketFactory类的实现。 在通过Unix Domain Sockets连接到MySQL数据库(这是其文档的一部分)中概述了一个示例。


您可以在相关的Q&A材料中找到更多的Java UNIX套接字库选项:

  • 用于Java的UNIX套接字实现?

至于另一个答案指出,有可能(至少在Intellij的IDE)使用套接字连接的Mysql的JDBC连接器/ J (我正在使用版本5.1), 不必提供一个socketFactory,

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

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周期。