UNIX socket implementation for Java?

JavaUnixJdbcUnix Socket

Java 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...

https://github.com/mcfunley/juds

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

https://github.com/twall/jna/

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

Wayback Link

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);
        }
    }
}
  

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam BellaireView Question on Stackoverflow
Solution 1 - JavanjsfView Answer on Stackoverflow
Solution 2 - JavaChristian KohlschütterView Answer on Stackoverflow
Solution 3 - JavaRobertView Answer on Stackoverflow
Solution 4 - JavaGreg DubickiView Answer on Stackoverflow
Solution 5 - JavaBennyView Answer on Stackoverflow
Solution 6 - JavaDave CheneyView Answer on Stackoverflow
Solution 7 - JavaBrett OkkenView Answer on Stackoverflow
Solution 8 - JavaIan Morris NievesView Answer on Stackoverflow
Solution 9 - JavaGWLlosaView Answer on Stackoverflow