题
我意识到由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码。具体来说,我们感兴趣的是使用JDBC连接到只启用了UNIX域套接字的MySQL实例。
看起来不支持这个,但是从我读过的内容来看,至少应该可以根据UNIX套接字编写一个用于JDBC的SocketFactory 如果我们可以找到一个不错的实现用于Java的UNIX套接字。
有人试过吗?有谁知道这样的实现?
解决方案
查看JUDS库。它是一个Java Unix Domain Socket库......
其他提示
您可以使用junixsocket: https://github.com/kohlschutter/junixsocket
它已经提供了通过Unix套接字从Java(Connector / J)连接到MySQL的代码。
与其他实现相比,一个很大的优势是junixsocket使用标准的Java Socket API。
原来的 kohlschutter / junixsocket ,在另一个答案中提到似乎已经死了,你可以检查一下出叉子。
特别是 fiken / junixsocket 看起来很有希望。例如,它的作者通过 pgjdbc 添加了对使用unix socket连接到PostgreSQL的支持。
查看JNA库。它是纯Java和JNI本机代码之间的中途之处
MariaDB JDBC驱动程序现在支持此功能,并且兼容MySQL JDBC驱动程序。
使用JDBC url,如:
<代码> JDBC:MariaDB的://本地主机:3306 / revmgt localSocket =的/ var /运行/的mysqld / mysqld.sock 代码>
值得注意的是,这个库需要包含JNA库,因为它使用JNA来访问本机unix域套接字。它在我的测试中运行得很好。我看到了从卸载到本机代码的CPU绑定java进程的速度提升。
JNR项目(这是项目巴拿马)有一个 unix socket 实施。
在互联网上进行的一些搜索发现了以下有用的库:
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);
}
}
}