java unix jdbc unix-domain-sockets

Implementación de socket UNIX para Java



jdbc unix-domain-sockets (7)

Me doy cuenta de que, dado que los zócalos UNIX son específicos de la plataforma, tiene que haber algún código que no sea de Java involucrado. Específicamente, nos interesa utilizar JDBC para conectarnos a una instancia de MySQL que solo tenga habilitados los sockets de dominio de UNIX.

No parece que esto sea compatible, pero por lo que he leído debería ser al menos posible escribir un SocketFactory para JDBC basado en sockets UNIX si podemos encontrar una implementación decente de sockets UNIX para Java.

¿Alguien ha probado esto? ¿Alguien sabe de tal 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

Wayback Link

Escribir una fábrica de sockets debería ser lo suficientemente fácil. Una vez que lo hayas hecho, puedes pasarlo a tu conductor 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); } } }






El controlador MariaDB JDBC ahora es compatible con 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 dominio nativos de Unix. Funciona bastante bien en mis pruebas. Vi mejoras de velocidad en los procesos java vinculados a la CPU desde la descarga hasta el código nativo.


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 Java Socket estándar.