Implementación de socket UNIX para Java?
-
05-07-2019 - |
Pregunta
Me doy cuenta de que dado que los sockets UNIX son específicos de la plataforma, debe haber algún código que no sea Java. Específicamente, estamos interesados ??en usar JDBC para conectarse a una instancia de MySQL que solo tiene habilitados los sockets de dominio UNIX.
No parece que esto sea compatible, pero por lo que he leído, al menos debería ser posible escribir un SocketFactory para JDBC basado en sockets UNIX if podemos encontrar una implementación decente de sockets UNIX para Java.
¿Alguien ha intentado esto? ¿Alguien sabe de tal implementación?
Solución
Verifique la biblioteca JUDS. Es una biblioteca Java Soix Domain Socket ...
Otros consejos
Puede usar junixsocket: https://github.com/kohlschutter/junixsocket
Ya proporciona código para conectarse a MySQL desde Java (Connector / J) a través de sockets Unix.
Una gran ventaja en comparación con otras implementaciones es que junixsocket utiliza la API de Java Socket estándar.
Como el kohlschutter / junixsocket original, mencionado en otra respuesta parece estar muerto, puede verificar sus horquillas.
Especialmente fiken / junixsocket parece prometedor. Su autor ha agregado soporte para la conexión a PostgreSQL utilizando un socket de Unix a través de pgjdbc , por ejemplo.
Echa un vistazo a la biblioteca JNA. Es una casa a medio camino entre Java puro y código nativo JNI
El controlador MariaDB JDBC ahora admite esto y es compatible con el controlador JDBC de MySQL.
Use una URL JDBC como:
jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock
Vale la pena señalar que esta biblioteca requiere incluir la biblioteca JNA, ya que utiliza JNA para acceder a los sockets de dominios Unix nativos. Funciona bastante bien en mis pruebas. Vi mejoras de velocidad en los procesos de Java vinculados a la CPU desde la descarga al código nativo.
El proyecto JNR (que es una base vaga para project panama ) tiene un socket unix implementación.
Algunas búsquedas en Internet han descubierto la siguiente biblioteca de aspecto útil:
http://www.nfrese.net/software/gnu_net_local/overview.html
Escribir una fábrica de conectores debería ser lo suficientemente fácil. Una vez que lo haya hecho, puede pasarlo a su controlador 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);
}
}
}