我们有一个运行由多处理队列连接的多个工作进程的应用程序。
为了处理数据库连接和可能的错误,我们构建了一个静态类,负责建立连接和处理错误。
摘录:
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种不同的连接。
我称之为持有静态方法的类的“伪”实例。
这种行为是正常的吗?或者它是一个错误还是一些?