Implementazione socket UNIX per Java?
-
05-07-2019 - |
Domanda
Mi rendo conto che poiché i socket UNIX sono specifici della piattaforma, ci deve essere un codice non Java coinvolto. In particolare, siamo interessati a utilizzare JDBC per connettersi a un'istanza MySQL che ha solo socket di dominio UNIX abilitati.
Non sembra che questo sia supportato, ma da quello che ho letto dovrebbe essere almeno possibile scrivere un SocketFactory per JDBC basato su socket UNIX se possiamo trovare un'implementazione decente di socket UNIX per Java.
Qualcuno ha provato questo? Qualcuno sa di tale implementazione?
Soluzione
Verifica la libreria JUDS. È una libreria Java Unix Domain Socket ...
Altri suggerimenti
Potresti usare junixsocket: https://github.com/kohlschutter/junixsocket
Fornisce già il codice per la connessione a MySQL da Java (Connector / J) tramite socket Unix.
Un grande vantaggio rispetto ad altre implementazioni è che junixsocket utilizza l'API Java Socket standard.
Dato che l'originale kohlschutter / junixsocket , menzionato in un'altra risposta, sembra essere morto, puoi controllare le sue forcelle.
Soprattutto fiken / junixsocket sembra promettente. Il suo autore ha aggiunto il supporto per la connessione a PostgreSQL utilizzando unix socket tramite pgjdbc , per esempio.
Scopri la libreria JNA. È una casa a metà strada tra puro codice nativo Java e JNI
Il driver JDBC MariaDB ora supporta questo ed è compatibile con il driver MySQL JDBC.
Utilizza un URL JDBC come:
jdbc: MariaDB: // localhost: 3306 / revmgt localSocket = / var / run / mysqld / mysqld.sock
Vale la pena notare che questa libreria richiede l'inclusione della libreria JNA in quanto utilizza JNA per accedere ai socket di dominio unix nativi. Funziona abbastanza bene nei miei test. Ho visto miglioramenti della velocità sui processi Java associati alla CPU dall'offload al codice nativo.
Il progetto JNR (che è una base generica per project panama ) ha un unix socket implementazione.
Alcune ricerche su Internet hanno scoperto la seguente libreria dall'aspetto utile:
http://www.nfrese.net/software/gnu_net_local/overview.html
Scrivere una factory socket dovrebbe essere abbastanza semplice. Una volta fatto, puoi passarlo al tuo driver 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);
}
}
}