我们有一个应用程序运行由多处理队列连接的多个工作进程。
为了照顾数据库连接和可能的错误,我们构建了一个静态类来负责建立连接和处理错误。
提取物:
class DBConnector:
mysqlhost = "localhost"
mySQLConnections = dict()
@staticmethod
def getWaitingTime():
return DBConnector.time_to_wait_after_failure
@staticmethod
def getRetries():
return DBConnector.retries
@staticmethod
def getMySQLDB(database, user, pwd):
'''return only new connection if no connection for this db, this user (and this thread) exists'''
dbuserkey = database+user
if dbuserkey in DBConnector.mySQLConnections:
print "returning stored connection for "+dbuserkey
pprint(DBConnector.mySQLConnections)
return DBConnector.mySQLConnections[dbuserkey]
else:
print "returning new connection for "+dbuserkey
pprint(DBConnector.mySQLConnections)
mySQLConn = MySQLConnection(DBConnector.mysqlhost, database, user, pwd, DBConnector.retries, DBConnector.time_to_wait_after_failure)
DBConnector.mySQLConnections[dbuserkey] = mySQLConn
return mySQLConn
我们想到现在每个工作进程都使用这种静态方法来获取数据库连接并遇到奇怪的问题。
我们预计,当我们启动 10 个调用静态方法的 Worker 时,将有 10 个不同的数据库连接。但是相反,存在一种不确定的行为,导致不同数量的连接,有时是 3 个不同或 7 个不同的连接。
我称它为持有静态方法的类的“伪”实例。
这种行为正常吗?或者它是一个错误或某事?