2013-02-20 41 views
6

示例方案:爲什麼Django和python MySQLdb每個數據庫只有一個遊標?

MySQL的運行的單個服務器 - > HOSTNAME

兩個在該服務器上MySQL數據庫 - >用戶,遊戲等。

任務 - >獲取從GAMES.my_games_table 10點最新的遊戲,並獲取用戶從USERS.my_users_table玩那些(假定沒有連接)

在Django中以及Python的MySQLdb的,爲什麼具有一個光標爲每個數據庫更可取?

什麼是擴展光標的缺點是每MySQL服務器單,並且可以切換數據庫(例如,通過查詢「使用用戶;」),然後在相應的數據庫

MySQL連接是便宜的工作,但ISN如果存在線性流動並且沒有複雜的可能需要兩個光標的傳播,那麼單連接比許多更好?

+0

Django支持多個數據庫連接 - https://docs.djangoproject.com/en/dev/topics/db/multi-db/ – 2013-02-20 17:31:40

+0

@JonathanVanasco是的,這正是我的問題,爲什麼應該有兩個連接2位於SAME SERVER上的數據庫。 例如。在settings.py中,我必須定義USERS和GAMES,並且django將創建2個連接而不是一個連接。 – DhruvPathak 2013-02-20 17:34:54

+2

@ dm03514這是一個示例場景。假定邏輯分片,或者只讀其他數據庫的從設備。底線是,單個mysql實例上的多個數據庫。 – DhruvPathak 2013-02-20 17:39:04

回答

9

較短的答案是「MySQL不支持這種類型的遊標」,因此Python-MySQL也沒有,所以首選一個連接命令的原因是因爲這就是MySQL的工作方式。這是一種重言式。

然而,較長的答案是:

  1. A「光標」,你的定義,是訪問一個關係數據庫管理系統中的表和索引的某些類型的對象,能夠保持其狀態。
  2. 根據您的定義,'連接'將接受命令,並分配或重新使用遊標來執行命令的操作,並將其結果返回給連接。
  3. 根據你的定義,'連接'可以/可以管理多個遊標。
  4. 您認爲這將是訪問數據庫的首選/高性能方式,因爲'連接'很昂貴,'遊標'很便宜。

然而:

  1. 在MySQL(和其他RDMS)甲cursor不是用於執行操作所述用戶可訪問的機制。 MySQL(和其他)以「set」方式執行操作,或者說,他們將SQL命令編譯爲內部命令列表,並根據SQL命令的性質和表結構執行大量複雜的位。
  2. A cursor是一種特定的機制,用於存儲過程(僅限於此),爲開發人員提供了一種以過程方式處理數據的方法。
  3. 在MySQL中的'連接'是你認爲的'遊標',有點。 MySQL不會將它的內部作爲一個迭代器或指針公開,它只是移動表格。它將內部結構暴露爲一種「連接」,它接受SQL和其他命令,將這些命令轉換爲內部操作,執行該操作並將結果返回給您。
  4. 這是「設置」和「程序性」執行風格之間的差異(這實際上是關於您允許用戶訪問的控制的粒度,或者至少是RDMS摘要固有的粒度當它通過API公開它們的內部時)。
2

正如你所說的,MySQL連接很便宜,所以對於您的情況,我不確定是否有代碼組織和流程之外的技術優勢。管理兩個遊標可能比通過苦心地跟蹤SQL'USE'語句跟蹤單個遊標當前正在與哪個數據庫進行跟蹤更容易。與其他數據庫的里程可能會有所不同 - 請記住,Django努力做到與數據庫無關。

另外,請考慮兩個不同的數據庫(即使在同一臺服務器上)需要不同的訪問憑證的情況。在這種情況下,需要兩個連接,以便每個連接都可以成功進行身份驗證。

0

每個數據庫一個遊標不一定更可取,它只是默認行爲。

基本原理是不同的數據庫往往不在不同的服務器上,使用不同的引擎和/或需要不同的初始化選項。 (否則,爲什麼你應該首先使用不同的「數據庫」?)

在你的情況下,如果你的兩個數據庫只是表的命名空間(應該在SQL術語中稱爲「模式」),但駐留在相同的MySQL實例,然後通過一切方式使用單個連接。 (如何配置Django這樣做實際上是一個完全不同的問題。)

如果你只有一個線程,並且實際上並不需要兩個數據庫工作者,那麼你也是對的,同一時間。

相關問題