每个请求的连接数,与并发查询执行有关的问题

时间:2018-10-29 12:01:09

标签: python sqlalchemy database-connection flask-sqlalchemy

以下是我一般基于SQLAlchemy的数据库访问类的结构。有烧瓶包装器API,使用它们。

在这种结构下,我遇到了很多不同类型的异常。具体来说:

Web服务“ X”使用功能fooBar。如果此服务同时接听多个电话,我将收到以下异常:

  

文件“ C:\ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.py”,第1631行,在提交中       引发exc.InvalidRequestError(“此交易无效”)   InvalidRequestError:此交易无效

我也在以下之间随机获得以下内容:

  

ProgrammingError:(pyodbc.ProgrammingError)('24000','[24000] [Microsoft] [SQL Server Native Client 11.0]无效的光标状态(0)(SQLFetch)')

更不用说发生了数次僵局和回滚。

我感觉到我建立连接的方式可能有问题。似乎所有请求都使用了相同的连接。

如果有人能指出此代码结构的错误之处,并且也欢迎对此提出任何其他一般性评论,我们将不胜感激。

class DBHandler:

 def init(self):        
    try:        
        self.engine = create_engine(SQLALCHEMY_DATABASE_URI, connect_args={'connect_timeout': 10000}, echo=True)

        self.connection = self.engine.connect() 
    except:
        print 'Not connecting to AWS Database'

 def foo(self, skuID):
    try:
        transaction = self.connection.begin()           

        query = "Update Master_SKU SET SKU_Stage = '3' WHERE SKU_ID = ?"            
        results = self.connection.execute(query,skuID)
        transaction.commit()

        return True
    except:
        transaction.rollback()
        return None

 def fooBar(self):
    try:
        transaction = self.connection.begin()           

        query = "SELECT * FROM Master_SKU"          
        results = self.connection.execute(query)
        transaction.commit()

        return True
    except:
        transaction.rollback()
        return None

编辑:

替代方法:

这有意义吗?

def fooBar(self):
    try:
        tempConnection = self.engine.connect()
        transaction = tempConnection.begin()

        query = "SELECT * FROM Master_SKU"

        rows = tempConnection.execute(query).fetchall()                      
        transaction.commit()
        return True
    except:
        transaction.rollback()
        return False

1 个答案:

答案 0 :(得分:1)

您打开连接太早(self.connection = self.engine.connect())。 至此,您已经打开了连接,但没有对其进行任何操作。 可能发生的情况是数据库为您打开了一个连接并创建了一个锁。在关闭它之前,您无法执行其他交易(例如UPDATE)。例如在PostgreSQL中,这种情况经常发生。试试这个习惯用法:

connection = self.engine.connect()
# ... perform work
connection.close()

另外,请参见相关问题:python sqlalchemy + postgresql program freezes