我目前正在查询一个巨大的Firebird(v2.5)表(包含数百万行),以便执行一些行级操作。为了实现这一点,代码使用Laravel 5.1中的分块,有点像这样:
DB::connection('USER_DB')
->table($table->name)
->chunk(min(5000, floor(65500/count($table->fields))), function($data) {
// running code and saving
});
出于某种原因,我一直收到以下错误:
SQLSTATE [HY000]:常规错误:-902从连接读取数据时出错。
我已经尝试更改块大小和不同的代码,但错误仍然存在。有时它发生在表的开头,有时在解析几十万甚至几百万行之后。问题是我只需解析此事务中的行(因此我无法停止并重新打开脚本)。
对服务器上的内存进行测试(在与数据库不同的地方运行),并且几乎没有使用任何内容。
写这篇文章的时候,我重新检查了Firebird日志并找到了以下条目:
INET / inet_error:读取errno = 10054
据我所知,这实际上并不是Firebird问题,但是一个winsock重置错误,这是正确的吗?如果是这样,我怎么能防止在块查询期间发生这种情况?如何检查Windows或防火墙是否存在问题?
更新我
在PHP服务器上挖掘firebird2.5.log,发现了这个错误:
INET / inet_error:发送errno = 104
REMOTE INTERFACE / gds__detach:与数据库无关联。
答案 0 :(得分:1)
我找到了问题的根源。问题是服务器正在重置连接。为了避免这种情况,我添加了一个"心跳"查询每隔几分钟运行一次。通过这种策略,我能够防止重置连接。