首页 > 解决方案 > 抛出错误后关闭连接

问题描述

我有一个使用 docker 通过服务器运行的 python 龙卷风模块。

我有一个使用 web 套接字与我的 java 脚本项目通信的 python 文件。然后,此 python 文件与与我的 SQL 服务器通信的第二个 python 文件进行通信。

问题是,如果由于查询错误而从 SQL 服务器返回错误,则与连接池的连接挂起,并且很快连接池就变满了,从而破坏了 JS 项目的功能

我查看了一些指南和 SO 问题,但找不到解决此问题的指南

我的 server.py 文件中的常用函数如下:

    def log_training(self, message_data):
        message_type = "training_failed"

        try:
            database_manager.log("training", message_data)
            message_type = "training_successful"
        except: 
            tb = traceback.format_exc()
            print("Traceback | Training Log\t| ", "\t\t", "| Error: ", tb)

        self.send_message(message_type, "")

并且 database_manager.log() 函数是:

    def log(self, table_name, my_dict):
        connector = self.cnxpool.get_connection() 
        cursor = connector.cursor(buffered=True, dictionary=True) 

        columns = ', '.join(my_dict.keys())
        values = ", ".join(["%s"] * len(my_dict))

        query = """INSERT INTO {table} ({columns}) VALUES ({values});""".format(table=table_name, columns=columns, values=values)
        print("SQL\t\t| Query: " , query)
        print("SQL\t\t| Columns: ", columns)
        print("SQL\t\t| Values: ", my_dict.values())

        cursor.execute(query, list(my_dict.values()))

        connector.commit()
        cursor.close()
        connector.close()

因此,如果 database_manager.log() 返回异常,则永远不会调用 connector.close()

标签: pythonmysql

解决方案


为什么不添加另一个尝试:到您的 database_manager.log()

try:
     cursor.execute(query, list(my_dict.values()))
except Exception,e:
    print "Error"

else:
    connector.commit()
finally:
    cursor.close()
    connector.close()

更好地处理错误,但这是您可以做什么的概述。


推荐阅读