UNIX socket implementation for Java?
JavaUnixJdbcUnix SocketJava Problem Overview
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?
Java Solutions
Solution 1 - Java
Checkout the JUDS library. It is a Java Unix Domain Socket library...
Solution 2 - Java
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.
Solution 3 - Java
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.
Solution 4 - Java
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.
Solution 5 - Java
As of Java 16, Unix domain sockets are supported natively by java through SocketChannel and ServerSocketChannel API.
You can find more information about it in JEP380 proposal and implementation example here.
Solution 6 - Java
Check out the JNA library. It's a halfway house between pure Java and JNI native code
Solution 7 - Java
The JNR project (which is a loose basis for project panama) has a unix socket implementation.
Solution 8 - Java
no one has yet mentioned: https://github.com/sbt/ipcsocket
has worked for me
Solution 9 - Java
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);
}
}
}