2014-09-18 63 views
4

我在Linux上使用MySQL使用--skip-networking選項。使用Unix的JDBC MySQL連接套接字

我正嘗試使用JDBC將基於J2EE的應用程序(使用servlet)連接到MySQL數據庫。

早些時候,我採用的是MySQL與禁用--skip-網絡選項時,我連接到數據庫:

Class.forName("com.mysql.jdbc.Driver"); 
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","myuser","mypassword"); 

有後啓用--skip-網絡選項,我試圖將其連接爲:

Class.forName("com.mysql.jdbc.Driver"); 
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","myuser","mypassword"); 

但是這似乎並沒有工作,我得到顯示java.lang.NullPointerException當我嘗試連接到我的應用程序中的數據庫。

在註釋掉--skip-networking選項並使用舊的JDBC語句之後,我可以連接到數據庫。

我能夠通過命令行mysql客戶端與--skip-networking選項啓用連接到數據庫。

誰能告訴我如何從JDBC連接到數據庫?我試圖尋找它,但沒有任何滿意的答案,工作。提前致謝。

+1

您是否正在使用Java> = 7 – sol4me 2014-09-18 17:05:52

+0

是的java 7.u65_2.5.2-1 – 2014-09-18 17:11:33

+0

你可以發佈完整的stacktrace bcoz我在linux上,並嘗試使用JDBC連接到mysql,它工作正常 – sol4me 2014-09-18 17:25:55

回答

5

你根本無法做到這一點:MySQL JDBC驅動程序只支持TCP/IP,並且 - 在Windows上 - 命名管道來連接數據庫。因此,指定--skip-networking將不允許您使用JDBC MySQL Connector/J。

http://lists.mysql.com/java/8749參見:

Java本身不支持UNIX域套接字,但因爲你使用的是Windows,你可以使用命名管道,[..]

死在上面的帖子裏現在是http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

+0

謝謝。你知道Unix上是否可以使用命名管道嗎?您引用的帖子中的鏈接似乎已死亡。你也可以推薦任何其他連接器,它支持Unix管道。我試圖使用--skip-networking選項來保證安全,也許在本地主機上使用--bind-address選項並使用防火牆阻止所有傳入連接作爲替代,因爲我讀過的地方.. – 2014-09-19 13:15:53

+0

@AadityaBagga我在我的答案中添加了等效鏈接。 Namedpipes是 - afaik - 專門用於Windows,所以你不能在Unix中使用它。只有在本地主機上綁定或使用防火牆才能確保服務器的安全。 – 2014-09-19 13:41:33

+0

謝謝,我會檢查出來。我還發現了一個鏈接https://dev.mysql.com/doc/refman/5.0/en/connecting.html,其中列出了一些連接選項。標記爲已解決。 – 2014-09-19 13:59:41

6

如果你想使用UNIX套接字和Mysql JDBC Connector/J,你需要提供一個socketFactory

jdbc:mysql:///?user=test&password=test&socketFactory=<classname>&<socket>=/tmp/mysql.sock

因此,這將與您使用的實現而改變。默認情況下,Mysql沒有爲此提供任何實現,只是在源代碼中爲這樣的工廠提供了一個示例。

存在一個現有的UNIX套接字Java庫,其名稱爲junixsocket,它也具有這樣一個類實現的socketFactoryConnecting to a MySQL database via Unix Domain Sockets中列出了一個示例,這是其文檔的一部分。


你可以找到相關的Q &的材料更多的Java UNIX套接字庫備選方案:

+0

Thx的信息。 – 2015-08-09 12:53:59

2

由於another answer指出,這是可能的(至少在的IntelliJ IDE)使用套接字連接爲Mysql JDBC Connector/J(我正在使用5.1版本)沒有必須提供socketFactory,

的jdbc:mysql的://本地主機:3306/DATABASE_NAME插座=/tmp目錄/的mysql.sock

+0

這真的很有用,但我無法使用它,並且必須使用junixsocket代替 – 2016-07-22 12:52:17

+0

@MatteoTassinari Intellij IDE可能會提供一些額外的庫以支持'socket'參數方法。 – Devy 2016-07-22 18:18:40

2

從MariaDB的項目JDBC驅動程序支持Unix域套接字同時保持與MySQL連接器兼容/ J JDBC驅動程序。 MariaDB驅動程序的示例jdbc url爲: jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock

值得注意的是,由於MariaDB驅動程序在內部通過JNA使用域套接字,因此需要包括JNA庫。在使用unix域套接字時,我看到了CPU綁定java進程的速度提升。我相信這主要來自於將java進程卸載到原生代碼的工作,從而爲CPU瓶頸java進程騰出CPU週期。