2012-06-05 100 views
0

我爲我的類創建了一個Singleton,其中包含一個MemcachedClient實例(可以是任何需要與服務器建立連接的對象,但我提供了一個具體示例)。我在一個靜態init塊中初始化MemcachedClient。如果MemcachedClient由於連接錯誤而無法創建實例,現在這意味着我的類沒有價值,因爲它具有空的MemcachedClient實例。網絡連接失敗時,如何處理Java Singleton?

我的問題:這種情況的最佳解決方案是什麼?其他人如何處理這種情況?

+0

那麼,你的特定應用程序的功能可以不使用memcached? – cheeken

+0

不管高速緩存的可用性如何,應用程序都將寫入工作。如果由於某種原因,當我的類嘗試創建初始連接時,緩存服務器恰好在短時間內不可用,我只是試圖確定最佳解決方案。 – wxkevin

回答

1

問題(如標題所述)太寬泛,這取決於單身人士的目的。

在你的情況下,顯而易見的問題是:如果初始化失敗,你能期待這個問題在不久的將來會得到解決嗎?繼續嘗試的代價是什麼(重新設計,以便您的應用不會以怪異方式向下崩潰),而不是僅僅重新啓動應用?

如果您不希望輕鬆解決錯誤,只是崩潰應用程序(使用正確的日誌/警報/通知)。如果你希望它保持運行直到問題解決,那麼步驟將是:

1)將初始化傳遞給單例的構造函數(爲什麼把它放在一個靜態塊中,如果你可以控制對構造函數的訪問) 。

2a)雖然構造函數失敗,但調用getInstance將返回null。修改您的應用程序以便能夠處理它。

2b)如果存在問題,請在沒有正確初始化的情況下創建單例。調用這個對象的方法將不會執行任何操作,直到初始化問題已經解決/對象已經初始化。修改您的應用程序以處理這些虛擬方法。這種方法更快,但更復雜。 3)當請求新實例(如果2a)或方法被調用(如果2b)時,再次檢查對象是否可以被初始化。

將問題解決後的所有成本與剛剛重新啓動應用程序的成本進行比較。

+0

感謝您的回覆!我已經或多或少地使用了你的方法。 – wxkevin

相關問題