49

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

它看起来不支持,但从我读过的内容来看,如果我们能找到一个体面的 Java UNIX 套接字实现,那么至少应该可以为基于 UNIX 套接字的 JDBC 编写一个 SocketFactory。

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

4

8 回答 8

30

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

https://github.com/mcfunley/juds

于 2008-10-04T16:46:07.860 回答
26

您可以使用 junixsocket:https ://github.com/kohlschutter/junixsocket

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

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

于 2009-09-09T06:07:36.490 回答
4

MariaDB JDBC 驱动程序现在支持这一点并且与 MySQL JDBC 驱动程序兼容。

使用 JDBC url,如:

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

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

于 2016-10-21T15:40:23.887 回答
4

由于在另一个答案中提到的原始kohlschutter/junixsocket似乎已死,您可以查看它的分叉。

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

于 2017-03-18T12:25:54.440 回答
3

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

https://github.com/twall/jna/

于 2008-10-04T16:29:39.623 回答
3

从 Java 16 开始,Java 通过SocketChannelServerSocketChannel API原生支持 Unix 域套接字 。

您可以在此处的JEP380提案和实施示例中找到有关它的更多信息。

于 2021-05-14T10:13:25.887 回答
1

JNR 项目(它是panama 项目的松散基础)有一个unix 套接字实现。

于 2015-01-03T16:50:47.900 回答
-2

在 Internet 上进行的一些搜索发现了以下看起来很有用的库:

http://www.nfrese.net/software/gnu_net_local/overview.html

回程链接

编写套接字工厂应该很容易。完成此操作后,您可以将其传递给您的司机THUSLY .( Wayback Link )。

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);
        }
    }
}
于 2009-05-13T02:52:28.483 回答