【问题标题】:Ping MySQL Server Using JDBC使用 JDBC Ping MySQL 服务器
【发布时间】:2023-03-27 06:48:02
【问题描述】:

这似乎很简单(不适合我)...

如何使用 JDBC ping mysql 服务器?我已经成功地使用了 JDBC 和 MySQL 的 select 和 insert 查询,但是如何 ping ???

TIA

【问题讨论】:

  • 如果你不知道怎么做,你怎么这么简单?

标签: java mysql jdbc ping


【解决方案1】:

MySQL JDBC 驱动程序 (Connector/J) 提供了 ping 机制。

如果您执行带有 /* ping */ 前缀的 SQL 查询,例如:

"/* ping */ SELECT 1"

这实际上会导致驱动程序向服务器发送一个 ping 并返回一个假的、轻量级的结果集。

(您可以在Connector/J documentation 中找到这个隐藏相当深的内容;在该页面上搜索“ping”。仔细阅读:此机制对所使用的语法非常敏感。与大多数 SQL 不同,“ping”标记的“解析”发生​​在客户端 JDBC 驱动程序本身中。)。

【讨论】:

  • +1。与简单的SELECT 1 相比,知道是什么让这个“轻量级”变得更好。我在该页面上找不到任何记录 ping 有多“轻”的内容
  • 非常感谢...我只是想知道,您是否必须输入用户名和该用户的密码才能 ping?我应该早点说...对不起...我试图在没有用户名和密码的情况下ping...基本上检查mysql是否存在并且设置导致mysql服务器...即:端口3306和主机(我现在只使用 127.0.0.1)...在此先感谢 G6
  • 是的。由于您使用的是数据库的功能,因此您需要一个连接,这需要登录。
  • 是否需要 SELECT 1?文档:docs.oracle.com/cd/E17952_01/connector-j-en/… 提到“请注意,Connector/J 5.1.3 引入了一种工具,通过该工具,可以使用设置为 /* ping */ 的值的validationQuery,而不是使用 SELECT 1 的validationQuery 值。”
  • 与 SELECT 1 相比,使 ping 更高效的是服务器端处理(解析语句、创建和发送结果集数据,甚至 SELECT 1 也会这样做)。最便宜的 SQL 命令不是 SELECT 1。它是“DO 1”——它节省了一些时间,因为它不发送结果集。你需要 statement.executeUpdate("DO 1")
【解决方案2】:

我认为 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 语句。

【讨论】:

  • 这不会检查主机上的数据库存在。
  • @Piotr Findeisen:你说你想 ping 服务器,所以我假设你想确保服务器本身是可访问的。
  • 我不知道提问者想要什么:)
【解决方案3】:

我不知道如何在 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 验证连接是否成功。

【讨论】:

  • 也许 validationQuery="/* ping */ SELECT 1" 会更好?
猜你喜欢
  • 2011-06-01
  • 2016-04-28
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多