2013-01-14 33 views
0

我有從twisted.enterprise.adbapi.ConnectionPool類繼承的ConnPool類。Twisted:ConnectionPool重新連接到不同的數據庫

class ConnPool(ConnectionPool): 
    def __init__(self): 
     ConnectionPool.__init__(self, 'MySQLdb', address, user,pass, MYSQL_DB, charset='utf8', use_unicode=True, cp_min=1, cp_max=MAX_CONNECTION, cp_reconnect=True) 

它適用於一個數據庫連接。但是,我希望它在連接丟失時連接另一個數據庫。

連接丟失的檢測已完成,但在這種情況下,我無法管理ConnPool類來連接另一個數據庫。

我試着在發生特定事件時重新初始化ConnectionPool類,但沒有奏效。

任何想法/解決方案將不勝感激。

回答

1

看看ConnectionPool.connect,在那裏你應該指出你 的關注。 adbapi沒有提供這種情況的邏輯,它是 不難實現的東西很愚蠢,但它是需要更多關注的行爲 。例如ConnectionPool如何反應 所有服務器都關閉了?

這裏只是一個愚蠢的實現:

class ArgumentPool: 

    def __init__(self, connargs, connkw): 
     assert len(connargs) == len(connkw) 
     self.connargs = connargs 
     self.connkw = connkw 

    def next(self): 
     while 1: 
      for args, kwds in zip(self.connargs, self.connkw.values()): 
       yield args, kwds 


class RRConnectionPool(adbapi.ConnectionPool): 

    def __init__(self, dbapiName, ap): 
     adbapi.ConnectionPool.__init__(self, dbapiName) 
     self.ap = ap 

    def connection(self): 
     # ... 
     args, kwds = self.ap.next() 
     conn = self.dbapi.connect(*args, **kwds) 
     # ...