2010-09-22 10 views
6

È possibile creare una connessione socket Unix a MySql con Java per evitare l'overhead TCP/IP di JDBC?Connessione socket Unix a MySql con Java per evitare l'overhead TCP/IP di JDBC?

Qualcuno conosce una libreria (o alcune librerie, forse) che lo rende possibile?

+0

È possibile eseguire il porting dell'API MySQL C http://dev.mysql.com/doc/refman/5.0/en/c.html in Java utilizzando Swig http://www.swig.org/. Se hai tempo e se ne vale la pena :) – Joset

+0

Sto pensando che tu stia adottando lo stesso approccio che ho io, se non vuoi che il server mysql sia esposto al web ... usa iptables e così via bloccare la porta, ma le app locali possono ancora accedere sotto il firewall. – ppostma1

+1

Penso che ciò che il poster originale voleva fosse un connettore JDBC MySQL che potesse usare il socket unix locale invece del TCP. Come altri hanno sottolineato, il connettore JDBC standard fa un sacco di cose intelligenti e, a meno che tu non abbia confermato che la connessione di rete è un collo di bottiglia, stai rischiando un'ottimizzazione prematura. Non vedo un modo standard per utilizzare i socket nel connettore JDBC MySQL per farlo. – mdoar

risposta

0

Si può sempre prendere la libreria C e avvolgerla da soli. Penso che supporti gli zoccoli UNIX.

Posso chiedere come è stato determinato il sovraccarico del TCP/IP come un problema? Come hai ristretto il problema (che presumo tu stia avendo) a questo?

Il problema è solo l'overhead della connessione rispetto al sovraccarico del pacchetto? Se stabilire connessioni richiede troppo tempo, una libreria di pool di connessioni (come quella dei comuni Apache) gestirà quella per te.

1

Anche il driver JDBC mySQL è stato lucidato per un lungo periodo e presenta diverse ottimizzazioni, come la memorizzazione nella cache dei metadati. Sarei sorpreso che gli sviluppatori JDBC avrebbero lasciato un sacco di overhead TCP/IP nel driver.

Passare a JNI sull'implementazione basata su C potrebbe costare di più nel salto verso il codice nativo rispetto a quanto si può ottenere da un sovraccarico TCP/IP ridotto.

Se si desidera veramente ridurre il sovraccarico TCP/IP, è possibile utilizzare un database incorporato come sqlite, derby o ipersonico.

+1

'Sarei sorpreso che gli sviluppatori JDBC avrebbero lasciato un sacco di overhead TCP/IP nel driver. Come dovrei capire questo? In che modo gli sviluppatori JDBC hanno influenza su TCP/IP? – hek2mgl

+1

Intendo dire che gli sviluppatori del driver JDBC mySQL avrebbero ottimizzato il codice di rete per evitare un sovraccarico non necessario durante l'utilizzo di TCP. Quando ci si connette a una porta sulla stessa macchina, il kernel salta gran parte dell'overhead associato a TCP/IP.D'altra parte è ancora TCP/IP su una rete di loopback e i dati devono passare attraverso i livelli di rete. Gli sviluppatori JDBC, ovviamente, non possono influenzare il TCP/IP al di fuori di quanto fornito dall'API Java. Sarei sorpreso se questo overhead teorico avrebbe un impatto significativo, soprattutto con un database alle spalle. –

1

JDBC è solo una specifica di interfaccia. Non aggiunge alcun overhead TCP/IP. Se il sovraccarico è causato dal driver JDBC. Esistono anche driver JDBC per memoria o database di file e non utilizzare affatto TCP/IP.

Il driver JDBC MYSQL è un driver di tipo 4 JDBC. Ciò significa che non utilizza alcun codice nativo per accedere al database. Se Java non ha alcun metodo per accedere ai socket unix, il driver non può nemmeno usarli. [1]

Se si desidera utilizzare un socket unix, è possibile utilizzare il driver ODBC di MySQL che sembra supportare i socket unix e quindi utilizzare un bridge JDBC-ODBC per accedervi da Java.

0

Basta usare junixsocket, http://code.google.com/p/junixsocket/

Si tratta di una libreria JNI solare che fornisce l'accesso alle prese AF_UNIX utilizzando l'API Java standard Socket, e viene fornito con una fabbrica di connessione MySQL.