2008-10-04 7 views
43

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

No se ve como esto está soportado, pero por lo que he leído que debería ser al menos posible escribir un SocketFactory para JDBC basado en sockets UNIX si podemos encontrar una aplicación decente de sockets UNIX para Java.

¿Alguien ha intentado esto? ¿Alguien sabe de tal implementación?

+0

¿Por qué no usar simplemente el controlador JDBC para MySQL? –

+0

Porque usa sockets tcp/ip en lugar de sockets de dominio de Unix? –

+3

La mejor pregunta es "¿Por qué no habilitar TCP/IP y luego usar el controlador JDBC para MySQL?", Pero a veces no hacemos esa llamada :) – GWLlosa

Respuesta

26

Pedido Juds la biblioteca. Es una biblioteca de Java Dominio Unix zócalo ...

https://github.com/mcfunley/juds

+0

Gracias, njsf, esto puede ser justo lo que necesitamos. –

+1

Estoy usando el juicio ahora mismo para escuchar UDS y recibo una excepción llamada exceptionjava.io.IOException: no se puede abrir el socket del dominio Unix. ¿Alguna idea de lo que podría estar mal? – Angel

+1

@Angel, generalmente su causa de problemas de permisos. Intenta iniciar tu aplicación desde la raíz. Si esto ayuda, este es un problema de permiso (necesita iniciar la aplicación del usuario que tiene el permiso requerido) – iMysak

3

Eche un vistazo a la biblioteca JNA. Es una casa de medio camino entre Java puro y JNI código nativo

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

+1

Gracias, Dave. Parece que podríamos usar JNA para escribir nuestra propia implementación de socket, luego escribir un SocketFactory encima, aunque esperaba encontrar algo ya escrito. :) –

+0

¡Excava en la fuente de Jruby, usan JNA para simular una gran cantidad de rubíes puros, incluido el tenedor! También hay ejemplos de una clase Posix que debe envolver la mayoría de las funciones de nivel C que necesita –

0

algunas búsquedas en Internet ha puesto al descubierto la siguiente biblioteca de aspecto útil:

http://www.nfrese.net/software/gnu_net_local/overview.html

Wayback Link

Escritura de una La fábrica de enchufes 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); 
     } 
    } 
} 
+1

Ambas URL conducen a 404 a partir de ahora. –

+0

@GregDubicki lo solucionó un poco. – GWLlosa

+0

Gracias, pero ambos enlaces de retorno apuntan a la misma URL. Pero, por favor, no intente arreglarlo, ¿cuál es el sentido de vincular una lib que está tan muerta que su documento ya no está disponible? ¿Cómo lo descargarías? –

22

Usted podría utilizar junixsocket: https://github.com/kohlschutter/junixsocket

Ya se proporciona código para la conexión a MySQL desde Java (Connector/J) a través de conectores Unix.

Una gran ventaja en comparación con otras implementaciones es que junixsocket utiliza la API Java Socket estándar.

+1

Este es genial porque extiende Java Sockets – jetru

+3

también junixsocket es Apache 2.0 License, donde como juzga es LGPL –

+0

No puedo recomendarlo. No puede detener el método accept() al cerrar el socket. Solo deteniendo el hilo, lo cual es probablemente una mala idea. – Timo

2

El MariaDB JDBC driver ahora es compatible con esto y es compatible con el controlador MySQL JDBC.

usar una URL JDBC como:

jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock

A tener en cuenta que esta biblioteca requieren, incluyendo la biblioteca JNA JNA, ya que utiliza para acceder a los zócalos de dominio Unix nativos. 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.

3

Como el original kohlschutter/junixsocket, mencionado en otra respuesta parece estar muerto, puede ver sus horquillas.

Especialmente fiken/junixsocket parece prometedor. Su autor ha agregado soporte para la conexión a PostgreSQL utilizando unix socket a través de pgjdbc, por ejemplo.

Cuestiones relacionadas