用于Java的UNIX套接字实现?

用于Java的UNIX套接字实现?,java,unix,jdbc,unix-socket,Java,Unix,Jdbc,Unix Socket,我意识到,由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码。具体来说,我们感兴趣的是使用JDBC连接到仅启用UNIX域套接字的MySQL实例 这看起来不受支持,但从我所读到的内容来看,如果我们能找到一个适合Java的UNIX sockets实现,那么至少可以基于UNIX sockets为JDBC编写一个SocketFactory 有人试过这个吗?有人知道这样的实现吗?查看JNA库。它是纯Java和JNI本机代码之间的中间站 检查JUDS库。它是一个Java Unix域套接字库 互

我意识到,由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码。具体来说,我们感兴趣的是使用JDBC连接到仅启用UNIX域套接字的MySQL实例

这看起来不受支持,但从我所读到的内容来看,如果我们能找到一个适合Java的UNIX sockets实现,那么至少可以基于UNIX sockets为JDBC编写一个SocketFactory


有人试过这个吗?有人知道这样的实现吗?

查看JNA库。它是纯Java和JNI本机代码之间的中间站


检查JUDS库。它是一个Java Unix域套接字库


互联网上的一些搜索发现了以下有用的库:

编写套接字工厂应该很容易。一旦你这样做了,你可以把它交给你的司机


您可以使用JUnitSocket:

它已经提供了通过Unix套接字从Java(Connector/J)连接到MySQL的代码

与其他实现相比,junixsocket的一大优势是使用标准的Java套接字API。

的(这是一个松散的基础)有一个实现。

现在支持此功能,并且与MySQL JDBC驱动程序兼容

使用JDBC url,如:

jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock

值得注意的是,这个库需要包含JNA库,因为它使用JNA访问本机unix域套接字。它在我的测试中运行得很好。我看到了CPU绑定java进程从卸载到本机代码的速度提高

另一个答案中提到的原版似乎已经过时了,你可以看看它的叉子


尤其是看起来很有希望。它的作者添加了对使用unix套接字通过连接到PostgreSQL的支持,例如。

从Java 16开始,unix域套接字通过Java和API本机支持


您可以在提案和实施示例中找到更多信息。

谢谢,Dave。看起来我们可以使用JNA来编写我们自己的套接字实现,然后在其上编写SocketFactory,尽管我希望找到一些已经编写好的东西。:)深入了解Jruby源代码,他们使用JNA来模拟许多纯ruby的东西,包括fork!还有一些Posix类的示例,它应该封装您需要的大多数C级函数。为什么不使用MySQL的JDBC驱动程序?因为它使用tcp/ip套接字而不是unix域套接字?更好的问题是“为什么不启用tcp/ip,然后使用MySQL的JDBC驱动程序?”,但有时我们不能这样做:)根据Stevens的说法,Unix域套接字的速度是TCP/IP套接字的两倍,所以junixsocket是Apache2.0许可证,而juds是LGPLI不能推荐的。关闭套接字时无法停止accept()方法。只有通过停止线程,这可能是个坏主意。我现在正在使用juds来侦听UDS,并且我收到捕获的异常java.io.IOException:无法打开Unix域套接字。“知道什么地方出了问题吗?”Angel,通常是许可问题的原因。尝试从根目录启动应用程序。如果有帮助的话-这肯定是权限问题(您需要从具有所需权限的用户处启动应用程序)从现在起,两个URL都指向404。@GregDubicki将其修复了一点。谢谢,但两个回送链接都指向相同的URL。但是请不要试图修复它-链接到一个死得连文档都不可用的lib有什么意义?你将如何下载它?
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mysql.management.driverlaunched.ServerLauncherSocketFactory;

public class ConnectorMXJTestExample {
    public static void main(String[] args) throws Exception {
        String hostColonPort = "localhost:3336";

        String driver = com.mysql.jdbc.Driver.class.getName();
        String url = "jdbc:mysql://" + hostColonPort + "/" + "?"
                + "socketFactory="
                + ServerLauncherSocketFactory.class.getName();
        String userName = "root";
        String password = "";

        Class.forName(driver);
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, userName, password);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT VERSION()");
            rs.next();
            String version = rs.getString(1);
            rs.close();
            stmt.close();

            System.out.println("------------------------");
            System.out.println(version);
            System.out.println("------------------------");
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ServerLauncherSocketFactory.shutdown(hostColonPort);
        }
    }
}