我意识到,由于 UNIX 套接字是特定于平台的,因此必须涉及一些非 Java 代码。具体来说,我们有兴趣使用 JDBC 连接到仅启用了 UNIX 域套接字的 MySQL 实例。
它看起来不支持,但从我读过的内容来看,如果我们能找到一个体面的 Java UNIX 套接字实现,那么至少应该可以为基于 UNIX 套接字的 JDBC 编写一个 SocketFactory。
有没有人试过这个?有谁知道这样的实现?
我意识到,由于 UNIX 套接字是特定于平台的,因此必须涉及一些非 Java 代码。具体来说,我们有兴趣使用 JDBC 连接到仅启用了 UNIX 域套接字的 MySQL 实例。
它看起来不支持,但从我读过的内容来看,如果我们能找到一个体面的 Java UNIX 套接字实现,那么至少应该可以为基于 UNIX 套接字的 JDBC 编写一个 SocketFactory。
有没有人试过这个?有谁知道这样的实现?
查看 JUDS 库。它是一个 Java Unix 域套接字库...
您可以使用 junixsocket:https ://github.com/kohlschutter/junixsocket
它已经提供了通过 Unix 套接字从 Java (Connector/J) 连接到 MySQL 的代码。
与其他实现相比的一大优势是 junixsocket 使用标准的 Java Socket API。
MariaDB JDBC 驱动程序现在支持这一点并且与 MySQL JDBC 驱动程序兼容。
使用 JDBC url,如:
jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock
值得注意的是,该库需要包含 JNA 库,因为它使用 JNA 访问本机 unix 域套接字。它在我的测试中运行良好。我看到了从卸载到本机代码的 CPU 绑定 Java 进程的速度改进。
由于在另一个答案中提到的原始kohlschutter/junixsocket似乎已死,您可以查看它的分叉。
尤其是fiken/junixsocket看起来很有希望。例如,它的作者通过pgjdbc添加了对使用 unix 套接字连接到 PostgreSQL 的支持。
查看 JNA 库。它是纯 Java 和 JNI 本机代码之间的中转站
从 Java 16 开始,Java 通过SocketChannel和ServerSocketChannel API原生支持 Unix 域套接字 。
在 Internet 上进行的一些搜索发现了以下看起来很有用的库:
http://www.nfrese.net/software/gnu_net_local/overview.html
编写套接字工厂应该很容易。完成此操作后,您可以将其传递给您的司机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);
}
}
}