引发错误后关闭连接

时间:2019-06-17 21:55:41

标签: python mysql

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

我有一个python文件,可通过Web套接字与我的Java脚本项目通信。然后,此python文件与与我的SQL Server通信的第二个python文件通信。

问题是,如果由于查询错误而从SQL Server返回错误,则连接池的连接将挂起,并且连接池很快就会变满,从而破坏了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()

1 个答案:

答案 0 :(得分:1)

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

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

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

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