Java 使用Unix套接字的JDBC MySQL连接

Java 使用Unix套接字的JDBC MySQL连接,java,mysql,sockets,unix,jdbc,Java,Mysql,Sockets,Unix,Jdbc,我在Linux上使用MySQL,使用--skip networking选项 尝试使用JDBC将基于J2EE的应用程序(使用servlet)连接到MySQL数据库 当使用MySQL并禁用--skip networking选项时,我连接到数据库的方式是: Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase

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

尝试使用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连接到数据库?我试着寻找它,但找不到任何有效的满意答案。提前感谢。

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

另见:

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


如果您想将UNIX套接字与Mysql JDBC连接器/J一起使用,那么上面文章中的死链接现在是

,您需要提供一个

jdbc:mysql://?user=test&password=test&socketFactory=&=/tmp/mysql.sock

因此,这将因您使用的实现而异。默认情况下,Mysql不附带任何实现,只是在其源代码中提供了这样一个工厂的示例

有一个名为的现有UNIX套接字Java库,它也有这样一个socketFactory类实现。其中概述了一个示例,该示例是其文档的一部分


您可以在相关问答材料中找到更多Java UNIX套接字库备选方案:

正如所指出的,可以(至少在Intellij IDE中)为(我使用的是5.1版)使用套接字连接,而不必提供socketFactory

jdbc:mysql://localhost:3306/database_name?socket=/tmp/mysql.sock


MariaDB项目中的JDBC驱动程序支持Unix域套接字,同时与MySQL连接器/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周期

你在使用Java>=7是的Java 7.u65_2.5.2-1你可以发布完整的stacktrace bcoz吗我在linux上,尝试使用JDBC连接到mysql,效果很好。你可以提供一个关于如何发布stacktrace的链接复制stacktrace并编辑你的问题并将其粘贴为代码谢谢。您知道在Unix上是否可以使用命名管道吗?你引用的帖子中的链接似乎已失效。您还可以推荐其他支持Unix管道的连接器吗。。我试图使用--skip networking选项来保护安全,可能使用--bind address选项来保护本地主机,并使用防火墙来阻止所有传入的连接,这是我在某处读到的另一种选择。@AadityaBagga我在回答中添加了等效的链接。Namedpipes是专门针对Windows的-afaik,因此您不能在Unix中使用它。仅在本地主机上绑定或使用防火墙确实是保护服务器安全的好选择。谢谢,我会查看它。我还找到了一个链接,其中列出了一些连接选项。标记为已解决。这看起来确实很有用,但我无法让它工作,必须使用JUnitSocketinstead@MatteoTassinariIntellij IDE可能提供了一些额外的lib来支持
socket
param方法。在通过Unix套接字连接时是否需要提及主机属性?在类路径上包括JNA库(在我的例子中是JNA-5.6.0.jar)似乎是绝对关键的。我花了将近一天的时间努力使mariadb连接器与一致的“套接字无法连接到主机:localhost,端口:3306”一起工作。连接被拒绝(连接被拒绝)“”。同时,基于控制台的mysql以及Python中的MySQLdb工作正常。仅仅在类路径中包含JNA就可以让一切正常工作。不过,您不必在url上指定“3306”。果不其然,ConnectorJ的文档确实告诉您,如果要使用套接字,请安装JNA。