不在同一服务器上的数据库连接起来久了会断开,大佬们有遇到过吗?

2017-05-07 23:40:49 +08:00
 liangmishi

服务器 A 是 tornado,去连服务器 B 上的 PostgreSQL 数据库,刚开始没啥问题。
可是时间久了服务器 A 和服务器 B 的数据库连接就断了。 大佬们有遇到过这种情况吗?

附个错误提示:

Traceback (most recent call last):
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3756, in execute_sql
    cursor = self.get_cursor()
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3704, in get_cursor
    return self.get_conn().cursor()
psycopg2.InterfaceError: connection already closed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/xxx/.local/lib/python3.5/site-packages/tornado/web.py", line 1488, in _execute
    result = self.prepare()
  File "/home/xxx/cc_backend/view/__init__.py", line 217, in prepare
    if not self.current_user():
  File "/home/xxx/cc_backend/view/__init__.py", line 192, in current_user
    return User.get_by_key(key)
  File "/home/xxx/cc_backend/model/user.py", line 102, in get_by_key
    return cls.get(cls.key == key)
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 4916, in get
    return sq.get()
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3171, in get
    return next(clone.execute())
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3223, in execute
    self._qr = ResultWrapper(model_class, self._execute(), query_meta)
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 2902, in _execute
    return self.database.execute_sql(sql, params, self.require_commit)
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3765, in execute_sql
    self.commit()
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3588, in __exit__
    reraise(new_type, new_type(*exc_args), traceback)
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 135, in reraise
    raise value.with_traceback(tb)
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3756, in execute_sql
    cursor = self.get_cursor()
  File "/home/xxx/.local/lib/python3.5/site-packages/peewee.py", line 3704, in get_cursor
    return self.get_conn().cursor()
peewee.InterfaceError: connection already closed
5098 次点击
所在节点    Python
8 条回复
firefox12
2017-05-07 23:43:36 +08:00
本来就是这样,所以有 mysql_ping 这样的设计
SlipStupig
2017-05-07 23:50:01 +08:00
太正常了,数据库会把一些闲置的连接主动杀掉(多长时间没有活动),可以通过 Keepalive 来连接,linux 可以通过一下参数来进行配置:
net.ipv4.tcp_keepalive_time=90
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes=2

但是依然会断开,postgresql 可以定时发送 NOTIFY 来保持连接
msg7086
2017-05-08 02:47:06 +08:00
数据库本身也有闲置断线设定,没记错的话 MySQL 是 3 小时,需要改配置延长时间。
woshixiaohao1982
2017-05-08 07:58:26 +08:00
难倒不使用线程池来维护连接对象?
liangmishi
2017-05-08 08:48:54 +08:00
@firefox12 原来如此,谢谢

@SlipStupig 增加连接时常的配置有点治标不治本的意思,我先谷歌看看 NOTIFY,谢谢

@msg7086 想说有没有一种断了再重连的方法,或者使用前尝试重连就可以解决了

@woshixiaohao1982 好主意,我去试试,谢谢
QQ2171775959
2017-05-08 09:06:07 +08:00
这个要看你怎么搭建了,服务器之间有没有组内网,设置的闲置时间有多长,有没有设置定时发送一条指令来激活这个闲置的连接。
lostsquirrelX
2017-05-08 09:21:57 +08:00
liangmishi
2017-05-08 22:14:10 +08:00
@QQ2171775959 感谢,学习了

@lostsquirrelX 感谢,学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/359766

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX