簡體   English   中英

使用python檢查數據庫連接是否繁忙

[英]Check if a database connection is busy using python

我想創建一個數據庫類,該類可以按需創建游標。 必須可以並行使用游標(兩個或多個游標可以共存),並且由於每個連接只能有一個游標,因此Database類必須處理多個連接。

出於性能方面的考慮,我們希望盡可能地重用連接,並避免在每次創建游標時都創建新的連接:每當發出請求時,該類都會嘗試在打開的連接中查找第一個非繁忙的連接並使用它。

只要沒有消耗游標,連接仍然很忙。

這是此類的示例:

class Database:
    ...
    def get_cursos(self,query):
        selected_connection = None

        # Find usable connection
        for con in self.connections:
            if con.is_busy() == False: # <--- This is not PEP 249
                selected_connection = con
                break

        # If all connections are busy, create a new one
        if (selected_connection is None):
            selected_connection = self._new_connection()
            self.connections.append(selected_connection)


         # Return cursor on query
         cur = selected_connection.cursor()
         cur.execute(query)
         return cur

但是,在查看PEP 249標准時,我找不到任何方法來檢查連接是否正在實際使用。

諸如MySQL Connector之類的某些實現提供了檢查連接是否仍未讀取內容的方法(請參閱此處 ),但是據我所知,這些都不屬於PEP 249。

有沒有一種方法可以實現任何符合PEP 249的python數據庫API的描述?

也許您可以使用游標的狀態來告訴您是否正在使用游標。 假設您有以下游標:

new_cursor = new_connection.cursor()
cursor.execute(new_query)

並且您想查看該連接是否可供其他游標使用。 可能可以執行以下操作:

if (new_cursor.rowcount == -1):
    another_new_cursor = new_connection.cursor()
    ...

當然,這實際上告訴您的是,自上次關閉游標以來,游標尚未執行任何操作。 它可以指向完成的游標(並因此指向已關閉的連接),也可以指向剛剛創建或附加到連接的游標。 另一種選擇是使用try / catch循環,類似於:

try:
    another_new_cursor = new_connection.cursor()
except ConnectionError?: //not actually sure which error would go here but you get the idea.
    print("this connection is busy.")

當然,您可能不希望被打印的消息所淹沒,但是您可以在該塊中做任何您想做的事情,除了塊,休眠5秒,等待其他變量傳遞,等待用戶輸入等。如果僅限於PEP 249,您將不得不從頭開始做很多事情。 您有理由不能使用外部庫嗎?

編輯:如果您願意搬到PEP 249之外,這可能會起作用,但它可能不適合您的目的。 如果您使用mysql python庫,則可以利用is_connected方法。

new_connection = mysql.connector.connect(host='myhost',
                         database='myDB',
                         user='me',
                         password='myPassword')

...stuff happens...

if (new_connection.is_connected()):
    pass
else:
    another_new_cursor = new_connection.cursor()
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM