• mysql 断开连接解决方法 (2013, 'Lost connection to MySQL server during query') (mysql have gone away)


    1,出现该问题的原因,代码里导入了mysql的一个连接,但是长时间没有操作,超过了mysql的awiat_timeout 时间(默认8小时)

    2,解决思路:

      1,修改mysql 的await_timeout (不建议)

      2,django 中使用 close_old_connections()  关闭旧的连接  (from django.db import close_old_connections)  

        (该方法一般在django 的脚本中使用)

    from django.db import close_old_connections
    
    def index():
        close_old_connections()
        s = Student.objects.all()

      3,django 的视图函数中使用可以定义中间件 (请求开始时连接,请求结束后断开) (使用的可能性不大)

    # middleware.py
    from my_blog.db import database  
    # Import the peewee database instance.
    
    
    def PeeweeConnectionMiddleware(get_response):
        def middleware(request):
            database.connect()
            try:
                response = get_response(request)
            finally:
                if not database.is_closed():
                    database.close()
            return response
        return middleware
    View Code

      4,flask 中解决思路:和django中一样,在请求来时连接,在请求结束后断开

    # app.py
    from bottle import hook  #, route, etc, etc.
    from peewee import *
    
    db = SqliteDatabase('my-bottle-app.db')
    
    @hook('before_request')
    def _connect_db():
        db.connect()
    
    @hook('after_request')
    def _close_db():
        if not db.is_closed():
            db.close()
    
    # Rest of your bottle app goes here.
    View Code

       5,如果是使用peewee ,在模型类连接时修改继承类,后面正常使用就ok  (可能性比较大)

    from peewee import *
    from peewee import __exception_wrapper__
    
    class RetryOperationalError(object):
        def execute_sql(self, sql, params=None, commit=True):
            try:
                cursor = super(RetryOperationalError, self).execute_sql(sql, params, commit)
            except OperationalError:
                if not self.is_closed():
                    self.close()
                with __exception_wrapper__:
                    cursor = self.cursor()
                    cursor.execute(sql, params or ())
                    if commit and not self.in_transaction():
                        self.commit()
            return cursor
    
    
    class RetryMySQLDatabase(RetryOperationalError, MySQLDatabase):
        pass
    
    
    database = RetryMySQLDatabase('sql_test', **{'charset': 'utf8', 'sql_mode': 'PIPES_AS_CONCAT', 'use_unicode': True, 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'mysql'})
    
    class UnknownField(object):
        def __init__(self, *_, **__): pass
    
    class BaseModel(Model):
        class Meta:
            database = database
    
    class Teacher(BaseModel):
        depart = CharField()
        prof = CharField(null=True)
        tbirthday = DateTimeField(null=True)
        tname = CharField()
        tno = CharField(primary_key=True)
        tsex = CharField()
    
        class Meta:
            table_name = 'teacher'
    
    class Course(BaseModel):
        cname = CharField()
        cno = CharField()
        tno = ForeignKeyField(column_name='tno', field='tno', model=Teacher)
    
        class Meta:
            table_name = 'course'
    
    class DjangoMigrations(BaseModel):
        app = CharField()
        applied = DateTimeField()
        name = CharField()
    
        class Meta:
            table_name = 'django_migrations'
    
    class Emp(BaseModel):
        deptno = CharField(null=True)
        duty = CharField(null=True)
        empid = AutoField()
        name = CharField(null=True)
        sal = CharField(null=True)
    
        class Meta:
            table_name = 'emp'
    View Code

      6,tornado 解决方法如下

    from tornado.web import RequestHandler
    
    db = SqliteDatabase('my_db.db')
    
    class PeeweeRequestHandler(RequestHandler):
        def prepare(self):
            db.connect()
            return super(PeeweeRequestHandler, self).prepare()
    
        def on_finish(self):
            if not db.is_closed():
                db.close()
            return super(PeeweeRequestHandler, self).on_finish()
  • 相关阅读:
    centos7最小化安装无法tab补全
    rhcsa备战笔记
    idea springboot应用启动
    idea 导入Mapper错误报错设置
    idea 忽略显示文件
    maven 插件jetty/tomcat启动 web 应用
    maven jstl、jsp、servlet依赖
    maven 项目目录图与web 应用结构图对比
    maven 远程仓库、私服及镜像配置
    maven windows环境nexus3.0私服搭建
  • 原文地址:https://www.cnblogs.com/wjun0/p/14031046.html
Copyright © 2020-2023  润新知