2016-03-07 67 views
1

我有這個singelton與連接池。我應該同步getConnection()DataSource

public enum ConnectionPool { 
    INSTANCE; 

    private DataSource ds = null; 

    ConnectionPool() { 
     try { 
     final Context initCtx = new InitialContext(); 
     ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/test"); 
     } catch (NamingException e) { 
     e.printStackTrace(); 
     } 
    } 

    public Connection getConnection() throws SQLException { 
     return ds.getConnection(); 
    } 
} 

我應該同步getConnection()以防止從不同線程獲取相同的實例嗎?它看起來像已經由Tomcat同步,但我不確定(我使用Tomcat 8)。

+0

你應該爲此使用Singleton模式。 –

+1

@RaghuKNair,這是一個單身人士。 – shmosel

+0

辛格爾頓從來都不是正確的模式。 http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons – Samuel

回答

7

儘管在java文檔中沒有明確提及,但DataSource#getConnection方法被設計爲在單個DataSource實例上同時調用。

在一般情況下,您不需要提供客戶端級別的同步。

java文檔中的限制可能會被省略,以便爲實現提供靈活性。

+0

[「that said」](https://en.wiktionary.org/wiki/that_said)通常會引入與您先前的聲明相對應的對應點。 – shmosel

+0

@shmosel謝謝,我認爲它有不同的含義 – AdamSkywalker

1

那麼,你不應該有第一個這個「ConnectionPool」。考慮使用經過測試的實際連接池。

不管怎樣,您的班級的線程安全性是DataSource的線程安全性,因爲您委託給它並且它是唯一的共享狀態。 JDBC API中沒有任何內容確保線程安全,因此您需要檢查實現細節。

+0

我必須使用DOA類,因此在每個類中調用lookup()看起來並不正確 –

+0

那麼,如果singelton反斜槓可以使用庫,那麼可以注入一個數據源,模式 –

+0

感謝提示我不知道追索權注射。 –

相關問題