從JCA規範引用(1.0版本,但是1.5擁有相同的文字,我認爲新版本的一樣好):
資源適配器需要提供ManagedConnectionFactory
接口的實現。
要求ManagedConnectionFactory
實現類擴展java.lang.Object
類中定義的hashCode
和equals
方法的實現。應用程序服務器使用這兩種方法以特定於實現的方式構建連接池。方法實現應該基於一組完整的配置屬性,這些配置屬性使得實例對於EIS實例而言是唯一的和特定的。
和
的應用服務器可以使用在其連接池管理中使用它的搜索和匹配的標準附加參數。這些參數可能是EIS或應用程序服務器特定的。在ManagedConnectionFactory
和ConnectionRequestInfo
上定義的方法equals
和hashCode
便於應用服務器進行連接池管理和結構化。
該規範沒有提供更多關於此內容的內容(除了對某些其他接口指定相同的要求外)。
由於總體思路是受管連接實現由供應商(例如數據庫供應商)提供,並且應用程序服務器可以彙集資源(例如ManagedConnection
實例)和句子「這兩種方法均由一個應用服務器以實現特定的方式構建其連接池「我只能假設這樣做是爲了簡化實現的實現,例如用於HashMap
或HashSet
等。例如,創建兩個具有相同屬性的ManagedConnectionFactory
實例將具有equals
和hashCode
的結果相同,因此可以使用相同的池。
這似乎是由以下引自同一個規格的支持:
應用服務器可以每ManagedConnectionFactory
實例 (從而對每個EIS實例)的基礎上分區的游泳池。應用程序服務器可以選擇保證(以具體實現的方式),它總是至少按照實例粒度劃分連接池。
JCA規範似乎暗示到單個系統的連接應該由單個託管連接工廠處理(儘管我相信它沒有明確說明)。這需要一種方法根據其屬性找到一個單一的ManagedConnectionFactory
。作爲一個例子,Jaybird(我維護的Firebird JDBC驅動程序)的核心是一個JCA實現(它可以是一個真正的痛苦)。 Jaybird的初始實現是由David Jencks撰寫的,他也編寫了JBoss的JCA實現。在驅動程序中equals
和hashCode
以多種方式被使用:
- 的
ManagedConnectionfactory
保持靜態WeakHashMap
指向一個實例本身。這用於規範化一個實例(如果實例已經存在與equals
和hashCode
相同,則返回該實例)。
- 的
java.sql.Driver
實施org.firebirdsql.jdbc.FBDriver
保持來自ManagedConnectionfactory
一個WeakHashMap
到一個(非池)javax.sql.DataSource
實現。創建新連接時,會檢索(或以其他方式創建)此數據源以創建實際連接。
- 當一個
ManagedConnectionFactory
被反序列化時,readResolve
方法將返回規範化版本(見1),如果它已經在映射中。
作爲便箋:感謝您提出這一點;它看起來像Jaybird中的當前實現有一個bug,因爲這兩個映射都保持對託管連接工廠的直接和間接的強引用,這使得使用較弱的哈希映射而無用。
嗨西蒙,謝謝你的迴應!我已經在規範中找到了這個段落,因爲大多數應用服務器都在錯誤消息中指明瞭該節號;-)我的問題更多地是關於規範要求的原因?我看不到在RA上使用這些方法的理由,這些方法對於EJB,CDI託管的bean等不具有同等效力。 – 2014-10-20 19:18:46
資源適配器與EJB或CDI完全不同。由於JCA組件集中在App Server中。因此,如果App服務器將Factory保存在一個集合中,則使用equals和hashCode。 – 2014-10-20 19:27:37
嗯......與RA不同,IMO的意見EJB相當集中。我通過我的部署直接定義了我的RA或MCF的實例數量,至少在託管環境中。我期望每個部署只創建和啓動一個RA,而不是每個都使用相同的屬性。也許這在非託管環境中更有意義。 – 2014-10-20 19:35:57