Ruby Sequel在分叉时会删除带有SSL错误的连接,为什么?
我一直在检查,发现我的续集连接因以下错误而死亡:Ruby Sequel在分叉时会删除带有SSL错误的连接,为什么?,ruby,postgresql,nginx,database-connection,sequel,Ruby,Postgresql,Nginx,Database Connection,Sequel,我一直在检查,发现我的续集连接因以下错误而死亡: Sequel::DatabaseDisconnectError:PG::ConnectionBad:PQconsumeInput()SSL错误:解密失败或错误记录mac:SELECT NULL 无论是服务器(thin、puma、webrick)还是环境。经过一些实验,发现罪犯是gem文件中的gem“散弹枪”(hanami不会重新加载代码)。从散弹枪文档: 每次收到请求时,它都会分叉并加载应用程序 子进程,处理请求,然后退出子进程 当与nginx一
Sequel::DatabaseDisconnectError:PG::ConnectionBad:PQconsumeInput()SSL错误:解密失败或错误记录mac:SELECT NULL
无论是服务器(thin、puma、webrick)还是环境。经过一些实验,发现罪犯是gem文件
中的gem“散弹枪”
(hanami不会重新加载代码)。从散弹枪文档:
每次收到请求时,它都会分叉并加载应用程序
子进程,处理请求,然后退出子进程
当与nginx一起用于生产时,forked Sequel出于同样的原因会断开连接。
这可以通过以下代码进行改进,但这意味着必须在每次请求时重新连接:
SequelDB.extension :connection_validator
SequelDB.pool.connection_validation_timeout = -1
所以看来,分叉后Sequel的连接池已损坏
Sequel为什么要这样做?当一个进程分叉时,该进程的每个副本共享用于与postgres对话的文件描述符。这不是特定于sequel的,甚至不是特定于Postgres的,尽管有些库检测到分叉并为您重新连接到db(请参见sequel问题跟踪器-简短版本,sequel不会发生这种情况)