第七章 PersistenceManagerFactory
PersistenceManagerFactory 創建PersistenceManager實例以供應用程序使用.它允許你配置數據連接方
式和指定所創建的PersistenceManager的默認設置.你也可以通過它在編程中獲知你當前廠商支持的JDO選項
.使你能使用產品的全部特性來最優化你的程序.
7.1. 獲得PersistenceManagerFactory
JDO廠商實現PersistenceManagerFactory 時也許支持公開的構造函數,但推薦你使用JDOHelper的
getPersistenceManagerFactory 方法來獲得PersistenceManagerFactory方法.這個方法的屬性參數提
供了工廠的配置信息.從getPersistenceManagerFactory 返回的PersistenceManagerFactory 對象是"
冰凍的",試圖改變它的屬性設置會導致JDOUserException.這是因爲返回的工廠可能來自連接池,和其他應用
程序組建共享.
JDO要求具體的PersistenceManagerFactory 類實現Serializable 接口.這允許你創建和配置
PersistenceManagerFactory,然後序列化到文件或者存儲到JNDI樹供日後取出和使用.
7.2. PersistenceManagerFactory 屬性
多數PersistenceManagerFactory 接口包含JAVA BEAN風格的getter 和setter方法來讀取和設置屬性
.這些屬性按照功能可以分爲兩類:數據連接配置,默認持久化管理者和事務選項.
下面章節介紹了每一種屬性,許多可以通過傳給getPersistenceManagerFactory 方法的屬性參數來設置
.這是一種情況.在方法聲明後列出了屬性的配置代碼.
7.2.1. 連接配置
使用下面的屬性告訴JDO如何連接你的數據庫
1)指定數據連接的用戶名
2)指定數據連接的密碼
3)數據連接的URL
4)數據連接的驅動類名稱
5)連接工廠的JNDI位置用來取得數據連接.這個屬性會覆蓋上面列出的數據連接屬性.
連接工廠可以取得連接.這個屬性覆蓋所有其他的數據連接屬性,包括連接工廠名稱.工廠的準確類型是和具
體實現相關的,許多JDO實現品要求標準JAVA連接器體系連接工廠(JCA).在JDBC層上實現的JDO要求給出JDBC
數據源,其他的實現品會使用其他的工廠類型.
在一個受管制的環境,從主要連接工廠取得的連接會自動加入到正在進行的任一全局事務.JDO會要求一個另
外沒有配置爲參與全局事務的連接工廠.例如,Kodo默認的數據存儲標識生成算法要求一個自身的非管制事務.
工廠的JNDI位置可以在這個屬性中指定.
7.2.2. 默認的PersistenceManager 和事務
下面的設定會作爲PersistenceManagers 和PersistenceManagerFactory生成的事務的默認屬性值.一
些實現品可能不支持所有這些屬性,如果你設置不支持屬性的值,會導致JDOUnsupportedOptionException
1)設置這個屬性爲true.這樣在你的程序裏, PersistenceManagers 和它所管理的能持久類能被多線程的
訪問.如果屬性設爲false,那麼一些JDO實現品會通過避免同步的方式來優化性能.
2)默認值爲true以使用最優化的事務.在事務的章節我們會討論最優化事務.
3)如果這個屬性值爲true,那麼在事務提交之後,持久對象的字段值不會被清空.否則,持久字段會被清空,在下
次訪問它們的時候它們會再從數據庫中讀取值.
4)管理事務回滾時持久事務字段的行爲.如果設爲true,那麼它們的值會被設爲事務沒有開始時的值.
5)指定是否在事務外讀持久狀態.如果屬性爲false,在事務之外,任何枚舉extent, 執行查詢或者訪問非主鍵
行爲都會導致JDOUserException
6)指定是否在事務外寫持久狀態.如果設爲false,任何在事務外的修改持久字段行爲都會導致
JDOUserException
注意事務外的更改並不會存儲到數據庫.當被修改對象一進入事務後更改就馬上被忽略.
7)這個屬性控制當執行查詢時是否考慮持久實例的更改.設爲true,則表示當前事務的更改可以忽略.這通常使
實現品可以使用數據庫的本地接口來執行查詢.如果設爲false,JDO會在執行查詢前保存數據的更改,或者在內
存中執行事務性查詢.兩者都會影響性能.
7.3. 獲得PersistenceManagers
PersistenceManagerFactory 接口包含兩個getPersistenceManager 方法.一個版本以用戶名和密碼
設置PersistenceManager的數據連接,另一個無參,依賴於PersistenceManagerFactory的連接用戶名和連
接密碼.
兩個方法都會返回一個新構造的PersistenceManager對象或者返回連接池的一個PersistenceManager實例
.
從PersistenceManagerFactory獲得第一個PersistenceManager 之後,工廠的配置進入"冰凍"狀態.任
何對屬性的改變都會導致JDOUserException.
VendorName: JDO廠商
VersionNumber: 產品版本號
The supportedOptions method returns a Collection of Strings enumerating the JDO
options supported by the implementation. The following option names are recognized:
除了支持PersistenceManagers,PersistenceManagerFactory 還支持當前JDO實現品的元數據
.getProperties 方法返回一個屬性對象,至少包含下列關鍵字值:
VendorName: JDO廠商
VersionNumber: 產品版本號
supportedOptions 方法返回一個字符串集合,列舉該JDO實現品所支持的配置選項.以下選項名是承認的:
javax.jdo.option.TransientTransactional
javax.jdo.option.NontransactionalRead
javax.jdo.option.NontransactionalWrite
javax.jdo.option.RetainValues
javax.jdo.option.Optimistic
javax.jdo.option.ApplicationIdentity
javax.jdo.option.DatastoreIdentity
javax.jdo.option.NonDurableIdentity
javax.jdo.option.ArrayList
javax.jdo.option.HashMap
javax.jdo.option.Hashtable
javax.jdo.option.LinkedList
javax.jdo.option.TreeMap
javax.jdo.option.TreeSet
javax.jdo.option.Vector
javax.jdo.option.Map
javax.jdo.option.List
javax.jdo.option.Array
javax.jdo.option.NullCollection
javax.jdo.option.ChangeApplicationIdentity
javax.jdo.query.JDOQL
Kodo支持除javax.jdo.option.ChangeApplicationIdentity和
javax.jdo.option.NonDurableIdentity. 之外的所有選項