tornado+peewee过段时间报数据库链接不上 Docker安装的 mariadb:10.4.8 ,过段时间接口抛出异常500数据库链接异常。 <p>具体报错:</p><p>2022-06-20 09:10:20 ERROR web.py log_request:2243 : 500 POST /api/user/login (172.17.0.1) 8.81ms</p><p>2022-06-20 09:10:21 DEBUG peewee.py execute_sql:3117 : ('SELECT 1 FROM `sys_yh` AS `t1` WHERE (`t1`.`yhm` = %s) LIMIT %s', ['smd', 1])</p><p>2022-06-20 09:10:21 ERROR web.py log_exception:1793 : Uncaught exception POST /api/user/login (172.17.0.1)</p><p> HTTPServerRequest(protocol='http', host='luckysheet.jschrj.com', method='POST', uri='/api/user/login', version='HTTP/1.1', remote_ip='172.17.0.1')</p><p> Traceback (most recent call last):</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 3129, in execute_sql</p><p> cursor.execute(sql, params or ())</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/cursors.py", line 170, in execute</p><p> result = self._query(query)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/cursors.py", line 328, in _query</p><p> conn.query(q)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/connections.py", line 515, in query</p><p> self._execute_command(COMMAND.COM_QUERY, sql)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/connections.py", line 745, in _execute_command</p><p> raise err.InterfaceError("(0, '')")</p><p> pymysql.err.InterfaceError: (0, '')</p><p> </p><p> During handling of the above exception, another exception occurred:</p><p> </p><p> Traceback (most recent call last):</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/tornado/web.py", line 1704, in _execute</p><p> result = await result</p><p> File "/usr/src/app/admin/handler.py", line 84, in post</p><p> if query.exists():</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 1898, in inner</p><p> return method(self, database, *args, **kwargs)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 2182, in exists</p><p> return bool(clone.scalar())</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 1898, in inner</p><p> return method(self, database, *args, **kwargs)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 2160, in scalar</p><p> row = self.tuples().peek(database)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 1898, in inner</p><p> return method(self, database, *args, **kwargs)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 2147, in peek</p><p> rows = self.execute(database)[:n]</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 1898, in inner</p><p> return method(self, database, *args, **kwargs)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 1969, in execute</p><p> return self._execute(database)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 2141, in _execute</p><p> cursor = database.execute(self)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 3142, in execute</p><p> return self.execute_sql(sql, params, commit=commit)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee_async.py", line 988, in execute_sql</p><p> return super().execute_sql(*args, **kwargs)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 3136, in execute_sql</p><p> self.commit()</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 2902, in __exit__</p><p> reraise(new_type, new_type(exc_value, *exc_args), traceback)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 185, in reraise</p><p> raise value.with_traceback(tb)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/peewee.py", line 3129, in execute_sql</p><p> cursor.execute(sql, params or ())</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/cursors.py", line 170, in execute</p><p> result = self._query(query)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/cursors.py", line 328, in _query</p><p> conn.query(q)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/connections.py", line 515, in query</p><p> self._execute_command(COMMAND.COM_QUERY, sql)</p><p> File "/opt/pypy/lib/pypy3.8/site-packages/pymysql/connections.py", line 745, in _execute_command</p><p> raise err.InterfaceError("(0, '')")</p><p> peewee.InterfaceError: (0, '')</p><p>解决方案重写 <span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: 宋体; font-size: 9pt; white-space: pre-wrap;">RequestHandler 的</span><span style="font-size: inherit;"> prepare 和 on_finish 方法 打开、关闭数据库:</span></p><pre style="background-color: rgb(255, 255, 255); font-family: 宋体; font-size: 9pt;"><span style="color:#000080;font-weight:bold;">def </span>prepare(<span style="color:#94558d;">self</span>):<br> db.connect()<br> <span style="color:#000080;font-weight:bold;">return </span><span style="color:#000080;">super</span>(BaseHandler, <span style="color:#94558d;">self</span>).prepare()<br><br><span style="color:#000080;font-weight:bold;">def </span>on_finish(<span style="color:#94558d;">self</span>):<br> <span style="color:#000080;font-weight:bold;">if not </span>db.is_closed():<br> db.close()<br> <span style="color:#000080;font-weight:bold;">return </span><span style="color:#000080;">super</span>(BaseHandler, <span style="color:#94558d;">self</span>).on_finish()</pre><p><br></p> Edit Save Comments: 留言