UNIX socket implementation for Java?
-
05-07-2019 - |
Question
I realize that since UNIX sockets are platform-specific, there has to be some non-Java code involved. Specifically, we're interested in using JDBC to connect to a MySQL instance which only has UNIX domain sockets enabled.
It doesn't look like this is supported, but from what I've read it should be at least possible to write a SocketFactory for JDBC based on UNIX sockets if we can find a decent implementation of UNIX sockets for Java.
Has anyone tried this? Does anyone know of such an implementation?
Solution
Checkout the JUDS library. It is a Java Unix Domain Socket library...
OTHER TIPS
You could use junixsocket: https://github.com/kohlschutter/junixsocket
It already provides code for connecting to MySQL from Java (Connector/J) via Unix sockets.
One big advantage compared to other implementations is that junixsocket uses the standard Java Socket API.
As the original kohlschutter/junixsocket , mentioned in another answer seems to be dead, you can check out its forks.
Especially fiken/junixsocket looks promising. Its author has added support for connection to PostgreSQL using unix socket via pgjdbc, for example.
Check out the JNA library. It's a halfway house between pure Java and JNI native code
The MariaDB JDBC driver now supports this and is compatible with the MySQL JDBC driver.
Use a JDBC url like:
jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock
Worth noting that this library require including the JNA library as it uses JNA to access native unix domain sockets. It works pretty well in my testing. I saw speed improvements on CPU bound java processes from the offload to native code.
The JNR project (which is a loose basis for project panama) has a unix socket implementation.
Some searching on the internet has uncovered the following useful-looking library:
http://www.nfrese.net/software/gnu_net_local/overview.html
Writing a socket factory should be easy enough. Once you've done so, you can pass it to your driver 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);
}
}
}