首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tornado + momoko不处理连接

tornado + momoko不处理连接
EN

Stack Overflow用户
提问于 2015-10-22 21:50:57
回答 2查看 1K关注 0票数 6

我使用tornado (4.2.1) + momoko (2.2.0) + psycopg2 (2.6.1)来处理小型web应用程序,它在PostgreSQL服务器关闭连接之前工作正常。然后,在每次执行db.execute()命令后,我都会收到一条错误消息:

代码语言:javascript
复制
Traceback (most recent call last):
      File "C:\Python27\lib\site-packages\tornado-4.2.1-py2.7-win32.egg\tornado\web.py", line 1415, in _execute
        result = yield result
      File "C:\Python27\lib\site-packages\tornado-4.2.1-py2.7-win32.egg\tornado\gen.py", line 870, in run
        value = future.result()
      File "C:\Python27\lib\site-packages\tornado-4.2.1-py2.7-win32.egg\tornado\concurrent.py", line 215, in result
        raise_exc_info(self._exc_info)
      File "C:\Python27\lib\site-packages\tornado-4.2.1-py2.7-win32.egg\tornado\gen.py", line 876, in run
        yielded = self.gen.throw(*exc_info)
      File "server.py", line 63, in get
        cursor = yield self.db.execute(query)
      File "C:\Python27\lib\site-packages\tornado-4.2.1-py2.7-win32.egg\tornado\gen.py", line 870, in run
        value = future.result()
      File "C:\Python27\lib\site-packages\tornado-4.2.1-py2.7-win32.egg\tornado\concurrent.py", line 215, in result
        raise_exc_info(self._exc_info)
      File "D:\work\program-stat\momoko\connection.py", line 453, in when_available
        future_or_result = method(conn, *args, **kwargs)
      File "D:\work\program-stat\momoko\connection.py", line 743, in execute
        cursor.execute(operation, parameters)
      File "C:\Python27\lib\site-packages\psycopg2\extras.py", line 288, in execute
        return super(NamedTupleCursor, self).execute(query, vars)
    OperationalError: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

下面是一个代码:

代码语言:javascript
复制
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import momoko

from tornadotools.route import Route
from psycopg2.extras import NamedTupleCursor

import environments as env


tornado.options.define("port", default=9999, help="run on the given port", type=int)
tornado.options.define("pgsql_host", default=env.DB_HOST, help="database host")
tornado.options.define("pgsql_database", default=env.DB_DATABASE, help="database name")
tornado.options.define("pgsql_user", default=env.DB_LOGIN, help="database user")
tornado.options.define("pgsql_password", default=env.DB_PASSWORD, help="database password")


class Application(tornado.web.Application):
    def __init__(self):
        handlers = Route.routes()
        settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            debug=True,
        )
        tornado.web.Application.__init__(self, handlers, **settings)

        # Have one global connection to DB across all handlers
        self.db = momoko.Pool(
            dsn='dbname=%s user=%s password=%s '
                'host=%s port=5432' % (
                    tornado.options.options.pgsql_database,
                    tornado.options.options.pgsql_user,
                    tornado.options.options.pgsql_password,
                    tornado.options.options.pgsql_host),
            cursor_factory=NamedTupleCursor,
        )
        self.db.connect()


class BaseHandler(tornado.web.RequestHandler):
    @property
    def db(self):
        return self.application.db

@Route(r"/")
class HomeHandler(BaseHandler):
    def get(self):
        self.write("<ul>")
        self.write("<li><a href='/test'>Test page</a>")
        self.write("</ul>")
        self.finish()

@Route(r"/test")
class MogrifyHandler(BaseHandler):

    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        cursor = yield self.db.execute("SELECT %s as t;", (1,))
        self.render("test.html", result=cursor.fetchall())


def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(tornado.options.options.port)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()

如何处理此异常并自动重新连接到数据库,而无需重启应用程序?

EN

回答 2

Stack Overflow用户

发布于 2016-07-11 22:39:46

龙卷风/Momoko/自动重新加载

问题:

如果连接到数据库Postgres distructed - momoko不能重新创建连接池。要解决此问题,您需要重新启动应用程序。为了自动化这个过程,我编写了一个使用内置tornado更新机制的小脚本。

解决方案:

每隔1秒测试一次数据库连接是否处于活动状态。在开始ioloop之前添加此检查。

导入重载reload.reload_if_db_pool_is_dead(application.db),check_connect = tornado.ioloop.PeriodicCallback(lambda: lambda 1000) check_connect.start()

https://gist.github.com/MaxRV/d7180e63d6b5396d904d446653aa7e88

票数 2
EN

Stack Overflow用户

发布于 2016-07-01 17:30:28

您可以添加参数:

代码语言:javascript
复制
raise_connect_errors=False,

创建连接池时:

代码语言:javascript
复制
self.db = momoko.Pool(
    dsn='dbname=%s user=%s password=%s '
        'host=%s port=5432' % (
            tornado.options.options.pgsql_database,
            tornado.options.options.pgsql_user,
            tornado.options.options.pgsql_password,
            tornado.options.options.pgsql_host),
    cursor_factory=NamedTupleCursor,
    raise_connect_errors=False,
)

但这并不总是有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33282683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档