VIP_fuck 发表于 2016-09-14 14:08

请教超时处理

场景如下
单独起一个线程,然后 detach,每隔一段时间发送一个心跳给数据库。
发送心跳的接口有可能因为数据库忙而不返回,现在想给这个心跳接口加一个超时处理,超过指定时间不返回就按照异常处理。
哪位有好办法,请指教。

lxyscls 发表于 2016-09-14 15:32

回复 1# VIP_fuck

block_with_ack?
socket 设置non block,发送成功后select超时

VIP_fuck 发表于 2016-09-14 15:34

回复 2# lxyscls

不是 socket,是一个 orcle 的查询接口。如果这个查询不返回,我想让它在指定时间内结束操作,主动断掉。

hellioncu 发表于 2016-09-14 16:03

VIP_fuck 发表于 2016-09-14 15:34
回复 2# lxyscls

不是 socket,是一个 orcle 的查询接口。如果这个查询不返回,我想让它在指定时间内结 ...

试试 OCIBreak

VIP_fuck 发表于 2016-09-14 16:08

回复 4# hellioncu

OCIBreak 是神马? 没搜到啊。

hellioncu 发表于 2016-09-14 16:21

VIP_fuck 发表于 2016-09-14 16:08
回复 4# hellioncu

OCIBreak 是神马? 没搜到啊。

你不是用OCI访问Oracle的?

http://docs.oracle.com/cd/E11882_01/appdev.112/e10646/oci17msc007.htm#LNOCI17285

VIP_fuck 发表于 2016-09-14 16:29

回复 6# hellioncu

额。。。用,occi,我的连接是:
https://docs.oracle.com/database/121/LNCPP/types.htm#LNCPP005

yulihua49 发表于 2016-09-15 09:33

VIP_fuck 发表于 2016-09-14 14:08
场景如下
单独起一个线程,然后 detach,每隔一段时间发送一个心跳给数据库。
发送心跳的接口有可能因为 ...

错误的思路。

VIP_fuck 发表于 2016-09-19 13:46

回复 8# yulihua49

那你给出正确的思路?

yulihua49 发表于 2016-09-26 16:48

本帖最后由 yulihua49 于 2016-09-26 17:05 编辑

VIP_fuck 发表于 2016-09-19 13:46
回复 8# yulihua49

那你给出正确的思路?
数据库无需心跳。
我们不用心跳保活机制,因为谁也保不了活。
我们是自愈机制,就是谁有病,你管不了,但是一旦恢复就立即能够正常工作。

具体做法,一个数据库连接池。平时所有链接关闭。
一旦有申请到,就打开该链接。归还时无需关闭,下次再请求直接可用。
当业务期间发生数据库致命故障时,以致命状态将该连接归还连接池,同时业务逻辑自己进行事务夭折处理。
连接池关闭该链接并正常归还队列。

另一个独立线程定期检查连接池,对于打开的连接,超过一定时间(t0)空闲的,关闭之。系统空闲状态是不连接数据库的,也没有CPU和网络开销。

这个方案做过很多大项目了,可靠性杠杠的。
比心跳简单多了,心跳必须防止与正常业务冲突。而且,如果系统不忙期间,心跳造成过大的系统,网络,数据库的开销。

心跳不能保活,只能说在你使用这个连接时,t0时刻内曾经活过。我这个也是保证连接在t0时间内曾经活过。
页: [1] 2
查看完整版本: 请教超时处理