2011-03-26 99 views
13

這似乎相當簡單(不適合我)...使用JDBC Ping MySQL服務器

如何使用JDBC ping一個mysql服務器?我已經成功地使用JDBC和MySQL的select和insert查詢,但是如何ping?

TIA

+0

如果你不知道該怎麼做,那你覺得這很簡單嗎? – Bombe 2011-03-26 23:13:17

回答

30

MySQL JDBC驅動程序(Connector/J)提供了一個ping機制。

如果你做這樣/* ping */前面加上一個SQL查詢:

"/* ping */ SELECT 1" 

這實際上將導致駕駛員發送ping到服務器,並返回假的,重量輕,結果集。

(你可以找到這個埋在Connector/J documentation相當深;搜索「平」該網頁上仔細閱讀:。這種機制是非常敏感所使用的語法與大多數SQL中,「解析」的「ping」標記發生在客戶端JDBC驅動程序本身中。)。

+1

+1。與簡單的「SELECT 1」相比,很容易知道是什麼使得這個「輕量級」。我無法找到該頁面上的任何文件,證明ping的「更輕」 – 2011-03-27 07:42:05

+0

非常感謝...我只是想知道,你不必輸入用戶名和該用戶的密碼才能ping?我應該早些時候陳述此...對不起... 我想ping沒有用戶名和密碼...基本上檢查是否存在mysql,並設置導致mysql服務器...即:端口3306和主機(即時只使用127.0.0.1)...在此先感謝G6 – 2011-04-03 16:31:19

+0

是的。由於您使用的是數據庫的功能,因此您需要一個連接,該連接需要登錄。 – 2011-04-03 16:34:13

1

我不認爲在這個JDBC APi中有任何東西。

但是,你可以簡單地使用InetAddress和isReachable()方法來檢查服務器是否在那裏(這實際上是一個ping在做什麼)。

http://download.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29

編輯
如果你想檢查是否MySQL正在運行,而不是執行ping命令,你可以嘗試打開一個套接字到MySQL默認端口上的服務器的服務器。

事情是這樣的:

 
InetAddress addr = InetAddress.getByName("your.server.com"); 
int port = 3306; 
SocketAddress sockaddr = new InetSocketAddress(addr, port); 
Socket sock = new Socket(); 
sock.connect(sockaddr, 2000); // open the connection with a 2 seconds timeout 

如果connect()不拋出異常的東西在端口3306

如果你想確保它是一個MySQL服務器端口上運行,唯一的方法是建立一個JDBC連接(但你需要一個有效的用戶名/密碼)並運行一個語句,例如Brian提到的PING聲明。

+0

這不會檢查主機上的數據庫存在。 – 2011-03-26 23:23:44

+0

@Piotr Findeisen:你說你想ping服務器,所以我假設你想確保服務器本身是可達的。 – 2011-03-27 07:33:51

+0

我不知道提問者想要什麼:) – 2011-03-27 22:47:05

1

我不知道如何做到這一點的JDBC通過您可以使用連接池,以驗證您的網絡連接,像這樣(這是context.xml爲Tomcat(在META-INF目錄應用程序的發現)):

<Resource name="jdbc/My_DS" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      username="USERNAME" password="PASSWORD" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/MYDB?autoReconnect=true" 
      removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" 
      testOnBorrow="true" validationQuery="SELECT 1" /> 

validationQuery驗證連接是否成功。

+1

也許validationQuery =「/ * ping */SELECT 1」會更好嗎? – Suma 2013-07-12 07:22:41