用于Java的UNIX套接字实现?

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

它看起来并不支持,但是从我读过的内容来看, 如果我们能够find适用于Java的UNIX套接字体面实现,至less应该可以为基于UNIX套接字的JDBC编写SocketFactory。

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

检出JUDS库。 它是一个Java Unix域名Socket库…

https://github.com/mcfunley/juds

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

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

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

看看JNA库。 这是纯Java和JNI本机代码之间的中间地带

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

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

特别是Fiken / junixsocket看起来很有前途。 例如,它的作者已经使用通过pgjdbc的 unix套接字来支持连接到PostgreSQL。

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

使用如下的JDBC url:

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

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

JNR项目 (这是巴拿马项目的松散基础)有一个unix套接字实现。

一些在互联网上search已经发现了以下有用的图书馆:

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

Wayback Link

编写套接字工厂应该很简单。 一旦你这样做了,你可以把它传递给你的驱动程序( 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); } } }