检查数据库连接是不是存在
Posted
技术标签:
【中文标题】检查数据库连接是不是存在【英文标题】:Check if database connection alive检查数据库连接是否存在 【发布时间】:2017-01-13 13:43:26 【问题描述】:我正在编写股票报价处理引擎,并使用 pgjdbc-ng-0.6 库从 postgresql 数据库接收异步通知。我想知道我的数据库连接是否还活着,所以我写在线程的run()
方法中
while (this.running)
try
this.running = pgConnection.isValid(Database.CONNECTION_TIMEOUT);
Thread.sleep(10000);
catch (SQLException e)
log.warn(e.getMessage(), e);
gracefullShutdown();
catch (InterruptedException e)
gracefullShutdown();
我阅读了isValid()
声明,它声明如果超时,该函数将返回false
。但是,isValid()
只是无限期挂起,run()
永远不会退出。为了产生连接问题,我禁用了我的应用程序用来连接数据库的 ***。相当粗鲁的方式,但函数必须返回false......驱动程序中的这个错误或其他方法是否存在?
我在PGDataSource
中尝试了setNetworkTimeout()
,但没有任何成功。
【问题讨论】:
你可以尝试执行一些查询,检查它是否正常返回或是否抛出异常。 该方法无法给我可预测的时间量来检测问题。可能,解决方案是使用并发包中的 Executors 并使用所需的超时查询 Future。不过看起来像是在重新发明***。 【参考方案1】:对于企业开发人员来说,解决这个问题的一种可能方法是使用现有的线程池创建一个单独的线程来提交
可通过测试 call()
调用 DB(如果是 Oracle,它可能是 "SELECT 'OK' FROM dual"
),
using 声明 object.execute('...')
,(不是 executeUpdate
,因为它
可能会导致呼叫卡住),并进一步使用例如 - future.get(3, TimeUnit.Seconds)
。
在最终调用中使用这种方法,您需要捕获 InterruptedException
为get()
打电话。如果 Callable 抛出您将数据库可用性设置为 false,如果不是则设置为 true。
在企业应用程序中使用这种方法之前,您必须确保您可以访问特定对象中的应用程序服务器线程池执行程序,并在那里@Autowire 它。
【讨论】:
from dual
在 Postgres 中无效(除非您创建一个名为 dual
的表)以上是关于检查数据库连接是不是存在的主要内容,如果未能解决你的问题,请参考以下文章