【问题标题】:UNIX socket implementation for Java? [closed]Java的UNIX套接字实现?
【发布时间】:2010-09-15 07:07:48
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不直接使用 MySQL 的 JDBC 驱动程序?
  • 因为它使用 tcp/ip 套接字而不是 unix 域套接字?
  • 更好的问题是“为什么不启用 TCP/IP,然后为 MySQL 使用 JDBC 驱动程序?”,但有时我们无法调用 :)
  • 根据 Stevens 的说法,Unix 域套接字的速度是 TCP/IP 套接字的两倍

标签: java unix jdbc unix-socket


【解决方案1】:

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

https://github.com/mcfunley/juds

【讨论】:

  • 我现在正在使用 juds 来收听 UDS,我收到了异常java.io.IOException:无法打开 Unix 域套接字。知道可能出了什么问题吗?
  • @Angel,通常是导致权限问题的原因。尝试从根目录启动您的应用程序。如果有帮助 - 这绝对是权限问题(您需要从具有所需权限的用户那里启动应用程序)
【解决方案2】:

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

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

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

【讨论】:

  • junixsocket 也是 Apache 2.0 License,而 juds 是 LGPL
  • 我不能推荐它。您无法通过关闭套接字来停止 accept() 方法。只能通过停止线程,这可能是一个坏主意..
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    使用 JDBC 网址,例如:

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

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

    【讨论】:

      【解决方案5】:

      查看 JNA 库。它是纯 Java 和 JNI 原生代码之间的中间地带

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

      【讨论】:

      • 谢谢,戴夫。看起来我们可以使用 JNA 编写自己的套接字实现,然后在其上编写一个 SocketFactory,尽管我希望找到已经编写好的东西。 :)
      • 深入了解 Jruby 源代码,他们使用 JNA 模拟了很多纯 ruby​​ 的东西,包括 fork!还有一些 Posix 类的示例,它应该包装您需要的大部分 C 级函数
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        JNR project(这是project panama 的松散基础)有一个unix socket 实现。

        【讨论】:

          【解决方案8】:

          在互联网上的一些搜索发现了以下看起来很有用的库:

          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);
                  }
              }
          }
          

          【讨论】:

          • 截至目前,这两个 URL 都指向 404。
          • @GregDubicki 修复了一点。
          • 谢谢,但两个返回链接都指向同一个 URL。但是请不要尝试修复它 - 链接到一个已经死了以至于它的文档不再可用的库有什么意义?你会怎么下载呢?
          猜你喜欢
          • 2021-07-19
          • 1970-01-01
          • 2019-02-12
          • 2018-02-11
          • 1970-01-01
          • 1970-01-01
          • 2011-10-31
          • 2017-06-10
          • 2015-05-07
          相关资源
          最近更新 更多