Java的UNIX套接字实现?

时间:2008-10-04 16:18:37

标签: java unix jdbc unix-socket

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

看起来不支持这个,但是从我读过的内容来看,至少可以根据UNIX套接字编写一个用于JDBC的SocketFactory 如果我们可以找到一个不错的实现用于Java的UNIX套接字。

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

8 个答案:

答案 0 :(得分:29)

查看JUDS库。它是一个Java Unix Domain Socket库......

https://github.com/mcfunley/juds

答案 1 :(得分:24)

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

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

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

答案 2 :(得分:4)

原来的kohlschutter/junixsocket,在另一个答案中提到似乎已经死了,你可以查看它的叉子。

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

使用JDBC url,如:

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

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

答案 5 :(得分:0)

JNR projectproject panama的松散基础)实施unix socket

答案 6 :(得分:0)

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

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

答案 7 :(得分:-1)

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

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

Wayback Link

编写套接字工厂应该很容易。完成后,您可以将其传递给您的驱动程序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);
        }
    }
}
相关问题