用于Java的UNIX套接字实现?
我意识到,由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码。具体来说,我们感兴趣的是使用JDBC连接到仅启用UNIX域套接字的MySQL实例 这看起来不受支持,但从我所读到的内容来看,如果我们能找到一个适合Java的UNIX sockets实现,那么至少可以基于UNIX sockets为JDBC编写一个SocketFactory用于Java的UNIX套接字实现?,java,unix,jdbc,unix-socket,Java,Unix,Jdbc,Unix Socket,我意识到,由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码。具体来说,我们感兴趣的是使用JDBC连接到仅启用UNIX域套接字的MySQL实例 这看起来不受支持,但从我所读到的内容来看,如果我们能找到一个适合Java的UNIX sockets实现,那么至少可以基于UNIX sockets为JDBC编写一个SocketFactory 有人试过这个吗?有人知道这样的实现吗?查看JNA库。它是纯Java和JNI本机代码之间的中间站 检查JUDS库。它是一个Java Unix域套接字库 互
有人试过这个吗?有人知道这样的实现吗?查看JNA库。它是纯Java和JNI本机代码之间的中间站
检查JUDS库。它是一个Java Unix域套接字库
互联网上的一些搜索发现了以下有用的库: 编写套接字工厂应该很容易。一旦你这样做了,你可以把它交给你的司机
您可以使用JUnitSocket: 它已经提供了通过Unix套接字从Java(Connector/J)连接到MySQL的代码 与其他实现相比,junixsocket的一大优势是使用标准的Java套接字API。的(这是一个松散的基础)有一个实现。现在支持此功能,并且与MySQL JDBC驱动程序兼容 使用JDBC url,如:
jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock
值得注意的是,这个库需要包含JNA库,因为它使用JNA访问本机unix域套接字。它在我的测试中运行得很好。我看到了CPU绑定java进程从卸载到本机代码的速度提高 另一个答案中提到的原版似乎已经过时了,你可以看看它的叉子
尤其是看起来很有希望。它的作者添加了对使用unix套接字通过连接到PostgreSQL的支持,例如。从Java 16开始,unix域套接字通过Java和API本机支持
您可以在提案和实施示例中找到更多信息。谢谢,Dave。看起来我们可以使用JNA来编写我们自己的套接字实现,然后在其上编写SocketFactory,尽管我希望找到一些已经编写好的东西。:)深入了解Jruby源代码,他们使用JNA来模拟许多纯ruby的东西,包括fork!还有一些Posix类的示例,它应该封装您需要的大多数C级函数。为什么不使用MySQL的JDBC驱动程序?因为它使用tcp/ip套接字而不是unix域套接字?更好的问题是“为什么不启用tcp/ip,然后使用MySQL的JDBC驱动程序?”,但有时我们不能这样做:)根据Stevens的说法,Unix域套接字的速度是TCP/IP套接字的两倍,所以junixsocket是Apache2.0许可证,而juds是LGPLI不能推荐的。关闭套接字时无法停止accept()方法。只有通过停止线程,这可能是个坏主意。我现在正在使用juds来侦听UDS,并且我收到捕获的异常java.io.IOException:无法打开Unix域套接字。“知道什么地方出了问题吗?”Angel,通常是许可问题的原因。尝试从根目录启动应用程序。如果有帮助的话-这肯定是权限问题(您需要从具有所需权限的用户处启动应用程序)从现在起,两个URL都指向404。@GregDubicki将其修复了一点。谢谢,但两个回送链接都指向相同的URL。但是请不要试图修复它-链接到一个死得连文档都不可用的lib有什么意义?你将如何下载它?
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);
}
}
}