這章將討論怎樣使用緩存集合。
改變緩存集合
使用ALTER CACHE GROUP語句來改變AUTOREFRESH STATE、INTERVAL和MODE的設置。任何通過ALTER CACHE GROUP設置的值或狀態都是永久的;它們保存在數據存儲中,並在TimesTen守護程序和緩存代理重新啓動時生存。
注意:如果TimesTen安裝時Access Control被激活,則必須擁有DDL權限來在數據存儲中使用ALTER CACHE GROUP語句。
當一個AUTOREFRESH操作正在進行中並且將STATE改爲OFF:
• 如果LockWait普通連接屬性大於0,則AUTOREFRESH操作將停止。ALTER CACHE GROUP SET AUTOREFRESH STATE OFF語句優先於AUTOREFRESH操作。
• 如果LockWait普通連接屬性爲0,則AUTOREFRESH操作將繼續。ALTER CACHE GROUP SET AUTOREFRESH STATE OFF語句將失敗,產生一個鎖定終止錯誤。
例 5.1 此例通過將狀態改爲ON來激活AutorefreshCustomers緩存集合的AUTOREFRESH:
ALTER CACHE GROUP AutorefreshCustomers
SET AUTOREFRESH STATE ON;
刪除緩存集合
使用DROP CACHE GROUP SQL語句來從TimesTen中刪除緩存集合和它所有相關的表。
注意:如果TimesTen安裝時Access Control被激活,則必須擁有DDL權限來在數據存儲中使用DROP CACHE GROUP語句。
如果刪除使用了以INCREMENTAL模式的AUTOREFRESH並在Oracle進行手工安裝對象的READONLY緩存集合或USERMANAGED緩存集合,則在刪除緩存集合之前,必須手工刪除Oracle對象。
當一個AUTOREFRESH操作正在進行時,如果輸入一條DROP CACHE GROUP語句:
• 如果LockWait普通連接屬性大於0,則AUTOREFRESH操作將停止。DROP CACHE GROUP語句優先於AUTOREFRESH操作。
• 如果LockWait普通連接屬性爲0,則AUTOREFRESH操作將繼續。DROP CACHE GROUP語句將失敗,產生一個鎖定終止錯誤。
爲了刪除WesternCustomers緩存集合:
DROP CACHE GROUP WesternCustomers
所有WesternCustomers緩存中表將立即從TimesTen中被刪除,並且緩存集合的定義也將從TimesTen系統表中被刪除。
注意:所有AWT設置都將保持有效,直到DROP CACHE GROUP事務被提交。如果緩存集合是AWT,在刪除緩存集合之前,確保所有綁定的更新都已經應用到Oracle。使用ttRepSubscriberWait程序。
在Oracle數據庫和緩存集合之間拷貝數據
TimesTen多個機制來從Oracle拷貝數據到TimesTen和從TimesTen拷貝數據到Oracle。
一個應用可以使用下列SQL語句來在Oracle和緩存集合之間拷貝數據:
SQL語句 |
描述 |
LOAD CACHE GROUP |
從Oracle 數據中加載還沒有在緩存中的緩存實例。 |
REFRESH CACHE GROUP |
使用當前的Oracle數據替換緩存實例。 |
FLUSH CACHE GROUP |
從緩存集合表中拷貝數據到Oracle表。緩存集合必須是PROPAGATE沒有激活的USERMANAGED。 |
PROPAGATE被激活的SWT緩存集合、AWT緩存集合和USERMANAGED緩存集合提供了自動方式來將緩存集合中的更新應用到Oracle表。
AUTOREFRESH緩存集合屬性可用於READONLY和USERMANAGED緩存集合中來自動將Oracle表中變化應用到緩存集合中。
當一條SELECT查詢在緩存集合表中沒有找到數據時,可以使用事務加載特性來將Oracle表中的數據加載到緩存集合表中。可以對除了使用AUTOREFRESH屬性以外的所有緩存集合使用事務加載。
AUTOREFRESH是一個緩存集合定義的一部分。在已經定義緩存集合並按需調用之後,事務加載就可以實現。事務加載與AUTOREFRESH緩存集合相比較,前者在緩存集合上的限制較少。
AUTOREFRESH適用於與靜態數據相關的如產品目錄或飛行航班表。事務加載在動態緩存內容方面更有用。應用可以使用事務加載特性來加載數據到緩存中,並使TimesTen代理自動刪除長時間沒有使用的數據。
加載和刷新緩存集合
可以使用一條LOAD CACHE GROUP或REFRESH CACHE GROUP語句來將數據從Oracle加載到緩存集合中。兩種從Oracle拷貝數據到緩存集合的SQL語句都可以含或不含WHERE子句或WITH ID子句。加載和刷新的有如下不同:
• LOAD CACHE GROUP 不更新已經出現在緩存集合中的實例。
• REFRESH CACHE GROUP 使用最近的Oracle數據替換緩存集合中所有或指定的實例,即使實例已經出現在緩集合中。自動刷新操作相當於一條UNLOAD CACHE GROUP 語句後跟一條LOAD CACHE GROUP 語句。所有到Oracle數據的變化,包括根表和子表中的插入、更新和刪除,將在刷新操作後反映到緩存中。
例 5.2 爲了從Oracle加載數據到WesternCustomers緩存集合:
LOAD CACHE GROUP WesternCustomers
COMMIT EVERY 256 ROWS;
例 5.3 爲了只從Oracle中加載Zip Code 94022中的用戶的緩存集合實例到WesternCustomers 緩存集合:
LOAD CACHE GROUP WesternCustomers
WHERE (user1.customer.zip = 94022)
COMMIT EVERY 256 ROWS;
例 5.4 爲了從Oracle表中刷新整個WesternCustomers 緩存集合:
REFRESH CACHE GROUP WesternCustomers
COMMIT EVERY 256 ROWS;
例 5.5 爲了只刷新與合同號2353相關的緩存集合實例:
REFRESH CACHE GROUP WesternCustomers
WHERE (user1.orderdetails.itemid = 2353)
COMMIT EVERY 256 ROWS;
加載和刷新AUTOREFRESH和READONLY緩存集合
加載和刷新AUTOREFRESH和READONLY緩存集合有如下限制:
• 加載一個AUTOREFRESH呀READONLY緩存集合時,緩存集合必須爲空。
• AUTOREFRESH狀態必須是PAUSED。
• LOAD或REFRESH語句不能包含WHERE子句或WITH ID子句。
執行下列任務來加載一個AUTOREFRESH緩民集合:
1. 設置AUTOREFRESH狀態爲PAUSED。
ALTER CACHE GROUP testcache SET AUTOREFRESH STATE PAUSED;
COMMIT;
2. 卸載緩存集合。
UNLOAD CACHE GROUP testcache;
COMMIT;
3. 加載緩存集合。
LOAD CACHE GROUP testcache COMMIT EVERY 256 ROWS;
COMMIT;
4. 設置AUTOREFRESH狀態爲ON。
ALTER CACHE GROUP testcache SET AUTOREFRESH STATE ON;
COMMIT;
使用WITH ID加載或刷新緩存集合
WITH ID子句能夠根據主鍵的值而不需要WHERE子句來加載或刷新一個緩存集合。可以以字段名或綁定參數來描述主鍵值。使用WITH ID子句將比使用等價的WHERE子句速度要快。如果失敗,也能夠回滾加載的事務。
WITH ID子句不能用於AUTOREFRESH或READONLY緩存集合。
WITH ID子句允許每次加載一個緩存實例。假設有一個orders表,其主鍵爲order_id。如果用戶調用一指定的合同,則可以通過爲指定的order_id加載緩存實例加載相關信息。
例 5.6 在Oracle中,創建一名爲sample的表:
CREATE TABLE sample (a NUMBER, b NUMBER, c NUMBER,
PRIMARY KEY (a,b));
緩裝此表以使它包含以下行:
A B C
---------- ---------- ----------
1 2 3
4 5 6
7 8 9
在TimesTen上創建緩存集合:
CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP testcache
FROM sample
(a NUMBER, b NUMBER, c NUMBER, PRIMARY KEY (a,b));
使用主鍵有值(1,2)的行加載緩存集合:
LOAD CACHE GROUP testcache WITH ID (1,2);
1 cache instance affected.
SELECT * FROM sample;
< 1, 2, 3>
1 row found.
例 5.7 使用主鍵有值(4,5)的行刷新testcache緩存集合:
REFRESH CACHE GROUP testcache WITH ID (4,5);
1 cache instance affected.
SELECT * FROM sample;
< 1, 2, 3 >
< 4, 5, 6 >
2 rows found.
使用多表加載或刷新緩存集合
如果緩存集合包含多個表,並且Oracle當前正在更新被加載或刷新的表,在提交LOAD CACHE GROUP或REFRESH CACHE GROUP語句之前,可以設置TimesTen isolation級別爲SERIALIZABLE。這將使TimesTen以連接的方式來查詢Oracle表,並保證加載的數據與事務一致。在已經加載或刷新緩存集合之後,可以爲更好的併發重新設置isolation級別爲READ_COMMITTED。
例 5.8 在一個ttIsql會話中,在加載緩存集合之前可以重新設置isolation級別。當要加載或刷新緩存集合時,這個將應用到非日誌模式。
Command> isolation SERIALIZABLE;
Command> LOAD CACHE GROUP WesternCustomers
>COMMIT EVERY 1000 ROWS;
Command> isolation READ_COMMITTED;
改善加載和刷新大表的執行速度
可以通過使用LOAD CACHE GROUP或REFRESH CACHEGROUP語句的PARALLEL子句來改善加載或刷新大表的執行速度。指定要使用的線程號。一個線程從Oracle中取出行,並且另外一個線程插入數據到緩存集合中。不要指定大於CPU能夠加載的線程數量。
例 5.9
REFRESH CACHE GROUP WesterCustomers
COMMIT EVERY 256 ROWS
PARALLEL 2;
使用透明加載
當一條SELECT查詢在緩存集合中沒有查找到數據時,可以配置TimesTen來自動從Oracle表中加載數據到緩存集合表中。當執行SELECT語句時,被選擇的和相關的行被加載到緩存集合的根表中,並且關聯和被選擇的行也被加載到子表中。只有那些滿足緩存集合定義的行被加載。如果緩存集合有基於時間的老化性質定義,這些行也必須滿足此老化性質。
可以爲所有的類型的緩存集合配置透明加載,除了使用AUTOREFRESH屬性的READONLY緩存集合和USERMANAGED緩存集合。
當緩存內容是動態的情況下,透明加載特別有用。例如,可以使用它來加載已經被老化刪除的數據。
SELECT語句的類型
透明加載可用於下列類型的SELECT語句:
• SELECT在單表的主鍵上使用了一個等價的條件。此等價條件必須包括一個常量或參數。例如:
SELECT * FROM table1 WHERE primkey=1;
如果主鍵是複合鍵,則SELECT語句必須包括所有主鍵列的等價條件。例如:
SELECT * FROM table2 WHERE pkcol1=10 AND pkcol2=10;
• SELECT在單表的外鍵上使用了一個等價的條件。此等價條件必須包括一個常量或參數。例如:
SELECT * FROM table2 WHERE foreignkey=1;
如果外鍵是複合鍵,則SELECT語句必須包括所有外鍵列的等價條件。例如:
SELECT * FROM table2 WHERE fkcol1=10 AND fkcol2=10;
• 使用一個等價的條件選擇緩存集合實例中的一個子樹。例如:
SELECT * FROM table1,table2 where table1.primkey=1 and
table2.foreignkey=table1.primkey;
SELECT查詢必須滿足下列條件:
• SELECT查詢必須是語句中最外層的查詢。
• SELECT查詢不能包含UNION、INTERSECT或MINUS結果集操作。
• 只有一個緩存集合中的表可以指定在最外層的SELECT查詢中,但其它沒有在緩存集合中的表可以指定在語句中。
當SELECT查詢返回選擇的行時,整個緩存實例都要被加載,以保持主鍵和外鍵之間的關聯。.
配置透明加載
爲了透明加載數據,設置TransparentLoad Cache Connect屬性爲1。這將使一條SELECT語句在Oracle表上被執行。數據結果將被加載到緩存集合表中。然後此數據通過在緩存集合表中執行原來的SELECT語句被透明返回。
下表總結關於TransparentLoad的設置:
設置 |
描述 |
0 |
不使用透明加載。(缺省) |
1 |
在TimesTen中不發送錯誤信息或警告信息的運行SELECT語句。 |
2 |
如果SELECT操作不能使用透明加載,將返回一個錯誤。將根據TimesTen中可用的數據來執行SELECT操作。 |
二選其一,爲了能夠使用透明加載,可以使用SQLSetConnectOption ODBC函數來設置TT_TRANSPARENT_LOAD ODBC連接選項。此設置將應用到整個連接。
覆蓋一個事務的透明加載
可以通過使用ttOptSetFlag內部程序的TransparentLoad標誌來覆蓋指定事務的TransparentLoad屬性或TT_TRANSPARENT_LOAD ODBC選項。當語句準備時,TransparentLoad標誌值就將產生影響,並且在運行時不能進行改變。在事務被提交或回滾時之後,此連接屬性將重新產生影響。
沖洗USERMANAGED緩存集合
FLUSH CACHE GROUP語句將USERMANAGED緩存集合中的插入和更新沖洗到Oracle。不沖洗刪除。指定爲READONLY或PROPAGATE的表中的記錄也不會沖洗到Oracle。
當從TimesTen到Oracle的數據提交被關閉時,使用FLUSH CACHE GROUP。相比每次事務提交更新數據,在更新被傳送到Oracle之前,許多事務可以在TimesTen中被提交會更好。對於每個實例,如果緩存實例在Oracle中存在,則Oracle中操作將由一個更新構成。如果緩存實例在Oracle不存在,則TimesTen將插入它。
FLUSH CACHE GROUP語句可以使用WHERE或WITH ID子句指定以控制沖洗到Oracle的數據。
例 5.10 爲了將WesternCustomers緩存集合中的變化沖洗到Oracle:
FLUSH CACHE GROUP WesternCustomers;
卸載緩存集合
可以使用UNLOAD CACHE GROUP SQL語句來刪除緩存集合中一些或所有的實例。與DROP CACHE GROUP語句不同,它們中的表不會被刪除。
對於使用AUTOREFRESH屬性的緩存集合要小心使用UNLOAD CACHE GROUP語句。如果行或它的子行在Oracle中被更新,作爲自動刷新的結果,被卸載的行有可能再次出現在緩存集合中。
例 5.11 爲了從WesternCustomers緩存中刪除所有實例:
UNLOAD CACHE GROUP WesternCustomers;
爲了從WesternCustomers緩存中刪除CustId = 1的用戶:
UNLOAD CACHE GROUP WesternCustomers WITH ID(1);
或
UNLOAD CACHE GROUP WesternCustomers
WHERE (User1.Customer.CustId = 1);
複製緩存集合表
可以從一個數據存儲中複製緩存集合表到另一個數據存儲中的緩存集合表中或另一個數據存儲的標準TimesTen表中。主數據存儲中的緩存集合類型必須與子數據存儲中的緩存集合類型相同。例如,READONLY緩存集合中的表可只能被複制到另一個數據存儲中的READONLY緩存集合的表中或另一個數據存儲的標準TimesTen表中。
緩存集合中的所有表都必須包括在複製計劃中。
可以爲下列類型的緩存集合通過配置一個名爲active standby pair的複製計劃來實現高效的緩存實例:
• READONLY緩存集合
• ASYNCHRONOUS WRITETHROUGH緩存集合
一個複製這些類型之一的緩存集合活動備用對可以自動地改變緩存集合的角色作爲失敗和使用最小數據丟失進行恢復的一部分。緩存集合給自己提供來自於Oracle數據庫的彈性,進一步鞏固系統的可靠性。
也可以配置緩存集合表的複製來實現工作量的平衡。下面的配置是一個示例:
• 加載平衡 — 配置從使用AUTOREFRESH屬性的緩存集合中的表到標準表中的單向複製。Oracle上的更新將自動刷新到TimesTen緩存集合。此更新然後被複制到TimesTen表。
• 分隔工作量 — 在不同的數據存儲的WRITETHROUGH緩存集合中的表之間配置雙向複製。設計應用以使事務爲了一個特定用途(例如,一個地理區域)只更新特定的緩存數據表,並且相同的緩存集合表不能在兩個存儲中都直接被更新。在一個存儲中被更新的緩存集合表被複制到另一個數據存儲中相應的緩存集合表中。更新將直接通過應用傳送到Oracle,但不進行復制更新。
不要使用活動active/活動配置,特別是複製緩存集合時。這種配置的非預期結果包括不可解的死鎖、緩存集合內容的衝突和恢復問題。
改變Oracle規劃
Cache Connect to Oracle沒有機制來發現Oracle數據庫由際操作如CREATE、DROP或ALTER引起的規劃改變。如果需要改變Oracle規劃,則要執行下列任務:
1. 使用DROP CACHE GROUP來刪除所有緩存Oracle被改變表的緩存集合。
2. 停止緩存代理。
3. 對Oracle進行期望的改變。
4. 使用CREATE CACHE GROUP來重新創建緩存集合。
如果在Oracle數據庫中規劃被修改之前不刪除緩存集合,則在原來緩存集合中的操作,包括AUTOREFRESH,可能成功,也可能失敗而產生錯誤。
增量AUTOREFRESH不能發現一人Oracle表的截短。如果要截短一個Oracle基表,則要執行下列任務:
1. 使用ALTER CACHE GROUP語句來設置AUTOREFRESH STATE爲PAUSED。
2. 截短Oracle基表。
3. 通過使用不帶有WHERE或WITH ID子句的REFRESH CACHE GROUP語句刷新緩存集合。
在刷新緩存集合之後,自動刷新操作將重新開始。
注意:在緩存集合中不允許截短TimesTen表。
注意:如果緩存集合是AWT,在刪除緩存集合之前,確保所有綁定的更新已經應用到Oracle。使用ttRepSubscriberWait程序。