Java用のUNIXソケットの実装?
-
05-07-2019 - |
質問
UNIXソケットはプラットフォーム固有であるため、Java以外のコードが必要になることがわかっています。具体的には、JDBCを使用して、UNIXドメインソケットのみが有効になっているMySQLインスタンスに接続することに関心があります。
これはサポートされているようには見えませんが、私が読んだことから、少なくともUNIXソケットに基づいたJDBCのSocketFactoryを書くことができるはずです if まともな実装を見つけることができますJava用のUNIXソケット。
誰かがこれを試しましたか?誰でもそのような実装を知っていますか?
解決
JUDSライブラリをチェックアウトします。これは、Java Unixドメインソケットライブラリです...
他のヒント
junixsocketを使用できます: https://github.com/kohlschutter/junixsocket
すでに、Unixソケットを介してJava(Connector / J)からMySQLに接続するためのコードを提供しています。
他の実装と比較した大きな利点の1つは、junixsocketが標準のJava Socket APIを使用することです。
別の回答で言及された元の kohlschutter / junixsocket は死んでいるようで、確認できますフォークを外します。
特に fiken / junixsocket は有望に見えます。その作成者は、たとえば pgjdbc を介してUnixソケットを使用したPostgreSQLへの接続のサポートを追加しました。
JNAライブラリをチェックアウトします。純粋なJavaとJNIのネイティブコードの中間に位置します
MariaDB JDBCドライバーがこれをサポートするようになりましたMySQL JDBCドライバーと互換性があります。
次のようなJDBC URLを使用します。
jdbc:mariadb:// localhost:3306 / revmgt?localSocket = / var / run / mysqld / mysqld.sock
このライブラリは、JNAを使用してネイティブUNIXドメインソケットにアクセスするため、JNAライブラリを含める必要があることに注意してください。私のテストではかなりうまくいきます。 CPUにバインドされたJavaプロセスのオフロードからネイティブコードまでの速度が向上しました。
JNRプロジェクト(プロジェクトパナマ)には unixソケットがあります実装。
インターネットでの検索により、次の便利なライブラリが見つかりました。
http://www.nfrese.net/software/gnu_net_local/overview.html
ソケットファクトリの作成は十分に簡単なはずです。そうしたら、それをドライバーに渡すことができます THUSLY 。(ウェイバックリンク)。
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);
}
}
}