2010-09-22 17 views
6

¿Es posible hacer una conexión de socket Unix a MySql con Java para evitar la sobrecarga de TCP/IP de JDBC?Conexión de socket Unix a MySql con Java para evitar la sobrecarga TCP/IP de JDBC?

¿Alguien sabe una biblioteca (o algunas bibliotecas, tal vez) que hace esto posible?

+0

Puede exportar la API C de MySQL http://dev.mysql.com/doc/refman/5.0/en/c.html a Java usando Swig http://www.swig.org/. Si tiene tiempo y vale la pena :) – Joset

+0

Creo que está tomando el mismo enfoque que yo, si no quiere que el servidor mysql esté expuesto a la web ... use iptables y tal bloquear el puerto, pero las aplicaciones locales todavía pueden acceder bajo el firewall. – ppostma1

+1

Creo que lo que el poster original quería era un conector JDBC de MySQL que pudiera usar el socket local de Unix en lugar de TCP. Como otros señalaron, el conector estándar JDBC hace muchas cosas inteligentes y, a menos que haya confirmado que la conexión de red es un cuello de botella, se arriesga a una optimización prematura. No veo una forma estándar de usar sockets en el conector JDBC de MySQL para hacer esto. – mdoar

Respuesta

0

Siempre puede tomar la biblioteca C y envolverla usted mismo. Creo que admite sockets UNIX.

¿Puedo preguntar cómo ha determinado que la sobrecarga de TCP/IP es un problema? ¿Cómo redujo el problema (que supongo que tiene) a eso?

¿El problema es solo la sobrecarga de conexión en comparación con la sobrecarga del paquete? Si el establecimiento de conexiones lleva demasiado tiempo, una biblioteca de agrupación de conexiones (como la de Apache commons) se encargará de eso.

1

También el controlador mySQL JDBC ha sido pulido durante un largo período y tiene varios ajustes de optimización, como el almacenamiento en memoria caché de los metadatos. Me sorprendería que los desarrolladores de JDBC hubieran dejado una gran cantidad de TCP/IP sobrecarga en el controlador.

Pasar por JNI a la implementación basada en C probablemente le cueste más al saltar al código nativo que lo que se puede obtener con una sobrecarga reducida de TCP/IP.

Si realmente desea cortar la sobrecarga de TCP/IP puede considerar el uso de una base de datos incrustada como sqlite, derby o hipersónico.

+1

'Me sorprendería que los desarrolladores de JDBC hubieran dejado una gran cantidad de TCP/IP en el controlador. ¿Cómo debería entender esto? ¿Cómo influyen los desarrolladores de JDBC en TCP/IP? – hek2mgl

+1

Quiero decir que los desarrolladores del controlador mySQL JDBC habrían ajustado el código de red para evitar sobrecargas innecesarias al usar TCP. Cuando se conecta a un puerto en la misma máquina, el kernel salta una gran parte de la sobrecarga asociada con TCP/IP.Por otro lado, sigue siendo TCP/IP en una red de bucle invertido y los datos tienen que atravesar las capas de red. Los desarrolladores de JDBC, por supuesto, no pueden influir en TCP/IP fuera de lo que proporciona la API de Java. Me sorprendería si esta sobrecarga teórica tuviera un impacto significativo, especialmente con una base de datos detrás. –

1

JDBC es solo una especificación de interfaz. No agrega ninguna sobrecarga de TCP/IP. Si hay sobrecarga es causado por el controlador JDBC. También hay controladores JDBC en memoria o bases de datos de archivos y no usan TCP/IP en absoluto.

El controlador MYSQL JDBC es un controlador JDBC de tipo 4. Eso significa que no usa ningún código nativo para acceder a la base de datos. Si Java no tiene un método para acceder a los zócalos de Unix, el controlador no puede usarlos tampoco. [1]

Si realmente desea utilizar un socket unix, quizás sea posible utilizar el controlador ODBC de MySQL que parece ser compatible con los sockets Unix y luego utilizar un puente JDBC-ODBC para acceder desde Java.

0

Sólo tiene que utilizar junixsocket, http://code.google.com/p/junixsocket/

Es una biblioteca impulsado en JNI que proporciona acceso a los zócalos AF_UNIX mediante la API estándar de Java Zócalo, y también viene con una fábrica de conexiones MySQL.

Cuestiones relacionadas