2012-04-25 70 views
0

我必須首次創建一個mysql數據庫,以供多個應用程序並行使用。直到這一點我唯一的經驗與MySQL數據庫一直是單個程序(例如Web服務器)查詢數據庫。 現在我正進入一個場景,我將有幾個CXF java servlet類型的程序,以及後臺服務器編輯和閱讀相同的模式。 我正在使用Connector/J JDBC驅動程序在所有情況下連接到數據庫。在並行調用mysql數據庫時的注意事項

我的問題是:我需要做什麼才能確保並行訪問不會成爲問題。我意識到我需要在適當的時候使用交易,但是我真正迷失的地方在於管理。例如, 。 每當一個servlet完成一項工作時,是否需要關閉連接? 我是否需要訪問數據庫的每個程序的唯一用戶? 我是否必須對連接器/ J對象執行某些操作? 我是否必須以不同的方式聲明我的表格? 我錯過了什麼,或者有什麼我沒有想到的? 我對如何處理事務和SQL本身有一個很好的想法,但是當我設置數據庫時需要做的事情時,我感覺很迷茫。

回答

2

您應該維護一個連接池。在幾百毫秒的量級上創建思考的連接是非常昂貴的。所以對於高容量的應用程序來說,緩存和重用它們是有意義的。

對於你的servlet,它取決於你使用的是什麼容器。像JBoss的東西將提供池作爲容器的一部分。它可以通過數據源定義來定義並通過JNDI進行訪問。像tomcat的其他容器可能依賴於像C3PO這樣的東西。

大多數這些框架返回實現close()方法的JDBC連接的自定義實現,並將邏輯返回到池中。您應該熟悉具體實現的細節,以確保您以支持的方式執行操作。

至於併發性考慮,您應該熟悉樂觀/悲觀鎖定和事務隔離級別的概念。這些都有權衡,只有根據您的應用程序的運行環境才能確定正確的答案。

考慮到用戶,大多數應用程序都有一個用戶表示稱爲讀/寫用戶的應用程序。該用戶應該只有權限讀取和寫入與應用程序關聯的表,索引,序列等的記錄。應用程序的所有實例都將在其連接字符串中指定此用戶。

如果您熟悉上述概念,那麼您將達到95%左右的目標。

還有一件事。正如在管理方面的評論中指出的那樣,您的數據庫引擎是一個巨大的考慮因素。您應該熟悉差異和調整/配置選項。

+1

另一個注意事項:使用'InnoDB'存儲引擎,而不是'MyISAM'。 'InnoDB'在處理併發性(行鎖定而不是表鎖定)方面要好得多。 – 2012-04-25 22:12:13

+0

關於連接池的主題,我有幾個後續問題。 1.是否意味着在所有servlet之間共享,還是公平地給每個自己的連接池?原因是大多數已建立的單元測試運行在tomcat之外,我沒有看到它們使用tomcat特定的對象。 2。從我在這裏讀到的內容來看,我是否正確地假設主要關心的是避免並行訪問單個連接對象?有多個連接對象綁定到相同的數據庫用戶是好的,因爲有持久連接? – 2012-04-26 19:08:12

+0

1)連接本身通常不共享。該池是共享的並且是線程安全的。池的主要關注點是創建數據庫連接需要多長時間。一個更簡單的解決方案是在每個請求上創建一個連接,但99%的響應時間將會協商該連接。它提前談判一堆連接並重用它們更有效率。 2)我相信連接在技術上是線程安全的,但不建議在多線程中共享它們,因爲事務的commit()由連接管理。 – nsfyn55 2012-04-27 01:31:43