这让我很困惑。这是 mysql_query 的代码:
def mysql_query(sql)
begin
#puts "Query: \n#{sql}"
@client.query(sql, cache_rows: true)
rescue Exception => ex
begin
ActiveRecord::Base.connection.reconnect!
rescue
puts "数据库连接失败,10 秒后重试"
sleep 10
puts "准备重试..."
@client.query(sql, cache_rows: true)
end
end
end
前约 500 万条帖子导入正常,但现在,很多时候:
posts = mysql_query(query).to_a
返回的不是 MySQL 结果,而是:
[#<PG::Result:0x0000563f3ee6d8d0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=0>]
我被迫采用了以下方法:
while !posts[-1].is_a?(Hash)
puts "Posts: #{posts}"
ActiveRecord::Base.connection.reconnect!
@mysql_client = Mysql2::Client.new(
host: DB_HOST,
username: DB_USER,
password: DB_PW,
database: DB_NAME
)
posts = mysql_query(query).to_a
end
这确实捕获了问题并解决了它,但几乎每次查询都会失败(有时甚至连续 3 次包含 5000 条记录的查询能成功)。我把它写成了循环,但我认为它从未运行超过一次。我一度怀疑是否有其他进程在使用 @client 并向其中插入了 PG 查询,于是我改用 @mysql_client,但这并没有解决问题。
我搜索了一下,但一无所获。
我的临时方案奏效了,所以我想算是“修复”了,但我仍然好奇这究竟是什么原因造成的。