通过JDBC"ping"数据库的最佳方法是什么?

Lei*_*igh 12 java jdbc

我正在尝试确定通过JDBC ping数据库的最佳方法."最好"的意思是快速和低开销.例如,我考虑过执行此操作:

"SELECT 1 FROM DUAL"
Run Code Online (Sandbox Code Playgroud)

但我相信DUAL表是特定于Oracle的,我需要更通用的东西.

请注意,Connection有一个isClosed()方法,但javadoc声明这不能用于测试连接的有效性.

eck*_*kes 13

使用JDBC 4,您可以使用Connection Interface中的isValid(int)(JavaDoc).这基本上为您做了试用声明.

一些驱动程序通过向数据库发送正确的伪SQL来实现这一点,而一些驱动程序直接使用低级操作来减少解析开销.

但是要注意超时,一些驱动程序(DB/400和Oracle Thin)会为每次调用生成一个新的时间线程,这对于大多数池验证方案来说并不是真的可以接受.而Oracle似乎也没有使用预准备语句,所以它依赖于隐式缓存.


Bra*_*pit 6

MySQL 有一个很好的机制,记录在这个SO 答案中。从答案来看:

"/* ping */ SELECT 1"
Run Code Online (Sandbox Code Playgroud)

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

话虽如此,@eckes 答案是最好的(使用 JDBC 4's Connection.isValid(int))。


Thi*_*ilo 5

是的,这只是Oracle,但在JDBC中没有通用的方法.

大多数连接池实现都有一个配置参数,您可以在其中指定将用于ping的SQL,从而推动责任制定如何对用户执行此操作.

这似乎是最好的方法,除非有人为此提出一个小帮助工具(当然,它排除了使用可能更快的非基于SQL的方法,如Oracle的内部ping函数)

  • SELECT 1 FROM DUAL也适用于MySQL. (3认同)
  • 看到我的回答,JDBC 4有一个通用的方法(原因并非所有驱动程序都提供JDBC 4). (3认同)