代码之家  ›  专栏  ›  技术社区  ›  Adam Bellaire

Java的UNIX套接字实现?

  •  46
  • Adam Bellaire  · 技术社区  · 16 年前

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

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

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

    7 回复  |  直到 7 年前
        1
  •  28
  •   phihag    12 年前

    检查Juds图书馆。它是一个Java UNIX域套接字库…

    https://github.com/mcfunley/juds

        2
  •  24
  •   Greg Dubicki    7 年前

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

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

    与其他实现相比,一个很大的优点是JuxSocket使用标准的JavaSocket API。

        3
  •  4
  •   Greg Dubicki    7 年前

    作为原件 kohlschutter/junixsocket ,在另一个答案中提到似乎死了,您可以查看它的分叉。

    特别是 fiken/junixsocket 看起来很有前途。作者增加了对使用Unix socket via连接到PostgreSQL的支持。 pgjdbc 例如。

        4
  •  3
  •   GWLlosa    15 年前

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

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

        5
  •  3
  •   Greg Dubicki    7 年前

    这个 MariaDB JDBC driver 现在支持这个,并且与mysql jdbc驱动程序兼容。

    使用jdbc URL,如:

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

    值得注意的是,这个库需要包括JNA库,因为它使用JNA访问本机UNIX域套接字。它在我的测试中非常有效。我看到CPU绑定的Java进程从卸载到本地代码的速度提高。

        6
  •  0
  •   Brett Okken    10 年前

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

        7
  •  0
  •   GWLlosa    7 年前

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

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

    Wayback Link

    编写一个套接字工厂应该很容易。一旦你这样做了,你就可以把它交给你的司机 THUSLY .( 回程链路 )

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