JDBC使用Unix Socket进行MySQL连接

aad*_*234 8 java mysql unix sockets jdbc

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

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

禁用--skip-networking选项使用MySQL时,我连接到数据库:

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

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

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

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

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

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

谁能告诉我如何从JDBC连接到数据库?我试图寻找它,但没有任何令人满意的答案有效.提前致谢.

hak*_*kre 12

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

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

因此,这将随您使用的实施而变化.默认情况下,Mysql没有附带任何实现,只是在它的源代码中为这样的工厂提供了一个示例.

有一个名为junixsocket的现有UNIX套接字Java库,它也有这样一个socketFactory类实现.通过Unix Domain Sockets连接MySQL数据库概述了一个例子,这是他们文档的一部分.


您可以在相关的问答材料中找到更多Java UNIX套接字库替代品:


Mar*_*eel 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


小智 5

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