我目前正在查询一个巨大的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]: General error: -902 error read data from connection.
我已经尝试改变块大小,和不同的代码,但错误仍然出现。有时它发生在表的开头,有时在解析数十万甚至数百万行之后。问题是,我只需要解析这个事务中的行(所以我不能停止并重新打开脚本)。
测试服务器上的内存(运行在与数据库不同的地方),它几乎没有使用任何内存。
在写这篇文章的时候,我重新检查了Firebird日志,发现了以下条目:
INET/inet_error: read errno = 10054
据我所知,这实际上不是一个火鸟问题,而是一个winsock重置错误,是正确的吗?如果是这样,我该如何防止在块查询期间发生这种情况?我如何检查这是windows还是防火墙的问题?
更新我在PHP服务器上查找firebird2.5.log,发现如下错误:
INET/inet_error: send errno = 104
REMOTE INTERFACE/gds__detach: unsuccessful detach from database.
我找到了问题的根源。问题是服务器正在重置连接。为了避免这种情况,我添加了一个"心跳"查询,每隔几分钟运行一次。使用此策略,我可以防止连接被重置。