我意識到,由於UNIX套接字是特定於平臺的,因此必須涉及一些非Java代碼。具體而言,我們有興趣使用JDBC連接到僅啓用了UNIX域套接字的MySQL實例。用於Java的UNIX套接字實現?
它看起來並不像這樣的支持,但是從我讀過這應該是至少可以編寫一個基於UNIX插座JDBC的SocketFactory 如果我們可以找到一個體面的實現Unix套接字的Java的。
有沒有人試過嗎?有誰知道這樣的實現?
我意識到,由於UNIX套接字是特定於平臺的,因此必須涉及一些非Java代碼。具體而言,我們有興趣使用JDBC連接到僅啓用了UNIX域套接字的MySQL實例。用於Java的UNIX套接字實現?
它看起來並不像這樣的支持,但是從我讀過這應該是至少可以編寫一個基於UNIX插座JDBC的SocketFactory 如果我們可以找到一個體面的實現Unix套接字的Java的。
有沒有人試過嗎?有誰知道這樣的實現?
結帳的JUDS庫之間的中途之家。它是一種Java Unix域套接字庫...
查看JNA庫。它是純Java和JNI本機代碼
謝謝,戴夫。看起來我們可以使用JNA編寫我們自己的套接字實現,然後在它上面寫一個SocketFactory,儘管我希望能找到已經寫好的東西。 :) – 2008-10-04 16:34:12
在互聯網上的一些網站的搜索已發現以下尋找有用的庫:
http://www.nfrese.net/software/gnu_net_local/overview.html
寫插座工廠應該很容易。完成後,您可以將它傳遞給您的驅動程序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);
}
}
}
你可以使用junixsocket:https://github.com/kohlschutter/junixsocket
它已經提供了通過Unix套接字從Java器(Connector/J)連接到MySQL的代碼。
與其他實現相比,一個很大的優勢是junixsocket使用標準的Java Socket API。
JNR project(這是一個寬鬆的基礎project panama)具有unix socket實施。
MariaDB JDBC driver現在支持此功能,並且與MySQL JDBC驅動程序兼容。
使用JDBC的網址,如:
jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock
值得注意的是,圖書館需要包括因爲它使用JNA訪問本地UNIX域套接字的JNA庫。它在我的測試中工作得很好。我看到從CPU卸載到本地代碼的CPU綁定java進程的速度提升。
由於原來的kohlschutter/junixsocket,在另一個答案中提到似乎已經死了,你可以檢查出它的叉子。
尤其是fiken/junixsocket看起來很有希望。例如,它的作者已經通過pgjdbc增加了對使用unix套接字連接到PostgreSQL的支持。
爲什麼不直接使用MySQL的JDBC驅動程序? – 2009-05-06 18:34:28
因爲它使用tcp/ip套接字而不是unix域套接字? – 2009-05-06 19:14:20
更好的問題是「爲什麼不啓用TCP/IP,然後使用MySQL的JDBC驅動程序?」,但有時我們不會打這個電話:) – GWLlosa 2009-05-13 13:36:26