2012-10-04 103 views
5

我想知道哪個更安全&使用Connection變量的更好的方法如下。聲明連接變量

首先:連接作爲類的類的成員變量

class MyClass 
{ 
    Connection conn; 

    public MyClass(Connection conn) { 
     this.conn = conn; 
    } 

    public void myMethod(){ 
     //Do some DB operations using conn 
    } 
} 

二:初始化在方法連接

class MyClass 
{  
    public MyClass() {  
    } 

    public void myMethod(){ 
     Connection conn= initializeFunction(); //Initialize Connection 
     //Do some DB operations using conn 
    } 
} 

第三:發送連接作爲參數起作用

class MyClass 
{  
    public MyClass() {  
    } 

    public void myMethod(Connection conn){ 
     //Do some DB operations using conn 
    } 
} 

注:問題不是編程語言特定的,因此我添加了J以外的標籤ava也是如此。

回答

6

說到數據庫連接對象,最好的是:儘可能遲地打開並儘早關閉

在C#中有一個using語句,它與實現IDisposable接口的對象一起工作。 using聲明像try/finally代碼塊一樣工作。 IMO處理連接一般的做法應該是這樣的:

try 
{ 
connection = new Connection(); 
connection.Open(); // open the connection 
//work with the connection, DB CRUD operations 
} 
finally 
{ 
if(connection != null) 
    connection.Close(); // close the connection in finally block 
         // so that even if the exception occurs, connection gets closed. 
} 

對於你的選擇,我認爲第一個是最差的,這與類的對象一起持有引黃對象。

我想你應該更關心打開/關閉連接而不是在多個地方舉行連接的對象。

3

我會選擇第二個選項,稍作修改。我會將呼叫initializeFunction()更改爲Singleton對象,這會產生連接。一旦你不再需要它,你就會關閉它。

1

這取決於您的連接是否將被許多方法使用。我會盡可能快地推薦和關閉它,所以option2對我來說是最好的選擇。只需在需要時使用連接。您可能還對c3po庫感興趣,以便集中連接。

一般情況下,如果我在使用其他地方使用的變量,我將使用option1並使連接最終。由於這是一個數據庫連接,我認爲規則稍微改變了一點。

6

三種方法提供不同的功能:

  1. 你擁有一流的連接對象和連接對象將保持活着,只要你的對象保持活着。
  2. 連接對象對於方法是本地的,並在方法返回時到期。
  3. 方法的調用者擁有連接對象。

的選擇取決於:

  • 你怎麼要處理的連接對象&
  • 你需要牢記的所有權的DB連接需要只開放只要需要而不是所有的時間,而且,
  • 你想連接到數據庫的頻率。
4

使用Connection的正確方法是始終聲明Connectionusing聲明:

using (var connection = InitializeConnection()) 
{ 
} 

它會處理自動關閉連接,甚至例外扔出去。

幸運的是,在場景後面ADO.NET使用連接池來自動管理和優化與數據庫的連接,因此您無需關心在您的應用程序中打開多少個連接。它們只是邏輯連接

不要只是一味地連接長,因爲它會減慢性能,而且不使用連接池

3

的並行訪問我會去選擇1或3,根據不同的需求。

  • 我會選擇選項1,如果有更多的方法,那麼使用連接定義的那個。方法1易於使用依賴注入控制反轉

  • 我會選擇選項3,如果我的課上的方法是使用連接的唯一方法。

方法2是難以測試,因爲沒有辦法,你可以定義爲連接模擬對象。

此外,我建議不傳遞接口MyClass

+0

'我建議不要傳遞一個類型,而是一個接口到MyClass'你能否更詳細地解釋它。 –

3

這取決於您是否希望提供修改連接對象的方法以外的能力。

我個人用選項1或2 Option 1去,如果MyClass的是具有與它相關聯的多個方法,即連接到數據庫時,SharePoint數據庫容器,運行的存儲過程等Option 2,如果連接對象是僅用於持續時間很短,即打開連接並在其他地方處理數據。 Option 3,我不希望將Connection對象傳遞給方法,但這只是個人偏好。

3

首選的解決方案完全取決於編程環境。對於Java或任何其他長時間運行的進程而言,這是錯誤的,因爲PHP和類似的每個請求執行都是錯誤的。

在Java中,您通常會使用一個數據庫連接池,這是因爲它們大多數時間處於空閒狀態,因此限制了併發連接數據庫的數量。平均而言,您不需要代碼中查詢的連接數量。但另一方面,如果只有在執行第一個查詢時才連接到數據庫,那將是浪費時間。 Java程序不斷運行,爲什麼不在statup上打開適當數量的數據庫連接?然後他們在需要時準備好。

在PHP中,當腳本結束時,所有內容都被遺忘並在內存中被刪除。沒有地方可以存儲活動的正在進行的數據庫連接。所以最好的方法是在您確定必須發送查詢的那一刻連接到數據庫。另一方面,我不同意在PHP中「儘早關閉它」,因爲腳本結束時會關閉,這很快就足夠了。過早關閉連接可能意味着您必須重新打開它才能進行其他查詢。

我也反對在PHP中使用數據庫連接的單例的想法(Java可能是一個不同的遊戲)。是的,你通常只有一個數據庫,但如果不是?單身人士阻止你使用兩個數據庫,不要從頭開始。如果您使用相同的連接參數(服務器,用戶名,密碼)併爲您的單身人士操作,mysqli_connect()會使用現有連接,因此無需在PHP中重新執行此操作。