【发布时间】:2023-03-27 06:48:02
【问题描述】:
这似乎很简单(不适合我)...
如何使用 JDBC ping mysql 服务器?我已经成功地使用了 JDBC 和 MySQL 的 select 和 insert 查询,但是如何 ping ???
TIA
【问题讨论】:
-
如果你不知道怎么做,你怎么这么简单?
这似乎很简单(不适合我)...
如何使用 JDBC ping mysql 服务器?我已经成功地使用了 JDBC 和 MySQL 的 select 和 insert 查询,但是如何 ping ???
TIA
【问题讨论】:
MySQL JDBC 驱动程序 (Connector/J) 提供了 ping 机制。
如果您执行带有 /* ping */ 前缀的 SQL 查询,例如:
"/* ping */ SELECT 1"
这实际上会导致驱动程序向服务器发送一个 ping 并返回一个假的、轻量级的结果集。
(您可以在Connector/J documentation 中找到这个隐藏相当深的内容;在该页面上搜索“ping”。仔细阅读:此机制对所使用的语法非常敏感。与大多数 SQL 不同,“ping”标记的“解析”发生在客户端 JDBC 驱动程序本身中。)。
【讨论】:
SELECT 1 相比,知道是什么让这个“轻量级”变得更好。我在该页面上找不到任何记录 ping 有多“轻”的内容
我认为 JDBC APi 中没有任何内容。
但是您可以简单地使用 InetAddress 和 isReachable() 方法来检查服务器是否存在(这实际上是 ping 所做的)。
http://download.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29
编辑:
如果你想检查 MySQL 是否正在运行而不是 ping 服务器,你可以尝试在 MySQL 默认端口上打开一个到服务器的套接字。
类似这样的:
InetAddress 地址 = InetAddress.getByName("your.server.com"); 国际端口 = 3306; SocketAddress sockaddr = new InetSocketAddress(addr, port); 套接字 sock = new Socket(); sock.connect(sockaddr, 2000); // 以 2 秒超时打开连接如果 connect() 没有抛出异常,则端口 3306 上正在运行。
如果你想确保它是那个端口上的 MySQL 服务器,唯一的方法是建立一个 JDBC 连接(但你需要一个有效的用户名/密码)并运行一个语句,例如Brian 提到的 PING 语句。
【讨论】:
我不知道如何在 JDBC 中执行此操作,您可以像这样使用连接池来验证您的连接(这是 Tomcat 的 context.xml(在您的应用程序的 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 验证连接是否成功。
【讨论】: