TIMESTEN內存數據庫-最佳實踐(已翻譯)

TimesTen內存數據庫

第一章 Cache Connect to Oracle概念

TimesTen數據交換技術提供在Oracle數據庫和TimesTen數據管理器之間進行連接和雙向數據傳送。數據交換技術也使得能夠方便的捕獲和處理進入到TimesTen數據管理器的大流量事件流,並且能進行併發傳送數據到Oracle數據庫。

TimesTen允許通過創建cache group來高速緩存Oracle數據,以在TimesTen中映射一個或多個Oracle表。

允許高速緩存Oracle數據的TimesTen聯合特徵就作爲Cache Connect to Oracle

關於高速緩存集合

一個cache group就是描述被高速緩存到TimesTen數據存儲中的Oracle數據。高速緩存集合可以創建來高速緩存一個單表的所有或部分數據,或一個相關的Oracle數據表集。

高速緩存集合可以使用CREATE CACHE GROUP SQL語句或基於瀏覽器的Cache Administrator(Chapter 6, “CacheAdministrator.”)來創建。

圖 1.1 顯示名爲target_customers高速緩存集合緩存Oracle表table customer。高速緩存集合中的數據是存儲在Oracle數據庫中所有用戶的大數據集的一個子集。

1.1 高速緩存一個表

clip_image002

如果定義一個root table和多個child tables,則可以在同一個高速緩存集合中緩存多個Oracle表。在一個高速緩存集合中只能有一個root table

在擁有多個表的高速緩存集合中,每個子表必須通過一個外鍵約束連接到高速緩存集合中的根表或另一個子表。儘管TimesTen中緩存的表必須使用外鍵連接約束,但這些表在Oracle實例中不一定必須有連接。緩存集合中的根表不能通過外鍵約束來引用緩存集合中的任何其它表。所有緩存集合中的其它表都是子表

從Oracle加載到TimesTen緩存集合中的基本單位是cache instance,用來描述通過外鍵與根表特定行相關聯的行集。緩存集合中每個表中粗體顯示的是由根表中主鍵爲122標識的緩存實例。此cache instance key確定根表中的行和引用此行的子表中所有的行。

圖 1.2顯示緩存集合target_customers中的表。根表是customerordersorder_item是子表。

1.2 高速緩存多個表

clip_image004

在TimesTen緩存和Oracle之間交換數據

如圖 1.3所示,flushpropagate表示從TimesTen緩存拷貝表數據到Oracle,loadrefresh表示從Oracle拷貝數據到TimesTen緩存。

1.3 TimesTenOracle之間交換數據

clip_image006

至於怎樣將緩存集合中的數據傳送到Oracle和從Oracle刷新數據,將依據所選擇的緩存集合的類型。

緩存集合類型

緩存集合的基本類型爲:

• READONLY緩存集合。

READONLY緩存集合通過AUTOREFRESH機制來將Oracle表中的更新進行強制緩存以應用到TimesTen。

• SYNCHRONOUS WRITETHROUGH (SWT) 緩存集合。

SYNCHRONOUS WRITETHROUGH (SWT)緩存集合將強制把集合中的緩存數據更新至TimesTen,並且發送到Oracle。SWT緩存集合的更新將被進行同步提交(Oracle)。

• ASYNCHRONOUS WRITETHROUGH (AWT)緩存集合。

ASYNCHROUNOUS WRITETHROUGH (AWT)緩存集合將強制把集合中的緩存數據更新至TimesTen,並且發送到Oracle。AWT緩存集合的更新將被進行異步提交(Oracle)。

• USERMANAGED緩存集合。

USERMANAGED緩存集合可以進行自定義。例如,USERMANAGED緩存集合中的表可以擁有READONLY或PROPAGATE屬性。

第二章 快速開始

這章將討論怎樣使用SQL語句來創建並管理簡單的緩存集合。也可使用基於瀏覽器的Cache Administrator來創建緩存集合。

安裝TimesTen和Oracle

在能夠創建緩存集合之前,必須安裝TimesTen和Oracle環境。完成以下任務:

1. 在TimesTen主機上安裝Oracle Client。

2. 創建必需的Oracle帳號。

3. 創建一個TimesTen帳號。

4. 創建TimesTen DSN。

在TimesTen主機上安裝Oracle Client

Cache Connect to Oracle特性使用Oracle共享庫來與Oracle數據庫進行通信。可以通過在安裝了TimesTen的機器上安裝Oracle Client來安裝這些庫文件。安裝Oracle 9i Client或Oracle Database 10g。Oracle客戶端的版本不必與Oracle服務器端的版本相同。Cache Connect支持下面的Oracle客戶端和服務器端的版本:

• Oracle 10g Release 2 (Oracle 10.2.0.1.0 或之後)

• Oracle 10g Release 1 (Oracle 10.1.0.5.0或之後)

• Oracle 9i Release 2 (Oracle 9.2.0.8.0或之後)

安裝Oracle Client時,選擇Application User Installation Type。不必專門配置一個服務目錄來用於Cache Connect to Oracle,所以可以跳過安裝過程的這一步。

安裝Oracle Client以後,安裝TimesTen。

注意:如果在安裝Oracle Client之前安裝了TimesTen,必須重新啓動操作系統(Windows)或TimesTenUNIX)。

創建必需的Oracle帳號

在能夠使用Cache Connect to Oracle之前,必須從數據庫管理員處獲得一個Oracle帳號。如果操作者實際擁有數據庫管理權限,則在Oracle服務器上打開命令窗口並啓動SQL*Plus,以系統管理員身份登錄:

sqlplus system/password@Oracle_Service_Name

例如,爲了在由連接串、system1確定的Oracle數據庫上給testuser創建一個新Oracle帳號,操作如下:

sqlplus system/manager@system1

SQL> CREATE USER testuser IDENTIFIED BY 11;

SQL> GRANT connect, resource, create any trigger TO cddbo;

SQL> COMMIT;

SQL> EXIT

爲了與本章餘下的部分討論的一些示例緩存集合操作保持一致,Oracle用戶爲cddbo,口令爲11,並且是system1中的一個Oracle帳號。

在TimesTen上創建一個帳號

作爲實例管理者,使用ttIsql工具來連接到數據存儲TT_tt70_32.。數據存儲實例由TimesTen在安裝時定義,用來使實例管理者能夠執行數據存儲連接管理任務。

然後使用CREATE USER和GRANT語句來創建一個名爲cddbo的用戶,擁有ADMIN和DDL權限:

ttIsql TT_tt70_32.

Command> CREATE USER pgmrnew IDENTIFIED BY 'pgmrnew';

Command> GRANT ADMIN, DDL TO pgmrnew;

注意:此帳號必須與Oracle數據庫帳號和口令相同

創建TimesTen DSN

在Window系統中,創建一簡單的TimesTen系統數據存儲(System DSN),名稱爲cddboDSN。

關於cddboDSN,設置如下:

• Data Store Path and Name:c:/temp/ cddbods

• Permanent Data Sz (MB):16

• Temporary Data Sz (MB):16

• User ID:pgmrnew(此ID也用作Oracle User ID)

• Oracle ID:orcl

• Oracle Password:pgmrnew

• DatabaseCharacterSet:ZHS16GBK。此數據庫字符集必須與Oracle數據庫字符集相同。爲了得到Oracle數據庫字符集信息,在Oracle數據庫上輸入下列查詢:

SELECT value FROM nls_database_parameters

WHERE parameter='NLS_CHARACTERSET';

對於其餘設置,使用缺省值。

創建READONLY緩存集合

在已經安裝TimesTen和Oracle並進行配置以後,就可以創建緩存集合。

這部分將討論怎樣創建一個簡單READONLY緩存集合,以緩存Oracle數據庫中單一表中的內容。儘管一個緩存集合可以由多個表組成,這裏只緩存一個Oracle表以保持示例的簡單。

圖 2.1 顯示一個緩存一單個Oracle表的READONLY緩存集合。

2.1 簡單READONLY緩存集合

clip_image008

第1步:創建一Oracle表

2.2 創建一Oracle

clip_image010

連接到新帳號並創建一數據表:

sqlplus testuser/mypsswrd@system1

SQL> CREATE TABLE readtab (a NUMBER NOT NULL PRIMARY KEY,

b VARCHAR2(31));

然後插入一些記錄並進行提交:

SQL> INSERT INTO readtab VALUES (1, 'hello');

1 row created.

SQL> INSERT INTO readtab VALUES (2, 'world');

1 row created.

SQL> COMMIT;

Commit completed.

第2步:創建緩存集合

2.3 創建READONLY緩存集合

clip_image012

使用ttIsql工具來連接cddboDSN數據存儲。在命令提示符下,使用ttCacheUidPwdSet程序來傳遞緩存管理用戶ID和口令作爲參數。然後調用ttCacheStart程序來爲數據存儲啓動緩存代理。在這個示例中,緩存管理用戶ID是cddbo,並且口令爲11:

> ttIsql cddboDSN

Command> call ttCacheUidPwdSet('pgmrnew','pgmrnew');

Command> call ttCacheStart;

接下來,使用CREATE CACHE GROUP語句來創建名爲readcache的READONLY緩存集合,用來在TimesTen中緩存Oracle表tsr20_user的內容:

Command> CREATE READONLY CACHE GROUP readcache

> AUTOREFRESH INTERVAL 5 SECONDS

> FROM tsr20_user

>(code char(5) NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL);

第3步:加載緩存集合

加載Oracle表中的內容到緩存集合表中。

Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;

185 cache instances affected.

檢查tsr20_user表的內容:

Command> SELECT * FROM tsr20_user;

< -000, test >

……………………

< 05999, 系統管理員05999 >

185 rows found

使用ttIsql cachegroups命令來檢查READCACHE緩存集合的定義:

Command> cachegroups;

Cache Group TESTUSER.READCACHE:

Cache Group Type: Read Only

Autorefresh: Yes

Autorefresh Mode: Incremental

Autorefresh State: On

Autorefresh Interval: 5 Seconds

Root Table: PGMRNEW.TSR20_USER

Table Type: Read Only

1 cache group found.

第4步:更新Oracle表

2.4 使用Oracle更新自動刷新TimesTen

clip_image014

使用SQL*Plus,插入多行到READTAB並提交事務:

SQL> INSERT INTO readtab VALUES (3, 'Hello');

1 row created.

SQL> INSERT INTO readtab VALUES (4, 'Again');

1 row created.

SQL> COMMIT;

Commit completed.

5秒之後,TimesTen將從Oracle自動刷新緩存數據。在ttIsql中檢查READTAB表的內容:

Command> SELECT * FROM readtab;

< 1, hello >

< 2, world >

< 3, Hello >

< 4, Again >

4 rows found

第5步:刪除緩存集合

在TimesTen窗口中,使用DROP CACHE GROUP語句從TimesTen數據存儲中刪除緩存集合:

Command> DROP CACHE GROUP readcache;

第6步:停止緩存集合

調用ttCacheStop程序停止數據存儲的緩存代理:

Command> call ttCacheStop;

激活SQL passthrough特性

這部分將討論怎樣在DSN中設置PassThrough屬性來命令TimesTen通過SQL定向到Oracle。

圖 2.5 顯示從一個應用將SQL傳遞到Oracle表。緩存表通過自動刷新機制從Oracle接收更新。

2.5 Cache Group to Oracle傳遞SQL

clip_image016

第1步:創建新的TimesTen DSN

在Window系統中,創建一新的TimesTen系統數據源(System DSN),名稱爲cddboPT,使用與指定給cddboDSN的相同的屬性。另外,設置PassThrough屬性值爲‘2’,以直接傳遞不在緩存集合中的Oracle表的查詢和程序調用到Oracle。

對於cddboPT,設置如下:

• Data Store Path and Name: c:/temp/cgPT2d

• Permanent Data Sz (MB): 16

• Temporary Data Sz (MB): 16

• User ID: pgmrnew (此ID也用作Oracle User ID)

• Oracle ID: orcl

• Oracle Password: pgmrnew

• PassThrough: 2

• DatabaseCharacterSet: ZHS16GBK。此數據庫字符集必須與Oracle數據庫字符集相同。爲了得到Oracle數據庫字符集信息,在Oracle數據庫上輸入下列查詢:

SELECT value FROM nls_database_parameters

WHERE parameter='NLS_CHARACTERSET';

對於其餘設置,使用缺省值。

第2步:創建READONLY緩存集合

2.6 創建READONLY緩相聚集合

clip_image018

在TimesTen窗口中,連接到DSN cddboPT,設置緩存管理用戶ID和口令,啓動緩存代理,並創建READONLY緩存集合:

ttIsql cgPT2

Command> call ttCacheUidPwdSet('pgmrnew','pgmrnew');

Command> call ttCacheStart;

Command> CREATE READONLY CACHE GROUP readcache

> AUTOREFRESH INTERVAL 5 SECONDS

> FROM tsr20_user

> (code char(5) NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL);

第3步:加載緩存集合

加載Oracle表的內容到緩存集合表中。

Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;

4 cache instances affected.

第4步:更新緩存集合表

2.7 更新TimesTen緩存集合表

clip_image020

使用ttIsql,插入一些行到tsr20_user:

Command> INSERT INTO tsr20_user VALUES ('0001','Just','00000', 'dd','0000','1',NULL);

1 row inserted.

Command> INSERT INTO tsr20_user VALUES ('0002',' Passing ','00000', 'dd','0000','1',NULL);

1 row inserted.

Command> INSERT INTO tsr20_user VALUES ('0002',' Through ','00000', 'dd','0000','1',NULL);

1 row inserted.

使用SQL*Plus檢查 check the contents of the readtab table on Oracle:

SQL> SELECT * FROM tsr20_user;

CODE NAME

---------- -------------------------------

-000 test

……………………

05999 系統管理員05999

187 rows selected.

然後使用ttIsql檢查TimesTen中表tsr20_user的內容:

Command> SELECT * FROM tsr20_user;

< -000, test >

……………………

< 05999, 系統管理員05999 >

187 rows found

第5步:刪除緩存集合

使用ttIsql,輸入DROP CACHE GROUP語句來從TimesTen數據存儲中刪除緩存集合:

Command> DROP CACHE GROUP readcache;

第6步:停止緩存代理

調用ttCacheStop程序來停止數據存儲的緩存代理:

Command> call ttCacheStop;

創建緩存集合任務列表

表 2.1 創建緩存集合任務列表

任務序號

1

確保已經安裝Cache Connect to Oracle。使用ttIsql來驗證:

connect “uid=myuid;pwd=mypwd;OraclePWD=mypwd;passthrough=3”;

SELECT COUNT(*) FROM DUAL;

exit

此查詢應該返回1。如果不是,則檢查以下內容:

• 設置以下環境變更:ORACLE_HOME、LD_LIBRARY_PATH、SHLIB_PATH

• 緩存管理用戶ID和口令,以及Oracle ID

• Oracle服務器的狀態

2

對所有要創建的緩存集合設計緩存集合計劃。可能使用Cache

Administrator。

3

確保有足夠的資源來加載所有的緩存集合。

設置First Connection屬性:

PermSize – 可以首先創建緩存集合,然後使用ttSize工具來估算PermSize屬性的值。必須估算要使用ttSize工具進行緩存的行數。

TempSize – 沒有必要的意義。

DatabaseCharacterSet – 確保它與Oracle數據庫字符集相匹配。

文件系統大小推薦:

• 數據存儲目錄應足夠大以處理兩個檢查點文件。每個檢查點文件的最大值爲20 MB + PermSize

• 日誌目錄應足夠大以處理積累在檢查點之間的日誌文件。注意,如果在自動刷新間隔期間Oracle表中有大量的更新,自動刷新事務可能相當大。 一個對於日誌目錄大小的處理規則是使它等於數據存儲的大小加上3倍的LogFileSize的3倍。

• 臨時目錄應放在快速文件系統中,以提高執行大事務的速度。可以通過設置TMPDIR環境變量(UNIX)或TEMP環境變更(Window)來指定臨時目錄用於自動刷新操作。在設置環境變量之後,重新啓動TimesTen

Daemon(UNIX)或機器(Window)。一個很大自動刷新事務在臨時目錄中要求很大空間。

4

如果緩存集合是自動刷新或異步寫方式,要設置緩存管理用戶ID和口令。緩存管理用戶ID必須是一個Oracle用戶,並且必須有相應的權限。

5

啓動緩存代理。如果計劃使用非日誌模式(參閱第7步),則跳過此步。

6

創建並提交所有的緩存集合。

7

(選項)使用非日誌模式加載緩存集合。

爲了更快執行和降低資源使用,可以在非日誌模式中加載緩存集合。非日誌模式的缺點是:

• 所有到TimesTen數據存儲已存在的連接必須停止。

• 加載操作不能進行復制。

執行下列任務來使用非日誌模式加載緩存集合:

a. 如果正在運行的話,停止緩存代理、複製代理以及TimesTen服務。

b. 斷開所有連接到TimesTen數據存儲的應用。

c. 使用First Connection attributes Logging=0、DurableCommits=0、LockLevel=1屬性連接到數據存儲。.

d. 爲每個集合發送下列SQL語句:LOAD CACHE GROUP

cache_group_name COMMIT EVERY 0 ROWS。

e. 在加載每個緩存集合之後,提交事務併發送一個檢查點。

f. 使用日誌重新將應用連接到TimesTen數據存儲。

g. 啓動緩存代理。

8

如果需要複製,則在緩存集合表上創建TimesTen複製計劃。

9

如果要複製緩存集合表或緩存集合是異步寫(AWT)方式,則啓動複製代理。

注意:當複製代理正在運行時,不能創建或刪除AWT緩存集合。

10

加載緩存集合並提交(如果不執行第7步)。使用LOAD

CACHE GROUP cache_group_name COMMIT EVERY n ROWS。對於n的推薦值爲256。

第三章 定義緩存集合

這章將討論不同的緩存集合類型以及怎樣進行定義。

創建緩存集合定義

可以使用CREATE CACHE GROUP語句來創建一個緩存集合定義,包括爲每個將被緩存的Oracle表分別定義緩存表。

表 3.1 顯示一個簡單緩存集合定義的組成。緩存集合定義的每個部分將在下面部分討論。

表 3.1 緩存集合定義的組成

組 成

CREATE type CACHE GROUP

owner.name

Cache group and table

attributes

FROM table definition

[WHERE ...]

[AGING ...]

也可以使用Web瀏覽器通過Cache Administrator來創建緩存集合。

緩存集合命名

在CREATE CACHE GROUP語句中,緩存集合的名稱標識使用如下形式:

owner.name

如果在緩存集合的名稱中不指定owner,則ID或當前會話用戶將作爲owner。

選擇緩存集合類型

緩存集合類型可以是系統管理用戶管理系統管理緩存集合強制指定數據操作,而用戶管理緩存集合的數據操作可以自定義。系統管理緩存集合包括:

• READONLY cache groups

• SYNCHRONOUS WRITETHROUGH (SWT) cache groups

• ASYNCHRONOUS WRITETHROUGH (AWT) cache groups

READONLY緩存集合

A READONLY緩存集合通過AUTOREFRESH機制進行強制緩存操作,將Oracle表中的更新應用到TimesTen。此緩存不能進行直接更新。

圖 3.1 顯示一個READONLY緩存集合

3.1 READONLY緩存集合

clip_image022

使用CREATE READONLY CACHE GROUP語句來創建READONLY緩存集合。缺省的:

• AUTOREFRESH緩存集合屬性被設置爲INCREMENTAL模式。

• AUTOREFRESH INTERVAL值爲5 MINUTES。

• AUTOREFRESH STATE爲PAUSED。

可以使用ALTER CACHE GROUP語句來改變任何AUTOREFRESH緩存集合屬性的缺省設置或完全阻止Oracle表中的更新應用到緩存中。

在創建READONLY緩存集合之前,通過使用ttCacheUidPwdSet內部程序來設置緩存管理用戶ID和口令或使用帶有-cacheUidPwdSet選項的ttAdmin工具。緩存管理用戶將在Oracle上創建一個觸發器,所以它必須擁有顯示在表 4.1中關於CREATE READONLY CACHE GROUP的Oracle權限。

對於每個數據存儲,緩存管理用戶ID和口令只需設置一次。如果數據存儲被重寫或破壞,則需要重新設置緩存管理用戶ID和口令。

試圖在READONLY緩存集合中更新緩存的表,將導致TimesTen錯誤8225 “Table is read only”。但是,如果PassThrough屬性被設置爲2或3,DML語句也可以通過緩存傳遞到Oracle,並通過AUTOREFRESH再從Oracle傳回到緩存集合中。在READONLY緩存集合中的passed-through語句的效果不會在包含此語句的事務中產生。只有在此事務被提交到Oracle,然後在下一次緩存的AUTOREFRESH完成時纔會體現。

使用READONLY緩存集合時的限制

當使用READONLY緩存集合時,有下列限制:

• READONLY緩存集合中的表不能直接更新。

• 緩存集合和其中的表可以使用下列屬性:

– AUTOREFRESH

– UNIQUE HASH ON

– ON DELETE CASCADE

• 不允許使用手動FLUSH操作。

• TRUNCATE TABLE語句不能自動刷新。

• 當使用LOAD CACHE GROUP語句時緩存集合必須爲空。

• 當使用LOAD CACHE GROUP或REFRESH CACHE GROUP語句時,AUTOREFRESH STATE必須爲PAUSED。

• WHERE子句中的所有字段(列和表)的引用必須完全合法。例如:user.table user.table.column

• LOAD CACHE GROUP和REFRESH CACHE GROUP語句不能包含WHERE子句。

• 不能指定Least recently used (LRU)老化。

示例:創建READONLY緩存集合

此例創建一個包含customerordertab表的READONLY緩存集合,名爲customer_orders

CREATE READONLY CACHE GROUP customer_orders

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

region VARCHAR2(10),

PRIMARY KEY(custid)),

user1.ordertab (orderid NUMBER NOT NULL,

custid INTEGER NOT NULL,

PRIMARY KEY (orderid),

FOREIGN KEY (custid) REFERENCES CUSTOMER(custid));

SYNCHRONOUS WRITETHROUGH (SWT)緩存集合

SYNCHRONOUS WRITETHROUGH (SWT)緩存集合將進行強制執行:把TimesTen中被更新的緩存數據傳送到Oracle。當使用CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP語句創建SWT緩存集合時,在創建緩存集合之後,緩存集合中的內容必須手動從Oracle表加載。SWT緩存集合的內容可以在需要時進行手動加載、卸載或刷新。

對SWT緩存集合的更新將被同步提交。當應用提交一個事務時,在它提交到TimesTen之前先被提交到Oracle。應用將被鎖定,並且表中的行也同進被鎖定,直到事務完成到TimesTen的提交。

如果到Oracle的事務提交失敗,則到TimesTen的事務提交必須被回滾。如果Oracle事務成功但TimesTen事務失敗,則緩存集合的數據將與Oracle數據不同步。如果產生這種情況,必須手動將緩存集合與Oracle重同步。這可能通過調用ttCachePropagateFlagSet程序先停止到Oracle的數據傳遞,然後重新應用此事務到TimesTen緩存集合。作爲另一選擇,也可以重新從Oracle加載數據。

圖 3.2 顯示一個SYNCHRONOUS WRITETHROUGH緩存集合。

3.2 SYNCHRONOUS WRITETHROUGH緩存集合

clip_image024

使用SWT緩存集合的限制

當使用SWT緩存集合時,有如下限期完成:

• 緩存集合和其中的表屬性中,可以使用UNIQUE HASH ON和ON DELETE CASCADE屬性。

• 不允許使用手動FLUSH操作。

• 在此類型的緩存集合定義中不能顯示使用WHERE子句。

• TRUNCATE TABLE語句不能應用到緩存集合的表中。

示例:創建SWT緩存集合

此示例爲一單獨Oracle表vendor創建一個SYNCHRONOUS WRITETHROUGH緩存集合,名爲vendors。在緩存集合中的vendor表的更新將自動傳送到Oracle。

CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP vendors

FROM

user1.vendor (vendor_id INTEGER NOT NULL,

vendor_name VARCHAR2(100) NOT NULL,

contact_name VARCHAR2(100) NOT NULL,

phone VARCHAR2(15),

street VARCHAR2(100),

city VARCHAR2(30),

state VARCHAR2(30),

zip VARCHAR2(10),

PRIMARY KEY(vendor_id));

ASYNCHRONOUS WRITETHROUGH (AWT)緩存集合

ASYNCHRONOUS WRITETHROUGH (AWT)緩存集合與SWT緩恥集合一樣強制執行同樣的操作:更新TimesTen中的緩存數據,並傳送到Oracle。AWT緩存集合可以提供比SWT緩存集合理快的時間響應,因爲TimesTen提交的產生與Oracle的提交不同步。這就允許應用持續執行,而不必等待Oracle事務的提交完成。而且也可在Oracle數據庫關閉後更新AWT緩存集合。當Oracle數據庫返回到操作時,此更新將被應用到Oracle數據庫。

圖 3.3 顯示TimesTen緩存集合的更新被異步複製到Oracle。

3.3 ASYNCHRONOUS WRITETHROUGH緩存集合

clip_image026

AWT緩存集合要求包含此緩存集合的數據存儲的緩存代理和複製代理都要啓動。緩存代理可能加載和刷新緩存內容。緩存代理不必運行卸載此緩存。

AWT緩存集合通過CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP語句創建。

爲了使用AWT緩存集合,必須有相應的Oracle權限,並在啓動緩存代理和複製代理之前使用ttCacheUidPwdSet程序設置緩存管理用戶ID和口令。

當使用AWT緩存集合時,提交到TimesTen和Oracle的事務是異步的。所以當更新提交到Oracle時,應用不一定可靠。

AWT緩存集合能保證什麼

AWT緩存集合可以如下保證:

• 不會因爲TimesTen和Oracle這間的通信失敗而丟失事務。

– 如果複製代理丟失到Oracle的連接,則在代理可能連接到Oracle之後,AWT將重新啓動。

– 如果數據存儲上的複製代理與緩存集合一起關閉,則代理將從備份重新開始並再次啓動事務。

• 對於一個單獨TimesTen數據存儲被提交的事務被提交到Oracle的順序與被提交到TimesTen的順序相同。

• 如果到Oracle的事務失敗,則失敗將被報告在dataStoreName.awterr錯誤文件中。

AWT緩存集合不能保證什麼

AWT緩存集合不能保證:

• 所有在TimesTen中執行的事務都將被應用到Oracle。Oracle上執行錯誤將引起整個事務被回滾。例如,可能因爲違反唯一約束而引起Oracle上的插入失敗。產生執行錯誤的事務將不會再試。

• 要絕對保證Oracle的更新順序,因爲AWT不能解決更新衝突。這兒有一些例子:

– 一行首先被更新到一個AWT表並被提交。然後一些被更新的行通過Oracle傳送操作並提交。AWT代理最後應用到此行的第一次更新並重新覆蓋傳送操作。

– 在兩個獨立的數據存儲中(DS1, DS2),都有一個擁有相同Oracle基表的AWT表。一行在DS1中被更新並提交。一行在DS2中被更新並提交。因爲緩存集合的動作是異步的,DS2中的更新也許先於DS1中的更新應用到Oracle數據庫,結果是DS1中的更新覆蓋DS2中的更新。

使用AWT緩存集合的限制

關於SWT緩存集合的限制討論也適用於AWT緩存集合:

• 緩存集合和表的屬性可以使用UNIQUE HASH ON和ON DELETE CASCADE屬性。

• 不允許使用手動FLUSH操作。

• WHERE子句不能出現在此類型的緩存集合的表定義中。

• TRUNCATE TABLE語句不能應用於緩存集合的表中。

• AWT緩存表中的VARCHAR2、NVARCHAR2、VARBINARY和TT_VARCHAR列必須限制爲256K字節。

下面是隻對AWT緩存集合適用的另外限制:

• 在AWT緩存集合中數據存儲路徑名的最大長度不能超過248字符。

• 在傳送更新到Oracle的過程中產生的錯誤和警告,將記錄在一個特殊的錯誤文件中,並且在提交到TimesTen以後都可以一直報告。

• AWT緩存集合不允許使用在日誌被關閉的數據存儲中(Logging=0)。

• 在創建或刪除AWT緩存集合之前,必須停止複製代理。

• 在複製代理啓動之前,更新將不會從TimesTen傳送到Oracle。

• 在Oracle上的更新衝突將不會被發覺並解決。當從TimesTen傳送更新時將覆蓋直接到Oracle基表的更新。

• 與單一條相關的SQL語句的約束檢查將立即進行。例如,假設在一個AWT表中有一個唯一索引integer字段。有10條記錄,並且此字段的值的範圍是從1到10。發佈一條增加此字段的更新語句。此語句在TimesTen中成功,但當應用到Oracle時很可能失敗。原因就是TimesTen在語句結束之後檢查此唯一索引約束,但當更新應用到Oracle時,此約束是在每一行都被更新之後進行檢查。所以當值爲1的記錄被設置爲2時,它將與此字段已經爲2的其它行發生衝突。

• 在一個返回twosafe服務的複製計劃中不能包含AWT緩存集合。

示例:創建一個AWT緩存集合

此示例爲一單獨表customer創建一個ASYNCHRONOUS WRITETHROUGH緩存集合,名爲customers

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP customers

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

PRIMARY KEY(custid));

爲AWT創建Oracle對象

TimesTen需要在Oracle中創建一個狀態表來支持AWT。此表用來跟蹤狀態和最近應用到Oracle的事務。此表由CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP語句自動創建。作爲選擇,也可以在創建AWT緩存集合之前,手工創建此Oracle表。

設置AWT緩存集合

當設置AWT緩存集合時,執行下列任務:

1. 設置緩存管理用戶ID和口令。

通過使用ttCacheUidPwdSet內部程序或使用帶有-cacheUidPwdSet選項的ttAdmin工具來設置緩存管理用戶ID和口令。

緩存管理用戶將應用更新到Oracle。所以緩存管理用戶帳號必須擁有相應的Oracle權限。

對於每個數據存儲,緩存管理用戶ID和口令只需設置一次。如果數據存儲被覆蓋或被破壞,則必須重新設置緩存管理用戶ID和口令。

2. 創建AWT緩存集合。

使用CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP SQL語句。

3. 啓動緩存代理。

4. 啓動複製代理。

創建AWT緩存集合時將自動創建複製計劃以允許數據存儲與Oracle數據庫進行通信。此複製計劃完全由TimesTen管理,並不需要用戶干涉。當使用DROP CACHE GROUP來刪除AWT緩存集合時,此複製計劃也將被刪除。

在加載緩存集合之前,不必啓動複製代理,但是如果複製代理已經首先啓動,最好讓它執行完畢。

5. 加載緩存集合。

使用LOAD CACHE GROUP語句。

USERMANAGED緩存集合

如果系統管理緩存集合(READONLY、AWT和SWT)不適合工作需要,可以使用CREATE USERMANAGED CACHE GROUP語句來創建緩存集合以實現自定義緩存操作:

• 可以通過設置AUTOREFRESH和PROPAGATE屬性來定義USERMANAGED緩存集合在Oracle和TimesTen之間進行自動刷新和傳送更新。兩個屬性同時設置以激活雙向傳送,這樣就可以在兩者之間通過互相傳送即可以更新TimesTen,又可更新Oracle。

• 可以使用SQL語句來控制Oracle和TimesTen之間的數據傳送。例如,可以:

– 在應用中使用FLUSH CACHE GROUP SQL語句來將TimesTen緩存集合中的更新發送至Oracle。

– 使用LOAD CACHE GROUP或REFRESH CACHE GROUP語句來將Oracle中的更新加載或刷新到TimesTen緩存中。

• 可能通過使用UNLOAD CACHE GROUP語句從用戶管理緩存集合中刪除所有數據或選擇的數據。

• 可以在用戶管理緩存集合中爲每個表指定PROPAGATE或READONLY屬性,以在表級上定義可寫或只讀操作。

示例:創建USERMANAGED緩存集合

這部分顯示使用EATE USERMANAGED CACHE GROUP語句創建自定義緩存集合的一些示例。

例 3.1 此例爲一單獨表customer創建一個USERMANAGED緩存集合,名爲update_anywhere_customerscustomer表中的更新通過“雙向”彼此傳送來更新TimesTen或Oracle。圖 3.4 顯示update_anywhere_customers USERMANAGED緩存集合。

3.4 簡單USERMANAGED緩存集合

clip_image028

在此例中,設置了AUTOREFRESH屬性,以使此緩存集合可以每隔30秒從Oracle進行增量更新。用戶是user1。表中描述的PROPAGATE屬性顯示TimesTen緩存中的customer表的更新將被傳送到Oracle:

CREATE USERMANAGED CACHE GROUP update_anywhere_customers

AUTOREFRESH

MODE INCREMENTAL

INTERVAL 30 SECONDS

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

PRIMARY KEY(custid),

PROPAGATE);

例 3.2 此例創建一個USERMANAGED緩存集合,名爲western_customers,包含四個相關聯的表:customerordertaborder_detailscust_interest。圖 3.5 顯示此緩存集合和它的表。

3.5 複雜USERMANAGED緩存集合

clip_image030

western_customers緩存集合中的每個表都有一個主鍵。緩存集合中的表通過關聯的外鍵相互連接。customer表爲根表,所以在緩存集合它不能引用其它表。根表包含一條WHERE子句以限制緩存中表的行數。

指定了PROPAGATE屬性,以使緩存中表的任何變化在提交時將被自動傳送到相應的Oracle表。

CREATE USERMANAGED CACHE GROUP western_customers

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

region VARCHAR2(10),

PRIMARY KEY(custid),

PROPAGATE)

WHERE (customer.region = 'Western'),

user1.ordertab(orderid NUMBER NOT NULL,

custid INTEGER NOT NULL,

PRIMARY KEY (orderid),

FOREIGN KEY (custid) REFERENCES customer(custid),

PROPAGATE),

user1.order_details(orderid NUMBER NOT NULL,

itemit NUMBER NOT NULL,

quantity NUMBER NOT NULL,

PRIMARY KEY (orderid, itemid),

FOREIGN KEY (orderid) REFERENCES ordertab(orderid),

PROPAGATE),

user1.cust_interest(custid INTEGER NOT NULL,

interest VARCHAR2(10) NOT NULL,

PRIMARY KEY (custid, interest),

FOREIGN KEY (custid) REFERENCES customer(custid),

PROPAGATE);

定義緩存集合和表屬性

下表總結可用於CREATE CACHE GROUP語句的屬性。

表 3.2 總結AUTOREFRESH緩存集合屬性。

表 3.3 列出了可應用於緩存集合中單個表定義的屬性。

表 3.2 完整緩存集合的屬性

緩存集合屬性

AUTOREFRESH

將Oracle表中產生的更新變化自動應用到TimesTen緩存。此屬性可以在READONLY和USERMANAGED緩存集合中設置。

表 3.3 緩存集合中表的屬性

緩存表屬性

UNIQUE HASH ON

爲被創建的表指定一個哈希索引。可以爲任何類型緩存集合中的表進行設置。

PROPAGATE

在提交時自動地將緩存表中的更新傳送到相應的Oracle表。只能爲USERMANAGED緩存類型中的表進行設置。

READONLY

指定緩存集合中的表不能更新到TimesTen。只能爲USERMANAGED緩存集合中的表進行設置。

ON DELETE CASCADE

指定當包含被引用鍵的值從父表中刪除時,子表中依靠外鍵連接的行也要被刪除。可以爲任何類型的緩存集合中的表進行設置。限制:

• 使用PROPAGATE屬性的緩存集合表。

• SWT和AWT緩存集合表。

AUTOREFRESH緩存集合屬性

AUTOREFRESH屬性是READONLY和USERMANAGED緩存集合的一個選項屬性。

AUTOREFRESH自動將Oracle表中的變化應用到TimesTen緩存。

TimesTen支持兩種AUTOREFRESH模式:

• FULL:通過卸載內容然後再從Oracle表重新加載來刷新整個緩存集合。

• INCREMENTAL:Oracle跟蹤更新情況並週期性地只更新Oracle中已經變化行到緩存集合中。此模式將使用Oracle中的專用對象來跟蹤變化情況。

缺省值:

• AUTOREFRESH MODE了爲 INCREMENTAL。

• AUTOREFRESH STATE 爲 PAUSED。

• AUTOREFRESH INTERVAL 值爲5 MINUTES。

緩存集合使用相同的自動刷新間隔在相同的時間被刷新。

AUTOREFRESH 以 INCREMENTAL模式對於Oracle中的每個更新將產生一些額外的花銷來刷新緩存集合。而使用AUTOREFRESH 和 FULL模式時則沒有額外的花銷。

在使用AUTOREFRESH屬性創建緩存集合之前,要使用ttCacheUidPwdSet內部程序或帶有-cacheUidPwdSet選項的ttAdmin工具來設置緩存管理用戶ID和口令。緩存管理用戶將在Oracle上創建一觸發器,所以它必須擁有使用AUTOREFRESH屬性的READONLY緩存集合和USERMANAGED緩存集合相應的Oracle權限。

對於每個數據存儲,緩存管理用戶ID和口令只需要設置一次。如果數據存儲被覆蓋或破壞,則必須重新設置緩存管理用戶ID和口令。

指定AUTOREFRESH緩存集合屬性

當使用CREATE CACHE GROUP語句創建緩存集合時,可以指定AUTOREFRESH。在創建緩存集合之後,可以使用ALTER CACHE GROUP來改變MODE、STATE和INTERVAL的設置。ALTER CACHE GROUP語句不能用於沒有使用AUTOREFRESH 屬性創建的緩存集合。

AUTOREFRESH產生的頻率將取決於INTERVAL值。可以使用CREATE CACHE GROUP 或ALTER CACHE GROUP語句來設置AUTOREFRESH STATE爲ON、OFF或PAUSED。當提交STATE設置爲ON的事務時,AUTOREFRESH將由TimesTen管理。

當STATE被設置爲OFF時,到Oracle表的更新將不會被捕獲或記錄。當狀態爲PAUSED時,Oracle表中的更新將被捕獲並記錄在Oracle中,但不會應用到TimesTen緩存集合的表中。

當一個AUTOREFRESH操作在處理中,並且試圖將STATE改變爲OFF或刪除緩存集合時:

• 如果LockWait普通連接屬性大於0,則AUTOREFRESH操作將停止。ALTER CACHE GROUP SET AUTOREFRESH STATE OFF 和 DROP CACHE GROUP 語句將優先於AUTOREFRESH操作。

• 如果LockWait普通連接屬性爲0,則AUTOREFRESH操作將繼續。ALTER CACHE GROUP SET AUTOREFRESH STATE OFF 和 DROP CACHE GROUP 語句將失敗,併產生一個鎖定終止錯誤。

當以INCREMENTAL模式使用AUTOREFRESH時,在Oracle中發生的變化將在change log table中進行維護。在確定的環境下,在應用到TimesTen緩存集合之前,事務中的一些記錄可能將從更新日誌表中被清除。如果發生這種情況,Cache Connect to Oracle啓動緩存集合的完全自動更新。

使用AUTOREFRESH的限制

當使用AUTOREFRESH時有如下限制:

• 如果在Oracle基表上使用了TRUNCATE TABLE語句,則增量AUTOREFRESH將不會工作。如果Oracle基表上使用了TRUNCATE,則必須重新設置AUTOREFRESH。使用ALTER CACHE GROUP語句來將AUTOREFRESH STATE設置爲PAUSED,然後手工刷新緩存集合。再發送另一條ALTER CACHE GROUP來將AUTOREFRESH STATE重新設置爲ON。

• 爲了使用AUTOREFRESH特性,緩存集合中的所有表必須指定爲PROPAGATE或READONLY。不能使用NOT PROPAGATE屬性指定AUTOREFRESH。

• 當手工加載或刷新緩存集合時,AUTOREFRESH STATE必須爲PAUSED。

• 當使用LOAD CACHE GROUP語句時,緩存集合必須爲空。

• WHERE 子句中引用的所有字段(列和表)必須完全合法。例如:user.table user.table.column

• 對於AUTOREFRESH的緩存集合的LOAD CACHE GROUP和REFRESH CACHE GROUP語句不能包含WHERE子句。

• 不能在AUTOREFRESH緩存集合中實現LRU老化。

緩存表屬性

這部分包括下列緩存表屬性:

• PROPAGATE

• READONLY

• ON DELETE CASCADE

• UNIQUE HASH ON

PROPAGATE

PROPAGATE屬性只能爲USERMANAGED緩存集合中的表進行指定。但是,這裏討論的傳送操作與同步寫(SWT)緩存集合相似。

PROPAGATE指定在提交時TimesTen緩存集合中表的任何變化將被自動傳送到相應的Oracle表。NOT PROPAGATE將取傳送能力。

如果緩存表使用PROPAGATE屬性定義,到緩存表中的更新在TimesTen提交過程中將被傳送回Oracle。是以同步的方式:

1. 提交首先嚐試到Oracle。如果向Oracle提交失敗,則不會再向TimesTen提交,並且TimesTen事務被作上需要回滾的標記。這種方式,Oracle數據庫不會遺失數據更新。

2. 如果向Oracle提交成功,將嘗試向TimesTen提交。如果向TimesTen提交失敗,將收到一條說明失敗原因的TimesTen錯誤信息。

用戶的操作通過連接到Oracle的應用進行提交。對於用戶的登錄和口令必須指定在DSN中或到TimesTen的連接串中的UIDOraclePWD屬性中。

關於傳送提交到Oracle,必需滿足下列要求:

• 被緩存在TimesTen中的Oracle表的列必須包括此Oracle表中至少一個唯一鍵或主鍵中的所有列。組成唯一鍵或主鍵的列在Oracle必須爲非NULL值的列,並且在TimesTen緩存集合中它們必須申明爲主鍵。

這個要求的目的就是要確保在TimesTen中被更新的行之間和Oracle中原來的數據保持一對一的映射關係。確定此一對一的映射,就不會擔心應用的更新會受到非緩存行的影響。

• 表的緩存版本必須有一個主鍵申明。

缺省地,緩存表使用NOT PROPAGATE屬性被創建,以使表中的更新不會傳送到Oracle。當PROPAGATE被激活時,應用有時候偶爾需要更新緩存表,但不向Oracle提交。使用ttCachePropagateFlagSet內部程序來取消它,然後重新激活傳送。

當傳送被取消時,可以使用FLUSH CACHE GROUP語句來選擇傳送插入並更新到Oracle。

當使用PROPAGATE時有如下限制:

• 如果使用PROPAGATE,它必須爲緩存集合中的所有表進行指定。

• 在同一個緩存集合中,不能同時使用PROPAGATE和READONLY緩存表。

• TimesTen不會檢查衝突以防止覆蓋多個當前到Oracle更新的操作。基於這個原因,更新將分別在TimesTen緩存或Oracle中進行,但不是同時。

• 如果緩存集合的AUTOREFRESH被激活或在AUTOREFRESH緩存集合的拷貝中,不能爲表設置NOT PROPAGATE。

• 在緩存集合被指定爲PROPAGATE之後,就不能再改變此屬性。

注意:對於表使用PROPAGATE屬性的緩存集合,TimesTen將不會檢查向表的插入和更新是否與定義緩存集合時的WHERE子句有無約束。因此不會阻止插入和更新,並且將傳送到Oracle。

READONLY

READONLY表屬性只能爲USERMANAGED緩存集合中的表進行指定。

注意:不要混淆READONLY表屬性和READONLY緩存集合類型。READONLY緩存集合類型包含只讀表,但READONLY表只能顯示地爲USERMANAGED緩存集合指定。

可以爲每個緩存集合表指定READONLY表屬性,以禁止TimesTen應用更新這些表。

下面是使用READONLY表屬性時的限制:

• 如果使用READONLY,它必須爲緩存集合中的所有表進行指定。

• 不能與PROPAGATE表屬性一起指定READONLY表屬性。

ON DELETE CASCADE

當創建緩存集合時,ON DELETE CASCADE表屬性可以爲所有緩存集合類型的表進行指定。也可以爲不在緩存集合中後進行指定。

ON DELETE CASCADE表屬性指定當從父表中刪除包含引用鍵值的行時,通過外鍵相關聯的子表中插也將被刪除。根表是緩存集合中所有其它表的父表。

所有從父表到子表的方式必須是要麼是“刪除”或要麼是“不刪除”。不能父表到子表一些是刪除,而另一些是不刪除。對於子表的刪除方式是指定ON DELETE CASCADE。

下面是使用ON DELETE CASCADE的限制:

• 對於AWT和SWT緩存集合和使用PROPAGATE屬性的緩存集合表,有ON DELETE CASCADE屬性的TimesTen表的外鍵必須是Oracle中有ON DELETE CASCADE屬性的表中的外鍵相的相應的一個子集。在Oracle表上的ON DELETE CASCADE動作應用到TimesTen時將作爲單獨的刪除動作。TimesTen中的ON DELETE CASCADE動作應用到Oracle時將作爲一個級聯操作。

• TimesTen和Oracle之間的外鍵匹配只是在創建緩存集合時強制進行。如果Oracle上的外鍵後來進行過修改,ON DELETE CASCADE將不會正常的工作。

UNIQUE HASH ON

UNIQUE HASH ON屬性可以爲所有緩存集合類型中的表進行指定。也可以爲不在緩存集合中的表進行指定。

UNIQUE HASH ON指定在緩存集合中的一個表上創建一個哈希索引。指定在哈希索引中的列必須同樣是主鍵中的列。

定義緩存集合表

絕大多數緩存集合的基本類型是在TimesTen中緩存一個單一的Oracle表。在一個緩存集合中緩存多個表複雜的多,並要求理解另外的Cache Connect to Oracle概念。

通常情況下,每個被緩存的Oracle表至少有一個主鍵或非空值的唯一索引。另外,在TimesTen緩存集合表中定義的主鍵和唯一索引將與那些Oracle表中的相匹配。例如,如果Oracle表有主鍵或唯一索引列C1C2C3,則相應的TimesTen緩存表中的主鍵也應該有列C1C2C3

可以爲TimesTen緩存表創建任意多個非唯一索引。增加緩存表的索引將提高同樣查詢非緩存TimesTen表的SQL速度。不要創建與Oracle表不匹配唯一索引,因爲將起唯一約束失敗。

注意:Oracle臨時表不能被緩存。

定義一單一的緩存集合表

如下創建一個簡單緩存集合定義來緩存一單一表:

CREATE TYPE CACHE GROUP owner.name

FROM

owner.root_table(column_list,

PRIMARY KEY(primary_key_column_list));

說明:

owner.root_table 是Oracle表或一個Oracle表私有同義詞的擁有者和表名。

column_list 是一個被緩存的表的列清單和它們的數據類型。

primary_key_column_list 是一個組成主鍵的列的清單。

當爲列選擇數據類型時,要考慮Oracle列中的數據類型併爲緩存集合中的表選擇相應的數據類型映射。

例 3.3 圖 3.6 顯示一個單表READONLY緩存集合,名爲target_customers,緩存Oracle表customer。TimesTen緩存集合中的數據是一個更大的存儲在Oracle數據中所有用戶數據集的子集。

3.6 TimesTen中緩存單個Oracle

clip_image032

使用CREATE READONLY CACHE GROUP語句來創建單表緩存集合target_customers

CREATE READONLY CACHE GROUP target_customers

FROM

user1.customer (cust_num NUMBER NOT NULL PRIMARY KEY,

region VARCHAR2(5) NOT NULL,

name VARCHAR2(80),

address VARCHAR2(255) NOT NULL);

定義多個緩存集合表

如果多個Oracle表被緩存在同一個緩存集合中,必須定義一個根表和多個子表。在一個緩存集合中只能有一個根表。

在有多表的緩存集合中,緩存集合中的每個子表必須通過外鍵約束與緩存集合中的根表或另一個子表相關聯。儘管在TimesTen中緩存集合中的表必須通過外鍵約束關聯,但在Oracle實例中,這些表不一定要關聯起來。緩存集合中的根表不能通過外鍵約束引用緩存集合中另外的任何表。緩存集合中另外所有表都是子表。

每個表的定義必須包含一個主鍵。每個子表也必須包括一個引用到它父表主鍵的外鍵。緩存集合中表層次可以指定子表到父表或其它子表,但緩存集合中的表不能是一個在此緩存集合中有多個父表的子表。參閱圖 3.7 關於一個正確緩存集合表配置的示例。圖 3.8 顯示一個不正確的表配置,圖 3.9 顯示如何工作來解決問題。

必須在緩存集合中爲每個將被包括在緩存中的Oracle表創建單獨的表定義。定義在緩存集合中的表的所有者和名稱必須與Oracle表的所有者和名稱相匹配。可以創建一個表定義來緩存Oracle表中列的所有數據或它的一個子集。

注意:每個Oracle表可以只被定義在一個緩存集合中。不能創建多個緩存集合來緩存相同的Oracle表。

例 3.4 創建一簡單緩存集合定義來緩存一個根表和一個子表如下:

CREATE TYPE CACHE GROUP owner.name

FROM

owner.root_table(column_list,

PRIMARY KEY(primary_key_column_list)),

owner.child_table(column_list,

PRIMARY KEY(primary_key_column_list),

FOREIGN KEY(reference_column_list)

REFERENCES owner.root_table(primary_key_column_list));

說明:

owner.root_table 是Oracle表或Oracle表的私有同義詞的所有者和表名。

owner.child_table 是Oracle表或Oracle表的私有同義詞的所有者和表名。

column_list 是一個被緩存表中的列清單。

primary_key_column_list 是一個組成主鍵的列的清單。

reference_column_list 是一個child_table中引用一個外鍵的列的清單。

圖 3.7 顯示先前顯示在圖 3.6中的target_customers緩存集合的多表版本。

3.7 多表緩存集合

clip_image034

在此例中,緩存集合被擴展到緩存三個Oracle表:customerordersorder_item。緩存集合中的數據是一個更大的存儲在Oracle數據庫中所有用戶數據集的一個子集。target_customers緩存集合中的每個父表有一個主鍵(顯示爲粗體),通過一個相關的外鍵(顯示爲箭頭)被子表引用。表customer是根表,它不能緩存集合中任何另外的表。customer表的主鍵是對於target_customers緩存集合的主鍵。ordersorder_item表是子表。

例 3.5 使用CREATE READONLY CACHE GROUP語句來創建target_customers多表緩存集合:

CREATE READONLY CACHE GROUP target_customers

FROM

user1.customer (cust_num NUMBER NOT NULL PRIMARY KEY,

region VARCHAR2(10) NOT NULL,

name VARCHAR2(80),

address VARCHAR2(255) NOT NULL),

user1.orders (ord_num NUMBER NOT NULL PRIMARY KEY,

cust_num NUMBER NOT NULL,

when_placed TIMESTAMP NOT NULL,

when_shipped TIMESTAMP,

FOREIGN KEY (cust_num) REFERENCES user1.customer (cust_num)),

user1.order_item (ord_num NUMBER NOT NULL,

prod_num NUMBER NOT NULL,

quantity NUMBER NOT NULL,

PRIMARY KEY (ord_num, prod_num),

FOREIGN KEY (ord_num) REFERENCES user1.orders (ord_num));

圖igure 3.8 顯示緩存集合中不正確的表配置。

3.8 問題:兩個根表

clip_image036

不能在擁有customerordersorder_item表的同一個緩存集合中定義productsinventory表。這是因爲products表沒有引用(直接或間接)到根表customer的外鍵。這就意謂着products表也被認爲是一個根表,因爲一個緩存集合不能同時擁有多個根表,因此無效。

爲了緩存所有表,可以爲productsinventory表創建第二個緩存集合,如圖 3.9所示。

3.9 解決:兩個獨立的緩存集合

clip_image038

緩存Oracle分區表

當緩存常規Oracle表時,可以在緩存集合中根據規則規定定義Oracle分區表。例如,在只讀緩存集合中的分區表在Oracle中必須有一個相應的唯一非NULL值索引。用於緩存集合的分區表可以是任何樣式(哈希、列表、排列或合成)的分區或子分區表。

下面是緩存Oracle分區表時的限制:

• 除非有數據丟失,在分區上的DDL操作不會影響緩存集合。例如,如果一個分區的數據被截短,AUTOREFRESH不會從相應的緩存表中刪除數據。

• 緩存集合中的WHERE子句操作不引用單獨的分區或子分區。例如,試圖定義下列分區表user1.partitioned_table,將返回一個錯誤:

CREATE READONLY CACHE GROUP badcachegroup

FROM

user1.partitioned_table(ii NUMBER NOT NULL PRIMARY KEY, jj NUMBER)

WHERE ii IN (SELECT ii

FROM user1.partitioned_table PARTITION(F200402));

注意:在離線分區上試圖緩存操作(如LOAD CACHE GROUP、UNLOAD

CACHE GROUP或REFRESH CACHE GROUP)將導致ORA-00376或ORA-01110錯誤。但是,如果分區將離線(如在一個備份操作期間),則不會產生錯誤,除非這時試圖訪問分區。

關於Oracle同義詞

一個定義在緩存集合中的表可以引用Oracle其表的私有的Oracle同義詞。實際的Oracle基表可以存在於另一個Oracle帳號中,並有一個不同的名稱,但作爲同義詞它必須駐留在同一個Oracle服務器上。緩存集合中的表名必須是私有同義詞名稱,但同義詞可以指向另一個公有或私有的同義詞。同義詞最終必須指向(直接或間接)一個表、分區表或物化視圖。

包含爲Oracle同義詞的表定義的緩存集合可以是一個USERMANAGED、SWT或AWT緩存集合。USERMANAGED緩存集合支持LOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUP和FLUSH CACHE GROUP 操作,但不能使用AUTOREFRESH或READONLY屬性配置此緩存集合。不能在READONLY緩存集合中爲Oracle同義詞定義表。

使用WHERE子句

在使用CREATE CACHE GROUP語句爲用戶管理和READONLY緩存集合中的表的定義可以包含一條WHERE子句來指定搜索條件來將Oracle數據拷貝到緩存中。

另外,可以在LOAD CACHE GROUP、UNLOAD CACHE GROUP、MERGE和FLUSH CACHE GROUP語句中指定WHERE子句。一些語句,如LOAD CACHE GROUP和REFRESH CACHE GROUP,將導致連接的WHERE子句中緩存集合中的WHERE子句將先於語句中的WHERE進行計算。所有的WHERE子句將通過TimesTen解析。不要使用TimesTen不支持的Oracle SQL語法。

例 3.6 此例創建一個名爲western_customers的緩存集合,指定一條WHERE子句來從Oracle表customer中只緩存那些西部地區中有郵政編碼的用戶的相關數據:

CREATE USERMANAGED CACHE GROUP western_customers

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR(2100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

region VARCHAR2(10),

PRIMARY KEY(custid),PROPAGATE)

WHERE (user1.customer.region = 'Western');

然後在LOAD CACHE GROUP語句中指定另外一條WHERE子句來只緩存來自西部地區的ID小於或等於100的用戶:

LOAD CACHE GROUP western_customers WHERE (custid <= 100)

COMMIT EVERY 256 ROWS;

CREATE CACHE GROUP和LOAD CACHE GROUP 語句中的WHERE子句,在數據被加載到緩存集合之前,在Oracle上進行計算。

表 3.4 顯示LOAD CACHE GROUP, UNLOAD CACHE GROUP、REFRESH CACHE GROUP和FLUSH CACHE GROUP語句的WHERE子句是否在TimesTen、Oracle或兩者上都要計算。如果CREATE CACHE GROUP語句也包含一條WHERE子句,此表顯示在Oracle上計算的另外的WHERE子句。

表 3.4 WHERE子句的計算

SQL語句

語句的WHERE子句的計算處...

CREATE CACHE

GROUP WHERE 子句計算處...

LOAD

Oracle

Oracle

UNLOAD

TimesTen

-

REFRESH

TimesTen和Oracle

Oracle

FLUSH

TimesTen

-

表 3.5 顯示對每一條SQL語句的WHERE子句是否只由TimesTen或同時由TimesTen和Oracle解析。

表 3.5 WHERE子句解析

SQL語句

TimesTen解析

Oracle解析

LOAD

Yes

Yes

UNLOAD

Yes

No

REFRESH

Yes

Yes

FLUSH

Yes

No

CREATE

Yes

Yes

與詳細日誌一起,所有面對Oracle執行的SQL語句將記錄在Oracle服務器日誌中。查看此日誌以更好的理解緩存集合操作的機制和執行。

下面是Cache Connect to Oracle使用WHERE子句的限制:

• CREATE CACHE GROUP語句中的WHERE子句不能指定子查詢,所以它們不能引用任何當前的其它表。LOAD CACHE GROUP, UNLOAD CACHE GROUP、REFRESH CACHE GROUP和FLUSH CACHE GROUP語句中的WHERE子句可以指定子查詢。

• WHERE子句不能包含Oracle PARTITION擴展名。

• LOAD CACHE GROUP、REFRESH CACHE GROUP、FLUSH CACHE GROUP語句(表和同義詞)中的WHERE子句只可以引用根表,除非WHERE子句包含一個子查詢。

• 當創建一個多表緩存集合時,所有WHERE子句中的列名必須合法,如:user.table.column

WHERE子句中本地中立性

在緩存集合和Oracle Database之間的操作將繼承此會話中使用的TimesTen全球支持的連接屬性值。這些操作包括傳送、加載、刷新、更新和同步寫。

不直接與指定用戶會話相關聯的緩存集合操作將缺省使用全球支持的連接屬性設置。這些操作包括自動刷新、老化和異步寫。例如,這此操作使用BINARY作爲NLS_SORT的值。

如果緩存集合操作使用了與全球支持的連接屬性不同的值,將產生矛盾。例如,考慮下面的語句:

CREATE CACHE GROUP cachegroup1 FROM table1(

column1 NUMBER NOT NULL PRIMARY KEY,

column2 NCHAR(30))

WHERE column2 < 'string';

WHERE子句中的字符串將使用這些字符的二進制值來進行比較。這將在基於本地組裝緩存集合表時,可能導致非預期結果。

爲了保證WHERE子句中的字符串使用它們語言學的值來進行比較,使用CREATE CACHE GROUP語句時使用一條與面相似的WHERE子句:

CREATE CACHE GROUP cachegroup1 FROM table1(

column1 NUMBER NOT NULL PRIMARY KEY,

column2 NCHAR(30))

WHERE

NLSSORT(column2,'NLS_SORT=TCHINESE_RADICAL')

< NLSSORT('string','NLS_SORT=TCHINESE_RADICAL');

在緩存集合中實現老化

可以爲緩存集合中的根表定義一個老化性質。老化性質引用老化類型和老化屬性,也就是老化狀態(ON或OFF)。可以指定下列之一的老化類型:基於使用基於時間基於使用老化將刪除指定數據存儲使用範圍內最近使用過(LRU)的數據。基於時間老化將根據指定的數據生存期和老化處理頻率來刪除數據。在相同的數據存儲中,可以在同一個數據存儲定義基於使用基於時間的老化,但在指定的緩存集合或表中只能定義一種老化類型。

CREATE CACHE GROUP語句中使用表定義來爲新緩存集合的根表指定一個老化性質。如果表中沒有定義老化性質,可以使用ALTER TABLE語句來爲已存在的緩存集合中的根表增加老化性質。可以通過先刪除老化性質然後再添加老化性質來改變老化性質。

老化性質只能定義在緩存集合的根表上,因爲老化是基於緩存實例的。

可以爲那些沒在緩存集合中的表定義老化性質。

基於使用老化

基於使用老化將保證在指定的極限範圍內通過刪除最近使用過(LRU)的數據來保持數據存儲中可使用內存的大小。LRU老化可用於除了使用AUTOREFRESH屬性的緩存集合以外的所有類型的緩存集合。

通過在CREATE CACHE GROUP語句中的表定義中使用AGING LRU子句來爲一個緩存集合定義LRU老化。如果狀態是ON,老化將自動開始。如果根表是數據存儲中第一個擁有LRU老化性質定義的表,老化將立即開始。否則,老化將在已有LRU老化性質定義的表上發生老化時在根表上同時發生。

使用ttAgingLRUConfig內部程序來爲數據存儲中的所有表指定LRU老化屬性。此屬性將應用到有LRU老化性質的數據存儲中所有的表。如果不調用ttAgingLRUConfig內部程序,則將使用屬性的缺省值。

下表總結LRU老化屬性:

LRU老化屬性

描述

LowUsageThreshhold

LRU老化被解除時數據存儲PermSize的百分比。

HighUsageThreshhold

LRU老化激活時數據存儲PermSize的百分比。

AgingCycle

在兩個老化週期之間的分鐘數。

在定義LRU老化性質之後,如果爲AgingCycle設置了一個新值,老化的產生將基於當前時間和新的週期。例如,如果原來的週期是15分鐘,並且LRU在10分鐘之前已經產生,則老化預計將在5分鐘之後再次發生。但是,如果將AgingCycle參數改變爲30分鐘,則老化將從使用新的AgingCycle值調用ttAgingLRUConfig程序之時起30分鐘後發生。

如果自從上一次老化週期後一行被訪問或引用,它就不符合LRU老化的條件。如果下列之一爲真時,行就認爲被訪問或引用過:

• 行被用來建立一條SELECT語句的結果集。

• 行已經作上被更新或刪除的標記。

• 行被用來建立一條INSERT SELECT語句的結果集。

使用ALTER TABLE語句來執行下列任務:

• 通過在緩存集合的根表上使用帶有SET AGING {ON|OFF}子句的ALTER TABLE語句來激活或非激活老化狀態。

• 通過使用帶有ADD AGING LRU [ON|OFF]子句的ALTER TABLE語句來在爲已存在的根表增加一LRU老化性質。

• 通過使用帶有DROP AGING子句的ALTER TABLE語句來刪除根表上的老化。

使用ttAgingScheduleNow內部程序來確定老化的開始。

爲了將緩存集合的老化從LRU改變爲基於時間,首先使用帶有DROP AGING子句的ALTER TABLE語句來刪除根表上的老化。然後通過使用帶有ADD AGING USE子句的ALTER TABLE語句來爲根表增加基於時間的老化。

基於時間老化

基於時間老化將根據指定的數據生存期和老化處理頻率從緩存集合的根表中刪除數據。在CREATE CACHE GROUP語句的表定義中的AGING USE子句中定義基於時間的老化。使用帶有AGING USE子句的ALTER TABLE語句來爲已存在緩存集合中的根表增加一基於時間的老化性質。

AGING USE子句有一個ColumnName參數。ColumnName是用於基於時間老化的列的名稱。作爲簡化,稱呼此列爲timestamp列。timestamp列必須定義如下:

• TIMESTAMP或DATE數據類型

• NOT NULL

應用將更新timestamp列的值。如果此列的值對於某些行來說是未知的,並且不想這些行被老化,則使用一個較大的缺省值來定義此例。可以在timestamp列上創建一個索引,以提高老化處理的執行速度。

注意:不能在已存在的表中增加或修改一個列,然後將它用作timestamp列,因爲不能增加或修改一個列並定義它爲NOT NULL。

不能從已經有基於時間老化性質的表中刪除timestamp列。

在CREATE CACHE GROUP語句中的LIFETIME子句中以days、hours或minutes指定生存期。

timestamp列中的值將從SYSDATE中被減去。被截短的結果使用指定單位(minute、hour、day),並與指定的LIFETIME值進行比較。如果結果大於LIFETIME值,則行將成爲老化的候選行。

使用CYCLE子句來指定系統檢查行的週期以刪除超過指定的生存期的數據。如果沒有指定CYCLE,則每隔五分鐘產生一次老化。如果指定CYCLE爲0,則老化將持續產生。如果狀態爲ON,老化將自動開始。

使用ALTER TABLE語句來執行下列任務:

•通過使用SET AGING {ON|OFF}子句來在使用基於時間老化性質的根表上激活或非激活老化狀態。

• 通過使用SET AGING CYCLE子句來在使用基於時間老化性質的根表上改變老化週期。

• 通過使用SET AGING LIFETIME子句來改變根表中生存期。

• 通過使用ADD AGING USE子句來爲沒有老化性質的已存在的根表增加基於時間老化。

• 通過使用DROP AGING子句來刪除根表上的老化。

當老化開始時使用ttAgingScheduleNow內部程序來安排時序。

爲了將緩存集合的老化從基於時間改爲LRU,首先刪除根表上的老化。然後使用帶有ADD AGING LRU子句的ALTER TABLE語句來爲根表增加LRU老化。

注意:如果要改變AUTOREFRESH緩存集合根表的屬性,必須停止緩存代理。在AUTOREFRESH 緩存集合中增加、改變或刪除老化之前,停止緩存代理。

老化和外鍵

通過外鍵關聯的表必須擁有相同的老化性質。

如果LRU老化在起作用過程中並且子表中的行最近被訪問過,則不管是父表還是子表中的行都將被刪除。

如果基於時間老化在起作用過程中並且父表中的行已成爲老化候選行,則父行和它所有的子行都將被刪除。

如果表的ON DELETE CASCADE被激活,則將忽略此設置。

老化開始時的時序安排

使用ttAgingScheduleNow內部程序來安排老化過程的時序。一旦調用內部程序老化過程就立即開始,除非已經有一個老化過程正在進行中,這種情況下,當進行中的老化完成時,新的老化才能開始。

當調用ttAgingScheduleNow時,老化過程將啓動,而不管狀態是否是ON或OFF。當調用ttAgingScheduleNow時要指定根表的名稱。否則ttAgingScheduleNow將在數據存儲中有老化定義的所有表上啓動或重新啓動老化,而不僅僅是緩存集合的根表。

老化過程的啓動只是作爲調用ttAgingScheduleNow的結果。調用ttAgingScheduleNow不會改變老化的狀態。當調用ttAgingScheduleNow時如果老化的狀態是OFF,則老化過程將開始,但在過程完成後它不會持續。爲了繼續老化,必須再次調用ttAgingScheduleNow或將老化狀態改爲ON。

如果老化狀態已經設置爲ON,則ttAgingScheduleNow將根據調用ttAgingScheduleNow的時間來重新設置老化週期。

可以控制老化行爲。首先通過使用帶有SET AGING OFF子句的ALTER TABLE語句來非激活老化。然後在期望的時間使用ttAgingScheduleNow來啓動老化。

調用程序時,可以使用ttAgingScheduleNow並通過通過指定表名來爲單一表啓動或重啓老化。如果不指定表名,則ttAgingScheduleNow將啓動或重啓有老化定義的數據存儲中所有表的老化。

可以使用ttTraceMon工具來監視老化。

配置變化窗口

可以使用基於時間老化來完成緩存集合數據變化窗口。在帶有變化窗口的緩存集合中,按照時序規則添加新數據和刪除老數據,以使緩存只保留滿足指定的時間間隔的數據。

可以通過使用增量AUTOREFRESH屬性來爲緩存集合數據配置一變化窗口,並指定基於時間老化性質。AUTOREFRESH操作將在Oracle中檢查timestamp以決定是否將新數據刷新到緩存表中。Oracle和TimesTen的SYSDATE和時區必須一致。

不能爲通過手工加載、顯示加載、刷新或插入數據的其它類型的緩存集合配置變化窗口來將新數據更新到緩存集合表中。

例 3.7 下面的語句使用變化窗口屬性創建一個緩存集合。

CREATE READONLY CACHE GROUP cg1

AUTOREFRESH STATE ON INTERVAL 1 MINUTES

FROM t1(i NUMBER NOT NULL PRIMARY KEY,

ts TIMESTAMP NOT NULL,

c VARCHAR2(50))

AGING USE ts LIFETIME 3 HOURS CYCLE 10 MINUTES;

cg1緩存集合有1分鐘的自動刷新間隔。每一分鐘都會將Oracle表中的新數據更新到緩存集合中。

老化將每10分鐘檢查一次老數據。老化將刪除大於3小時的老數據(ts < SYSDATE - 3 HOURS)。

爲AUTOREFRESH間隔和LIFETIME間隔設置的參數將決定數據將在緩存中保存多長時間。小於完整生存期間隔的數據也可能被老化出緩存。例如,如果AUTOREFRESH間隔是3天,並且LIFETIME間隔爲30天,當數據進入緩存時可能已經存在3天了。因此數據在27天后將從緩存中被刪除。這種情況發生是因爲老化是基於Oracle timestamp而不是基於TimesTen timestamp

使用數據類型和類型模式工作

如果使用Oracle TimesTen In-Memory Database的Cache Connect特性,必須使用Oracle類型模式(TypeMode=0),即使緩存集合是被7.0以前的版本所定義。

如果緩存集合是被7.0以前的版本所定義,使用帶有-convertCGTypes選項的ttMigrate工具來映射數據類型到用於7.0或此後的版本的數據類型。

注意如果應用使用的是本地整數數據類型,並要繼續使用它們,在調用ttMigrate之前,必須改變應用爲指定的TT_INTEGER、TT_SMALLINT、TT_TINYINT和TT_BIGINT。

浮點數據類型

BINARY_FLOAT和BINARY_DOUBLE被傳入到Oracle Database 10g Release 1。Cache Connect支持從Oracle9i到Oracle Database 10g的Oracle客戶端和服務器端。

如果需要使用BINARY_FLOAT或BINARY_DOUBLE數據類型,TimesTen推薦如下配置:

• 使用Oracle Database 10g客戶端和服務器

• 將TimesTen中的BINARY_FLOAT數據映射爲Oracle中BINARY_FLOAT數據

• 將TimesTen中的BINARY_DOUBLE數據映射爲Oracle中的BINARY_DOUBLE數據

可以在Oracle9i和Oracle Database 10g中使用FLOAT(n)。

如果在映射TT_BINARY_FLOAT數據類型爲Oracle的FLOAT(n)時,需要保持內存或提高執行速度,TimesTen推薦Oracle客戶端的版本要與服務器Oracle的版本相同或較低。儘管作爲推薦,也會發生下列情況:

• 在從FLOAT(n) 轉換到BINARY_FLOAT和BINARY_DOUBLE時,會有數據精度的丟擒失。

• 在緩存中當Inf和NaN被定義爲BINARY_FLOAT和BINARY_DOUBLE數據類型時,Inf可能被轉換溢出,NaN可能被轉換爲0。

關於Cache Connect to Oracle數據類型映射

當爲緩存集合表的列選擇數據類型時,要考慮Oracle列的數據類型,併爲緩存集合表中的列選擇等價的數據類型。

主鍵和外鍵列級別要高於非鍵列。對於緩存集合表中的鍵列允許的數據類型映射顯示在表 3.6中。

表 3.6 鍵列中允許的數據類型映射

Oracle數據類型

TimesTen數據類型

NUMBER(p,s)

NUMBER(p,s)

注意:也可以使用DECIMAL(p,s)或NUMERIC(p,s)。它們是NUMBER(p,s)的別名。

NUMBER(p,0)

INTEGER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

INTEGER

NUMBER(p,0)

NUMBER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

NUMBER

CHAR(m)

CHAR(m)

VARCHAR2(m)

VARCHAR2(m)

RAW(m)

VARBINARY(m)

TIMESTAMP(m)

TIMESTAMP(m)

DATE

DATE

NCHAR(m)

NCHAR(m)

NVARCHAR2(m)

NVARCHAR2(m)

表 3.7 顯示關於緩存集合中非鍵列映射的數據類型。

表 3.7 關於非鍵列允許的數據類型映射

Oracle數據類型

TimesTen數據類型

NUMBER(p,s)

NUMBER(p,s)

REAL

FLOAT

BINARY_FLOAT

DOUBLE

BINARY_DOUBLE

NUMBER(p,0)

INTEGER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

INTEGER

NUMBER(p,0)

FLOAT

BINARY_FLOAT

DOUBLE

BINARY_DOUBLE

NUMBER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

NUMBER

REAL

FLOAT

BINARY_FLOAT

DOUBLE

BINARY_DOUBLE

CHAR(m)

CHAR(m)

VARCHAR2(m)

VARCHAR2(m)

RAW(m)

VARBINARY(m)

LONG

VARCHAR2(m)

注意:m可以是爲此數據類型定義的範圍內的任何有效值。

LONG RAW

VARBINARY(m)

注意:m可以是爲此數據類型定義的範圍內的任何有效值。

TIMESTAMP(m)

TIMESTAMP(m)

DATE

DATE

TIMESTAMP(0)

FLOAT(n)

注意:包括DOUBLE PRECISION和FLOAT,等於

FLOAT(126)。也包括REAL,等於FLOAT(63)。

FLOAT(n)

BINARY_DOUBLE

注意:FLOAT(126)可以聲明爲DOUBLE PRECISION。FLOAT(63)可以聲明爲REAL。

BINARY_FLOAT

BINARY_FLOAT

BINARY_DOUBLE

BINARY_DOUBLE

NCHAR(m)

NCHAR(m)

NVARCHAR2(m)

NVARCHAR2(m)

第四章 管理緩存集合

爲緩存集合配置系統

這部分總結將TimesTen主機配置爲Oracle Client並使用Cache Connect to Oracle特性來操作遠程Oracle服務器的指定步驟。

1.在TimesTen主機上安裝Oracle客戶端或Oracle數據庫。Oracle客戶端或數據庫必須在安裝TimesTen之前裝以防止使用Cache Connect特性時會出現問題。

2. 爲特定的操作系統配置環境變更。

3. 安裝TimesTen。

4. 如果打算使用基於Web的Cache Administrator,配置內植的web服務器。

5. 如果在TNSNAMES.ORA文件中定義Oracle Service Names,要使用系統級TNSNAMES.ORA文件。TimesTen的主守護程序、緩存代理、web服務器和複製代理將使用系統級TNSNAMES.ORA文件中提供的信息。不要使用不同的TNSNAMES.ORA文件來配置Oracle客戶端。

注意:TimesTen不支持Oracle Name Server for Windows clients。

在UNIX平臺上配置Cache Connect to Oracle

爲TimesTen用戶環境和啓動TimesTen守護程序(根)的用戶環境設置環境變量:

• 設置ORACLE_HOME環境變量爲Oracle Client安裝目錄的路徑。例如:

$ORACLE_HOME = /oracle/ora10g

• 對於32-位和64-位Oracle/TimesTen安裝應該包括LD_LIBRARY_PATH或SHLIB_PATH環境變更:

$ORACLE_HOME/lib

$ORACLE_HOME/network/lib

install_dir/lib

例如:

LD_LIBRARY_PATH = $ORACLE_HOME/lib:$ORACLE_HOME/network/lib:

/timesten/myinstance/lib

注意:如果使用32-位TimesTen安裝而配置64-位Oracle服務器,則庫路徑是$ORACLE_HOME/lib32。

• PATH環境變量應該包括:

$ORACLE_HOME/bin

install_dir/bin

例如:

PATH = $ORACLE_HOME/bin:/timesten/myinstance/bin

在Window系統中配置Cache Connect to Oracle

必須設置PATH系統環境變量包括:

Oracle_install_dir/bin

install_dir/lib

install_dir/bin

例如:

PATH = C:/Oracle/Ora10g/bin;C:/timesten/myinstance/lib;

C:/timesten/myinstance/bin;

Oracle數據庫中安裝任務

這部分將討論操作Oracle DBA必須使用system帳號在Oracle數據庫上執行。

創建Oracle用戶並設置權限

必須指定一個Oracle用戶和口令以訪問Oracle表和創建緩存集合。所有Oracle用戶帳號必須授予CREATE SESSION權限,以使用Cache Connect to Oracle。一些Cache Connect to Oracle操作要求另外的Oracle用戶權限。

一些Cache Connect to Oracle操作要求一個使用另外Oracle權限的獨立的用戶。因爲可能要求只授予另外緩存管理用戶權限來選擇用戶,所以Cache Connect to Oracle允許創建一個獨立的緩存管理用戶帳號。

關於用於每個Cache Connect to Oracle操作的Oracle用戶和緩存管理用戶最小權限顯示在表 4.1中。對一每個緩存管理用戶的權限必須包括所有Oracle表可以被緩存到數據存儲中,同時Oracle用戶也需要特定的指定在由用戶創建的緩存集合中的Oracle表的權限。參閱例 4.1。

表 4.1 對於緩存集合操作的Oracle權限要求

緩存集合操作

授予Cache Connect to

Oracle用戶的最小權限

授予緩存管理用戶的最小權限

所有操作

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

一個也不需要

CREATE READONLY

CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• UNLIMITED TABLESPACE

(或在表空間上適當的空間引用 )

• CREATE TABLE①

• CREATE ANY TRIGGER①

CREATE

SYNCHRONOUS

WRITETHROUGH

CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

一個也不需要

CREATE

ASYNCHRONOUS

WRITETHROUGH

CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT②

• UPDATE②

• DELETE ②

• QUERY REWRITE③

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

• UNLIMITED TABLESPACE

(或在表空間上適當的空間引用 )

• CREATE TABLE①

CREATE

USERMANAGED CACHE

GROUP(參閱併發行中的變量)

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

一個也不需要

CREATE

USERMANAGED CACHE

GROUP

.....加上 PROPAGATE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

一個也不需要

CREATE

USERMANAGED CACHE

GROUP

.....加上 AUTOREFRESH

INCREMENTAL

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• QUERY REWRITE ③

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• UNLIMITED TABLESPACE

(或在表空間上適當的空間引用 )

• CREATE TABLE①

• CREATE ANY TRIGGER①

LOAD CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

REFRESH CACHE

GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

FLUSH CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT TABLE

• UPDATE TABLE

-

使用Real Application Clusters 進行配置的所有操作

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

在Oracle GV$SESSION上SELECT動態性能視圖

如果Oracle對象是手工安裝的,不要求創建緩存集合

不強從TimesTen執行

只對於Oracle server version 9.2纔要求

4.1 需要爲兩個用戶SamJohn設立權限,使每個用戶可以發送一條CREATE READONLY CACHE GROUP語句來各自創建只讀緩存集合。Sam創建一個緩存Oracle表TTUSER.TABLEA的緩存集合,John創建另一個緩存Oracle TTUSER.TABLEB的緩存集合。

爲了提供SamJohn充足的Oracle權限來CREATE READONLY CACHE GROUP,需要創建兩個Oracle用戶帳號,並且其中一個緩存管理用戶帳號將擁有擴展的權限。緩存管理用戶的名稱爲User2

• oracleUID = Sam

• oracleUID = John

• cacheUid = User2

在Oracle上創建帳號:

SQL> CREATE USER Sam IDENTIFIED BY Samspwd DEFAULT TABLESPACE users;

SQL> CREATE USER John IDENTIFIED BY Johnspwd DEFAULT TABLESPACE users;

SQL> CREATE USER User2 IDENTIFIED BY User2pwd DEFAULT TABLESPACE users;

然後爲每個用戶分配下列權限:

SQL> GRANT CREATE SESSION, SELECT ON TTUSER.TABLEA TO Sam;

SQL> GRANT CREATE SESSION, SELECT ON TTUSER.TABLEB TO John;

SQL> GRANT

> CREATE SESSION,

> SELECT ON TTUSER.TABLEA, TTUSER.TABLEB,

> UNLIMITED TABLESPACE,

> CREATE TABLE,

> CREATE ANY TRIGGER

> TO User2;

SQL>

爲緩存管理用戶創建一個獨立的表空間

TimesTen強烈推薦爲緩存管理用戶創建一個獨立的表空間。此表空間用作緩存管理用戶的缺省表空間。此表空間包含有每個Oracle表的自動刷新觸發器、變化日誌表和其它對於每個緩存集合用戶TimesTen需要的對象。如果不指定一個獨立的表空間,這些對象將放在Oracle system表空間中。

當在Oracle上創建緩存管理用戶時,要指定表空間。也可以創建用戶之後使用Oracle ALTER USER語句的DEFAULT TABLESPACE子句來指定表空間。

4.2 例 4.1 顯示怎樣創建並授權給緩存管理用戶User2。爲了給User2指定一個名爲cacheuser的獨立表空間,在Oracle中輸入下列語句:

SQL> ALTER USER User2 IDENTIFIED BY User2pwd

DEFAULT TABLESPACE cacheuser;

每個緩存的Oracle表的變化日誌表駐留在緩存管理用戶表空間中。對於Oracle表上每次更新,將爲此Oracle表向變化日誌表插入一行(一條變化記錄)。變化日誌記錄的字節大小如下:

變化日誌記錄的大小 = Oracle表上主鍵的大小 + 250

變化日誌表中的記錄數將依賴於Oracle表的更新率和TimesTen上的自動刷新間隔。每隔20秒,TimesTen將刪除已經應用到緩存相關Oracle表的數據存儲的變化日誌記錄。

當緩存管理用戶表空間寫滿時

當緩存管理用戶表空間變寫滿時,自動刷新觸發器將通過刪除已存在的變化日誌記錄來爲新變化日誌記錄產生空間。這將引起一些TimesTen數據存儲上一些表的完全自動刷新。

如果表空間寫滿,檢查如下內容:

• 是否正在創建一個緩存集合或正在複製一個數據存儲?這些臨時操作將停止變化日誌表上的清除操作。

• TimesTen數據存儲上的緩存代理是否正在運行?如果緩存代理沒有運行,變化日誌記錄將堆積。

• 在數據存儲中是否沒有通過刪除自動刷新緩存集合而拋棄的數據存儲?在這種情況下,變化日誌記錄也將堆積。

爲緩存表定義DSN

緩存Oracle數據的數據存儲必須定義爲系統DSN,不能作爲User DSN,如果TimesTen緩存不定義爲System DSN,則TimesTen Cache Administrator就不能進行工作,而且ttAdmin也不能啓動TimesTen緩存代理。

DSN路徑必須是一個絕對值。

當爲了緩存Oracle表創建DSN時,DSN的屬性必須如下設置:

Logging 必須激活爲disk-based。

LockLevel 必須激活row-level locking。(Cache Connect to Oracle不支持database-level locking。)

Isolation 可以是任何isolation模式。

OracleID 必須設置爲Oracle Service Name for Oracle 9i和以後的Oracle版本。

PassThrough 可以設置來控制程序和SQL語句是在本地的TimesTen緩存中執行或是傳遞到Oracle。

DatabaseCharacterSet 必須與Oracle數據庫字符集相同。

TypeMode 必須設置爲0(Oracle)。

下列屬性可以指定爲DSN屬性或作爲連接屬性:

• Oracle User ID指定Oracle用戶ID。此字符串通過設置UID連接屬性來間接指定。相應的UNIX平臺上的DSN屬性是UID。在Window系統中,相應的DSN屬性是User ID。

OraclePWD 爲Oracle用戶指定口令。

用來連接到Oracle的用戶名和口令將從DSN定義的屬性中或ODBC連接串中取出。在連接串中給出的值將覆蓋指定DSN中的值。

例如,可以在ttIsql連接串中指定Oracle UID和OraclePWD

ttIsql -connStr "DSN=cgDSN; UID=testuser; OraclePWD=mypsswrd"

如果通過ODBC應用發送更新並提交,必須在連接串中指定用戶名和口令。例如:

SQLDriverConnect(hdbc, ..., "DSN=cgDSN; UID=testuser;

OraclePWD=mypsswrd", ...);

UNIX平臺上 例如,爲UNIX平臺上的myOraCache定義就如下形式:

[myOraCache]

DataStore=/users/OracleCache/hotData

Authenticate=0

Logging=1

LockLevel=0

PermSize=40

TypeMode=0

DurableCommits=1

OracleID=system1

UID=testuser

OraclePWD=mypsswrd

DatabaseCharacterSet=WE8ISO1559P1

Windowt系統中 在ODBC TimesTen Setup dialog的Oracle Data Loading窗口中指定OracleID

啓動和停止緩存代理

一個TimesTen進程調用一緩存代理來執行異步緩存操作,如加載或刷新緩存集合。許多Cache Connect to Oracle操作可以直接通過TimesTen進行,而不需要緩存代理的協助。

如果下列之一或多個情形爲真,則必須爲每個包含緩存集合的數據存儲啓動一個獨立的緩存代理:

• 緩存集合爲READONLY。

• 緩存集合爲USERMANAGED並且包含一條AUTOREFRESH子句。

• 應用加載或刷新緩存集合。

可以從命令行或一個程序來爲一個DSN啓動緩存代理。

也可從基於瀏覽器的Cache Administrator來啓動緩存代理。

注意:如果安裝TimesTen時激活了Access Control,必須擁有數據存儲的ADMIN權限來啓動或停止緩存代理。另外,TimesTen用戶名必須與Oracle用戶名相匹配(應用到內部和外部的用戶名)。

從命令行控制緩存代理

使用ttAdmin工具來從命令行控制緩存代理。可以使用ttAdmin來:

• 從命令行設置緩存管理用戶ID和口令

• 從命令行啓動緩存代理

• 從命令行停止緩存代理

• 從命令行設置代理啓動性質

從命令行設置緩存管理用戶ID和口令

如果使用下列之一的緩存集合類型,則必須有一個擁有相應Oracle權限的緩存管理用戶帳號:

• ASYNCHRONOUS WRITETHROUGH緩存集合

• READONLY緩存集合

• 使用AUTOREFRESH屬性的USERMANAGED緩存集合

緩存管理用戶ID必須遵守下列規則:

• 長度爲1到30字節。

• 必須以字母開頭。

• 只能包含ASCII字母、下劃線(_)、美元符號($)和英鎊符號(#)。

緩存管理口令必須遵守下列規則:

• 長度爲1到30字節。

• 可以包含除了分號(;)外的任何ASCII字符。

在啓動緩存代理之前設置緩存管理用戶ID和口令。使用如下語法:

ttAdmin -cacheUidPwdSet -cacheUid cacheUid -cachePwd cachePwd DSN

注意:如果數據存儲中有自動刷新或AWT緩存集合,則緩存管理用戶ID和口令不能進行重新設置。在重新設置緩存管理用戶ID和口令之前,必須刪除那些緩存集合。

例 4.3 ttAdmin -cacheUidPwdSet -cacheUid testuser -cachePwd mypass myOraCache

如果改變了緩存管理用戶ID或口令,則必須重新啓動緩存代理。

注意:如果在數據存儲中沒有緩存集合,則不要設置緩存管理用戶ID和口令。如果沒有緩存集合時設置了它們,將不會使用緩存管理用戶ID和口令,並校驗到Oracle數據庫。

從命令行啓動緩存代理

爲了人命令行啓動緩存代理,使用如下語法:

ttAdmin -cacheStart DSN

例 4.4 ttAdmin -cacheStart myOraCache

如果試圖爲在DSN中使用相關路徑標識的數據存儲啓動緩存代理,TimesTen將搜索TimesTen運行和失敗的相關數據存儲。例如,在Window系統中,如果在DSN中爲數據存儲指定路徑爲DataStore=./dsn1,並且試圖使用下面命令啓動緩存代理:

ttAdmin -cacheStart dsn1

緩存代理在install_dir/srv/dsn1中搜索數據存儲。將不能在此位置找到數據存儲,也不能啓動緩存代理。對於UNIX,緩存代理將查找:

/var/TimesTen/ttversion/bits

從命令行停止緩存代理

爲了停止代理,使用如下語法:

ttAdmin -cacheStop DSN

例 4.5 ttAdmin -cacheStop myOraCache

注意:使用AUTOREFRESH特性時,在刪除或改變緩存集合之後,不要立即停止緩存代理。應該至少等待2分鐘。緩存代理需要這個時間來清除AUTOREFRESH使用的Oracle對象。

從命令行設置緩存代理啓動性質

可以通過調用ttCachePolicySet程序來設置緩存代理啓動性質。使用ttCachePolicyGet程序來返回當前的性質。

缺省的緩存代理啓動性質是manual。如果要在TimesTen守護程序重新啓動時將緩存代理自動重新啓動,則設置緩存代理性質爲always。一旦設置性質爲always,緩存代理將立即啓動。

4.6 設置緩存代理性質爲always

CALL ttCachePolicySet ('always');

從程序控制緩存代理

爲了從程序中控制數據存儲的緩存代理,首先連接到數據存儲。使用ttCacheUidPwdSetttCacheStartttCacheStopttCachePolicySet程序來執行下列任務:

• 從程序設置緩存管理用戶ID和口令

• 從程序啓動緩存代理

• 從程序停止緩存代理

• 從程序設置緩存代理性質

注意:如果Access Control被激活,則需要ADMIN權限來爲緩存代理和複製代理進行啓動、停止和設置性質。也需要ADMIN權限來設置緩存管理用戶ID和口令。

從程序設置緩存管理用戶ID和口令

如果使用下列類型之一的緩存集合,必須有一個擁有相應Oracle權限的緩存管理用戶帳號:

• ASYNCHRONOUS WRITETHROUGH緩存集合

• READONLY緩存集合

• 使用AUTOREFRESH屬性的USERMANAGED緩存集合

緩存管理用戶ID必須遵守下列規則:

• 長度爲1到30字節。

• 必須以字母開頭。

• 只能包含ASCII字母、下劃線(_)、美元符號($)和英鎊符號(#)。

緩存管理口令必須遵守下列規則:

• 長度爲1到30字節。

• 可以包含除了分號(;)外的任何ASCII字符。

在啓動緩存代理之前設置緩存管理用戶ID和口令。使用ttCacheUidPwdSet程序。

例 4.7 在此例中,通過連接句柄hdbc指定數據存儲。緩存管理用戶ID爲testuser,並且緩存管理用戶口令爲mypass

sprintf( stmt, "CALL ttCacheUidPwdSet('testuser','mypass')");

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

sprintf( stmt, "CALL ttCacheStart()" );

rc = SQLAllocStmt( hdbc, &hstmt2 );

rc = SQLExecDirect( hstmt2, (SQLCHAR *) stmt, SQL_NTS );

從程序啓動緩存代理

使用ttCacheStart程序來啓動緩存代理。

例 4.8 在此例中,通過連接句柄hdbc指定數據存儲。

sprintf( stmt, "CALL ttCacheStart()" );

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

注意:如果自動提交非激活,則必須在提交之前之後調用ttCacheStart

從程序停止緩存代理

使用ttCacheStop程序來停止緩存代理。

例 4.9 sprintf( stmt, "CALL ttCacheStop()" );

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

ttCacheStop程序有一個選項參數stopTimeout,用來指定TimesTen守護程序要等多長時間才停止緩存代理。如果緩存代理在指定的時間內沒有停止,則TimesTen守護程序將停止緩存代理。stopTimeout的缺省值是100秒。0值指定永遠等待下去。

例 4.10 爲了停止緩存代理,並設置stopTimeout爲160秒:

sprintf( stmt, "CALL ttCacheStop(160)" );

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

從程序設置緩存代理啓動性質

可以通過調用ttCachePolicySet程序來設置緩存代理啓動性質。使用ttCachePolicyGet程序來返回當前的性質。

缺省的緩存代理啓動性質是manual。如果要在TimesTen守護程序重新啓動時將緩存代理自動重新啓動,則設置緩存代理性質爲always。一旦設置性質爲always,緩存代理將立即啓動。

例 4.11 設置由hdbc連接句柄指定數據存儲的緩存代理啓動性質爲always

sprintf( stmt, "CALL ttCachePolicySet ('always')");

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

檢查緩存代理的狀態

可以使用ttStatus工具或ttDataStoreStatus程序來檢查正在運行的TimesTen緩存代理。

例 4.12 爲了使用ttStatus工具來確認位於c:/temp/cgds的數據存儲的緩存代理正在運行,輸入:

C:/>ttStatus

TimesTen status report as of Wed Apr 07 15:04:45 2004

Daemon pid 484 port 15000 instance MYCOMPUTER

No TimesTen server running

--------------------------------------------------------------

Data store c:/temp/cgds

There are 4 connections to the data store

Data store is in shared mode

Shared Memory KEY Global/DBI3cd02077.0.SHM.26 HANDLE 0x380

Subdaemon pid 964 context 0x5d82d0 connected (KEY

Global/DBI3cd02077.0.SHM.26)

Process pid 2040 context 0x97b200 connected (KEY

Global/DBI3cd02077.0.SHM.26)

Process pid 2040 context 0x1427c70 connected (KEY

Global/DBI3cd02077.0.SHM.26)

Process pid 2040 context 0x144bd70 connected (KEY

Global/DBI3cd02077.0.SHM.26)

TimesTen's cache agent is running for this data store

cache agent restart policy: manual

可以使用帶有-query選項的ttAdmin工具來確認爲數據存儲設置的性質,包括緩存代理的重啓性質。

例 4.13

C:/>ttAdmin -query cgDSN

RAM Residence Policy : inUse

Replication Agent Policy : manual

Replication Manually Started : False

cache agent Policy : manual

cache agent Manually Started : True

例 4.14 如果已經創建了一個AWT緩存集合,並且數據存儲已經啓動複製代理,則ttStatus工具也報告Oracle和複製代理的狀態。在此例中,複製和緩存代理正在運行。

C:/> ttStatus

TimesTen status report as of Wed May 4 13:44:30 2005

Daemon pid 25337 port 16000 instance -

No TimesTen server running

No TimesTen webserver running

-----------------------------------------------------------------

------- Data store /datastore/cache There are 15 connections to

the data store Data store is in shared mode Shared Memory KEY

0x260e30c2 ID 521502725

Cache agent pid 25545 context 0x82fd820 name timestenorad

connid 2 connected (KEY 0x260e30c2)

Cache agent pid 25545 context 0x832d798 name timestenorad

connid 4 connected (KEY 0x260e30c2)

Cache agent pid 25545 context 0x8335198 name timestenorad

connid 3 connected (KEY 0x260e30c2)

Cache agent pid 25545 context 0xaf27ad08 name timestenorad

connid 6 connected (KEY 0x260e30c2)

Process pid 25485 context 0x80bd8b0 name cache connid 8

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x8193110 name connid 7

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x81bddb0 name connid 9

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x81e53f8 name connid 12

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x82040d8 name connid 5

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x8229148 name connid 10

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x824e1b8 name connid 11

connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x8092960 name Worker connid

2044 connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x8110140 name Flusher connid

2045 connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x813a838 name Checkpoint

connid 2047 connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x81608f8 name Monitor connid

2046 connected (KEY 0x260e30c2)

Replication policy : Manual

Replication agent is running.

Cache agent policy : Manual

TimesTen's Cache agent is running for this data store

爲AWT緩存集合啓動複製代理

如果使用異步寫(AWT)緩存集合,必須啓動複製代理。

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP 語句將創建一個複製計劃以激活數據存儲與Oracle數據庫之間的通信。複製計劃完全由TimesTen管理,不需要用戶介入。使用DROP CACHE GROUP語句刪除AWT緩存集合時,複製計劃也將被刪除。

可能通過使用帶有-repStart選項的ttAdmin工具從命令行啓動複製代理。

例 4.15 AWTdsn數據存儲啓動複製代理。

ttAdmin -repStart AWTdsn

也可以通過使用ttRepStart程序從程序啓動複製代理。

例 4.16 一個緩存管理用戶的ID爲testuser,口令爲mypass,可以使用:

ttCacheUidPwdSet 程序來設置緩存管理用戶ID和口令

ttCacheStart 程序來啓動緩存代理

ttRepStart 程序來爲AWTdsn數據存儲啓動複製代理

sprintf( stmt, "CALL ttCacheUidPwdSet('testuser','mypass')");

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

sprintf( stmt, "CALL ttCacheStart()" );

rc = SQLAllocStmt( hdbc, &hstmt2 );

rc = SQLExecDirect( hstmt2, (SQLCHAR *) stmt, SQL_NTS );

sprintf( stmt, "CALL ttRepStart()" );

rc = SQLAllocStmt( hdbc, &hstmt3 );

rc = SQLExecDirect( hstmt3, (SQLCHAR *) stmt, SQL_NTS );

注意:在爲AWT緩存集合發送一條CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP或DROP CACHE GROUP語句之前,要停止複製代理(如ttAdmin -repStop DSN)。

應用緩存集合定義到數據存儲

如果有定義緩存集合的SQL文件,就可以在TimesTen數據存儲上使用帶有-f選項的ttIsql工具來執行此SQL。語法是::

ttIsql -f file.sql DSN

例 4.17 如果緩存集合在名爲CG1.sql的文件中定義,可以在名爲cgDSN的DSN上執行此文件,輸入:

C:/> ttIsql -f CG1.sql cgDSN

也可以從ttIsql命令行執行包含緩存集合定義的SQL文件。例如:

Command> run CG1.sql

設置passthrough級別

應用通過TimesTen連接可以發送SQL語句到TimesTen或Oracle。

SQL是否被直接傳送到TimesTen或Oracle將依賴於SQL語句的組成和PassThrough連接屬性的設置。可以設置PassThrough屬性來定義SQL語句的類型:是由本地的TimesTen處理,還是重定向到Oracle。

例如,可以設置PassThrough=0(缺省值)來指定所有SQL都在TimesTen中執行或PassThrough=3來指定所有SQL被傳送到Oracle去執行。

如圖 4.1顯示,可以設置PassThrough=1來爲一個不在TimesTen中的目標表或在TimesTen中產生的一條語法錯誤傳送SQL。例如,一條到緩存表(Table A)的UPDATE 在TimesTen緩存中被處理,同時一條到在TimesTen中找不到的表(Table G)的UPDATE被傳送到Oracle。同樣地,TimesTen的設置程序如ttCacheStartttCkpt,由TimesTen處理,同時不支持的過程將傳送到Oracle。

4.1 PassThrough=1

clip_image040

對於PassThrough=1的設置,沒有DDL語句會傳送到Oracle。TimesTen中不存在的過程將被傳送到Oracle:如果對於緩存集合表DML語句包含錯誤語法,就不會發送到Oracle。但是,所有包含錯誤語法的SELECT語句將被髮送到Oracle。

對於所有的passthrough級別,如果事務有任何DDL或DML語句傳送到Oracle,則提交和回滾將在Oracle和TimesTen中都要執行。否則,將只在TimesTen中執行。

READONLY緩存集合禁止在緩存集合中使用DML語句的更新。如果計劃使用READONLY緩存集合,可以設置PassThrough=2來直接將緩存集合中所有表的DML語句定向到Oracle。否則,此設置將於PassThrough=1時一樣,因此所有DDL語句、兼容的非DML語句及過程將直接到TimesTen。相同的passthrough情形也應用到USERMANAGED緩存集合中的READONLY表。例如,考慮如圖4.1所示的緩存集合示例。如果在Table A上設置了READONLY屬性,並且PassThrough = 2,一條到Table A的UPDATE將被傳送到Oracle。

在AWT和SWT緩存集合的表DML操作不推薦使用passthrough特性。在被定義爲異步的AWT集合中通過緩存進行的更新,passthrough將同步實施,可能將產生非預期結果。如果運用passthrough特性,SWT緩存集合中的更新可能導致自死鎖。

Passthrough和參數綁定

確保應用爲傳送語句提供正確的SQL數據類型。ODBC驅動器將轉換C和SQL類型,並向TimesTen傳送轉換的數據和SQL類型碼。TimesTen傳遞此信息到Oracle。

TimesTen處理passthrough語句的參數與在TimesTen中它自己執行語句中的參數不同。TimesTen查詢優化將爲TimesTen語句的參數分配數據類型。應用將獲得分配的數據類型來使用SQLDescribeParam ODBC函數。與此相比,passthrough語句的參數將不會爲它們分配數據類型。TimesTen將報告passthrough語句的參數的數據類型爲VARCHAR2(4000)。此數據類型只是一個佔位符。它不意謂着TimesTen期望作爲VARCHAR2數據來接收此參數值。作爲替代,當應用調用SQLBindParameter ODBC函數時,必須通知TimesTen關於passthrough語句參數的數據類型。SQLBindParameter的fSqlType參數指定參數的SQL數據類型。如果使用,cbColDef和ibScale參數指定精度和比例。

例如,爲了綁定一個SQL數據類型INTEGER的參數爲NUMBER(3)參數,使用下列參數調用SQLBindParameter ODBC函數:

fCType=SQL_C_SLONG

fSqlType=SQL_DECIMAL

cbColDef=3

ibScale=0

二選其一,也可以使用下列參數:

fCType=SQL_C_SLONG

fSqlType=SQL_INTEGER

cbColDef=0

ibScale=0

對於SQL_INTEGER,cbColDef和ibScale參數將被忽略。

改變passthrough級別

可以在ttIsql會話中使用passthrough命令來覆蓋DSN中PassThrough的設置。也可以爲指定的事務通過調用ttOptSetFlag程序並指定‘passthrough’作爲optflag參數和新的passthrough設置作爲optval參數來重新設置passthrough。新的passthrough設置將立即產生影響。在事務的最後,passthrough將被重置爲原來指定在PassThrough屬性中的值。

注意:PassThrough的行爲如同任何其它的優化標誌。當執行語句時準備的語句是使用的級別時,將建立PassThrough級別。如果在准許語句和執行它之間改變了PassThrough級別,則在執行中將使用原來的PassThrough級別。

監視緩存集合

以下部分將討論怎樣得到緩存集合的配置信息和怎樣監視緩存集合的狀態。

使用ttIsql cachegroup命令

可以通過使用ttIsql cachegroup命令來獲得關於數據存儲中當前使用中的緩存集合的信息,如下面例4.18所示。

例 4.18

Command> cachegroup;

Cache Group TESTUSER.CUSTOMERORDERS:

AutoRefresh Mode: Incremental

AutoRefresh State: On

AutoRefresh Interval: 5 Minutes

Root Table: TESTUSER.CUSTOMER

Where Clause: (none)

Type: Read Only

Child Table: TESTUSER.ORDERTAB

Where Clause: (none)

Type: Read Only

Cache Group TESTUSER.TABCACHE:

Root Table: TESTUSER.TAB3

Where Clause: (none)

Type: Propagate

2 cache groups found.

監視自動刷新緩存集合

TimesTen提供下列工具來監視自動刷新緩存集合:

ttCacheAutorefreshStatsGet內部程序

• 支持日誌中的信息

• 一個可以在Oracle數據庫中執行的SQL腳本來顯示關於變化日誌表的信息

ttTraceMon工具的AUTOREFRESH組成

• SNMP陷阱

爲READONLY、AUTOREFRESH和AWT緩存集合管理Oracle對象

READONLY緩存集合和一些USERMANAGED緩存集合使用AUTOREFRESH特性來自動將Oracle更新刷新到TimesTen緩存中。

可以爲緩存集合建立完全或增量自動刷新模式。當配置爲增量自動刷新時,TimesTen將爲緩存集合中的每個Oracle基表要求創建一個觸發器、日誌表和其它對象。每次在Oracle基表上的插入、更新和刪除操作將啓動觸器。觸發器將在日誌表中記錄更新記錄的主鍵。TimesTen緩存代理將定期搜索日誌表中的更新鍵和關聯的被更新的Oracle基表以得到最近更新的快照。

使用AUTOREFRESH INCREMENTAL屬性創建緩存集合時,自動刷新的要求的Oracle對象將被自動安裝。二選其一,可以手工安裝Oracle對象,以允許用戶使用較小的Oracle權限來創建要使用觸發器的緩存集合。

在安裝Oracle對象之前,必須:

• 有一個授予了額外的緩存管理用戶權限的緩存管理用戶帳號。

• 使用ttCacheUidPwdSet設置緩存管理用戶ID和口令。

• 啓動緩存代理。

對於每個緩存管理用戶,TimesTen將創建下列各表,version是一個內部TimesTen版本號:

• TT_version_USER_COUNT

• TT_version_AGENT_STATUS

• TT_version_SYNC_OBJS

對於緩存集合中的每個表,TimesTen將創建下列對象,number是原Oracle表的對象ID,version是一個內部TimesTen版本號。

對象

描述

TT_version_number_L

爲記錄到Oracle表的變化變化日誌表。

TT_version_number_T

在變化日誌表記錄變化的觸發器。當在緩存表中有插入、刪除和更新時被觸發。

AWT緩存集合請求一個額外的Oracle對象。將在Oracle上創建一個名爲TT_version_REPPPEERS的表用來跟蹤狀態和最近應用到Oracle的語句。此表將由CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP語句自動創建。二選其一,可以創建AWT緩存集合之前手工創建此Oracle表。

如果AWT緩存集合是一個活動的複製計劃備用對的一部分,則當創建活動的備用對時,一個名爲TT_version_REPACTIVESTANDBY將在Oracle上被自動創建。

TimesTen將下列表的SELECT、INSERT、UPDATE和DELETE的權限授予給user PUBLIC:

• TT_version_number_L

• TT_version_USER_COUNT

• TT_version_REPPEERS (爲AWT緩存集合創建)

• TT_version_REPACTIVESTANDBY (爲活動的備用複製計劃中的AWT緩存集合創建)

自動安裝Oracle對象

爲了直接使TimesTen自動安裝Oracle對象,確保緩存管理用戶擁有所有要求的自動創建Oracle對象的權限。當以PAUSED或ON狀態創建緩存集合或緩存集合狀態被改爲PAUSED或ON時,將自動創建Oracle對象。

例 4.19 顯示怎樣直接使TimesTen爲READONLY緩存集合自動安裝Oracle對象。

1. 使用ttIsql來連接到cgDSN數據存儲。

2. 調用ttCacheUidPwdSet程序來爲數據存儲設置緩存管理用戶ID(testuser)和口令。

3. 調用ttCacheStart程序來啓動緩存代理。

4. 使用CREATE READONLY CACHE GROUP來創建一個READONLY緩存集合,此集合有AUTOREFRESH INCREMENTAL值,並且STATE被設置爲缺省值PAUSED。

例 4.19

> ttIsql cgDSN

Command> call ttCacheUidPwdSet('testuser','mypsswrd');

Command> call ttCacheStart();

Command> CREATE READONLY CACHE GROUP readcache

FROM

user1.readtab

(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));

例 4.20 顯示怎樣直接使TimesTen爲AWT緩存集合自動安裝Oracle對象。

例 4.20

> ttIsql cgDSN

Command> call ttCacheUidPwdSet('testuser','mypsswrd');

Command> call ttCacheStart();

Command> CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP writecache

FROM user1.writetab (a NUMBER NOT NULL PRIMARY KEY,b VARCHAR2(31));

手工安裝Oracle對象

如果不需要授予用戶完全自動安裝Oracle對象的CREATE權限設置,可以手工安裝Oracle對象,並允許用戶使用較少的權限來創建AWT緩存集合和使用AUTOREFRESH INCREMENTAL屬性的緩存集合。

對象的安裝必須授予與選擇自動安裝選項的用戶相同的Oracle權限。

獲得SQL碼需要通過下方式之一從TimesTen創建Oracle對象:

• 從ttIsql提示符,輸入一條帶有INSTALL標誌的cachesqlget命令。

• 從一個程序中,調用ttCacheSqlGet內部程序並指定參數install_flag爲‘1’。

注意:當獲得SQL碼來安裝Oracle對象時,也應該產生一個來獲得SQL碼的腳本並保存它以在以後用來刪除對象。

在已經獲得SQL碼以後,就可以通過在Oracle主機上啓動SQL*Plus來手工創建Oracle對象,登錄如下:

sqlplus cacheUid/cachePwd@machine_name

在SQL>提示符,輸入SQL碼來創建對象。

4.21 使用ttIsql來連接到數據存儲。然後調用ttCacheStart程序來爲數據存儲啓動緩存代理。緩存管理用戶ID是testuser,口令爲mypsswrd。下一步,使用CREATE CACHE GROUP來創建一個READONLY緩存集合,AUTOREFRESH STATE設置爲OFF,並運行cachesqlget命令來獲取必須的SQL來安裝Oracle對象:

> ttIsql cgDSN

Command> call ttCacheUidPwdSet('testuser', 'mypsswrd');

Command> call ttCacheStart();

Command> CREATE READONLY CACHE GROUP readcache

AUTOREFRESH

MODE INCREMENTAL

INTERVAL 30 SECONDS

STATE OFF

FROM user1.readtab

(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));

Command> cachesqlget readcache install;

從cachesqlget的輸出相似如下:

CREATE TABLE system.tt_version_user_count(tableName VARCHAR2(65),

userCount

.... more code .....

END;

.

RUN;

可以從TimesTen剪貼和粘貼此SQL到Oracle上的SQL*Plus提示符:

SQL> CREATE TABLE system.tt_version_user_count(tableName

VARCHAR2(65), userCount

.... more code .....

END;

.

RUN;

二選其一,可以請求ttIsql將cachesqlget輸出到一個在命令行中提供的輸出文件名稱的一個文件將其保存。然後可以拷貝此文件到Oracle系統並執行此文件來安裝Oracle對象。

注意:如果手工安裝Oracle對象,必須要手工刪除它們。

手工爲AWT緩存集合安裝Oracle對象

當手工爲AWT緩存集合安裝Oracle對象時,必須在爲Oracle實例創建AWT緩存集合之前安裝。對於每個Oracle實例和緩存管理用戶ID和口令,對象只需要安裝一次。

執行下列任務來爲一個AWT緩存集合安裝Oracle對象:

1. 在ttIsql會話中使用ttCacheUidGet程序來檢查是否已經設置緩存管理用戶ID和口令。在此例中,DSN爲cgDSN。NULL結果表示還沒有爲cgDSN設置緩存管理用戶ID和口令。

> ttIsql cgDSN

Command> call ttCacheUidGet();

< >

1 row found.

2. 通過使用ttCacheUidPwdSet(uid,pwd)來設置緩存管理用戶ID和口令。下面的例子在ttIsql會話中設置緩存管理用戶ID爲testuser,口令爲mypsswrd,然後驗證它已經被設置。

Command> call ttCacheUidPwdSet('testuser','mypsswrd');

Command> call ttCacheUidGet();

< testuser >

3. 通過使用ASYNCHRONOUS_WRITETHROUGH和INSTALL標誌的ttIsql cachesqlget命令來獲取SQL以安裝對象。

Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH INSTALL;

輸出相似如下:

CREATE TABLE testuser.TT_03_RepPeers(

replication_name CHAR(31) NOT NULL,

replication_owner CHAR(31) NOT NULL,

tt_store_id NUMBER(19,0) NOT NULL,

subscriber_id NUMBER(19,0) NOT NULL,

commit_timestamp NUMBER(19,0),

commit_seqnum NUMBER(19,0),

timerecv NUMBER(10,0),

protocol NUMBER(10,0),

PRIMARY KEY(tt_store_id));

GRANT INSERT, UPDATE, DELETE, SELECT

ON testuser.TT_03_RepPeers TO PUBLIC;

CREATE TABLE testuser.TT_03_RepActiveStandby(

tt_store_pair INTEGER NOT NULL,

tt_store_id1 NUMBER(19,0) NOT NULL,

tt_store_id2 NUMBER(19,0) NOT NULL,

ts1 NUMBER(19,0),

ts2 NUMBER(19,0),

role1 CHAR(1),

role2 CHAR(1),

state NUMBER(10,0),

rep_checksum NUMBER(19,0),

PRIMARY KEY(tt_store_pair));

CREATE INDEX testuser.TT_03_RepActiveStandby_ix

ON testuser.TT_03_RepActiveStandby

( tt_store_id1, tt_store_id2 );

GRANT INSERT, UPDATE, DELETE, SELECT

ON testuser.TT_03_RepActiveStandby TO PUBLIC;

4. 剪切並粘貼SQL碼到SQL*Plus會話以創建TT_version_REPPEERS。二選其一,可以從一個PassThrough屬性被設置爲3進行連接的TimesTen中的ODBC或JDBC程序中執行此代碼。

如果AWT緩存集合是活動的備用對中的副本,還要創建TT_version_REPACTIVESTANDBY和TT_version_REPACTIVESTANDBY_IX。

Oracle對象的配置安裝

爲了確定安裝在Oracle中的對象,登錄Oracle帳號並從Oracle SQL *Plus命令提示符執行下列查詢:

SQL> select owner, object_name, object_type from all_objects where

object_name like 'TT/___/_%' escape '/';

輸出應該包含對象,相似如下:

OWNER OBJECT_NAME OBJECT_TYPE

------------- ------------------------------ ------------------

TESTUSER TT_03_34520_L TABLE

TESTUSER TT_03_34520_T TRIGGER

TESTUSER TT_03_USER_COUNT TABLE

TESTUSER TT_03_REPPEERS TABLE

刪除Oracle對象

如果Oracle對象由Cache Connect to Oracle自動安裝,則當設置AUTOREFRESH爲OFF或使用DROP CACHE GROUP來刪除緩存集合時,將自動刪除。

如果手工安裝Oracle對象,可以通過在Oracle系統中執行代碼來卸載它們來刪除對象。爲了從TimesTen獲得卸載代碼,使用下列方式之一:

• 從ttIsql提示符,輸入一條cachesqlget命令,指定uninstall。

• 從一個程序,調用ttCacheSqlGet程序並設置install_flag爲0。

注意:如果在刪除或改變自動刷新緩存集合之後立即關閉緩存代理,則它可能不會卸載Oracle對象。當重啓緩存代理時,它將卸載刪除或改變自動刷新緩存集合時留下的Oracle對象。

爲AWT緩存集合手工刪除Oracle對象

在從所有使用一個Oracle實例的數據存儲中刪除所有的AWT緩存集合之後,要爲AWT緩存集合刪除Oracle對象。

1. 從ttIsql會話,執行cachesqlget命令來獲取SQL來刪除對象。在此例中,DSN爲cgDSN,並且用戶是testuser。

> ttIsql cgDSN

Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH UNINSTALL;

輸出相似如下:

DROP TABLE testuser.TT_03_RepPeers;

DROP TABLE testuser.TT_03_RepActiveStandby;

2. 剪切並粘貼此SQL到SQL*Plus會話來刪除對象。二選其一,可以從使用PassThrough屬性被設置爲3的TimesTen連接中的ODBC或JDBC程序中執行此代碼。

第五章 使用緩存集合

這章將討論怎樣使用緩存集合。

改變緩存集合

使用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程序。

第六章 Cache Administrator

關於Cache Administrator

TimesTen提供了一個基於瀏覽器名爲Cache Administrator的工具創建緩存集合定義和工作。Cache Administrator能夠使用管理員使用位於與安裝TimesTen相同的機器上的Web瀏覽器通過操縱Oracle規劃來定義一個或多個緩存集合。可以設置Web服務器以使能夠訪問Cache Connect to Oracle。

下列Web瀏覽器支持Cache Administrator:

• Internet Explorer 6.0

• Firefox 1.5和以後的版本

安全

緩存集合定義保存在守護程序目錄中的ws/cgi-bin/cache/cachedata文件中。可以通過輸入ttVersion –m命令來獲得守護程序目錄。

緩存集合定義既包括查詢和索引又包括連接信息的定義。如果Access Control被激活,連接信息也包括Oracle用戶和TimesTen用戶。

Oracle用戶帳號必須擁有下列權限:

• CREATE SESSION

• 需爲爲每個緩存集合創建需要訪問的表的SELECT

當Access Control爲TimesTen實例激活時,用戶必須是一個內部TimesTen用戶。TimesTen用戶必須有下列權限:

• DDL

• SELECT

當Access Control被激活時,TimesTen用戶必須擁有ADMIN權限,以使它能夠從命令行啓動和停止緩存代理。

啓動Cache Administrator

在啓動Cache Administrator之前,確保:

• Oracle客戶端已經安裝到要啓動Cache Administrator的機器上。

• 要正確設置ORACLE_HOME環境變量。在啓動TimesTen守護程序之前,必須進行設置。

• UNIX上的LD_LIBRARY_PATH或Window上的PATH要設置正確。

• Cache Connect to Oracle已經成功安裝。

• TimesTen守護程序正在運行。

• Web服務器正在運行。可以通過使用ttStatus來驗證。實例管理員可以通過使用帶有-startwebserver選項的ttDaemonAdmin工具來啓動它。

通過在瀏覽器中輸入下列URL來啓動Cache Administrator:

http://localhost:port/cache

本地主機只支持可以啓動Web服務的位置。這就意謂着Cache Administrator必須運行在安裝TimesTen的機器上。試圖從其它機器上查看Cache Administrator將會失敗。

port是守護程序Web服務器的端口號。端口號在安裝時指定。如果不知道此端口號,查看守護程序目錄中守護程序的Web服務日誌webserver.log。

在Window平臺上,可以從Start >Programs > TimesTen菜單來啓動Cache Administrator。

連接到數據存儲

在爲數據存儲啓動緩存代理之後,選擇Login來連接到數據存儲。圖 6.1 顯示如果在數據存儲上沒有激活Access Control時的Connect to a Data Store 屏幕。

6.1 不使用Access Control連接到數據存儲

clip_image042

下字段必須完成:

TimesTen DSN — 指定用於緩存的TimesTen數據存儲。可以輸入一簡單串(DSN的名稱)或完整連接串。

簡單串是一個在Window系統中ODBC面板或UNIX平臺上SYS.ODBC.INI文件中已經創建的DSN的名稱。

下面是一個完整連接串的示例:DSN=CacheData;DurableCommits=0;DatabaseCharacterSet=US7ASCII;

Oracle username — Oracle數據庫上的一個用戶帳號。它獲取關於保存在Oracle上的表和索引信息。

Oracle password — 指定Oracle用戶的口令。

TimesTen password — 如果數據存儲上的Access Control被激活,也必須輸入TimesTen Password,如圖 6.2所示。Password輸入是大小寫敏感的。

6.2 使用激活的Access Control連接到數據存儲

clip_image044

在完成輸入後,單擊Log in

當成功連接到數據存儲時,Cache Administrator選項將顯示如圖 6.3所示。

6.3 歡迎頁和完整菜單

clip_image046

使用Cache Administrator

可以使用Cache Administrator來執行下列任務:

• 管理緩存集合定義(創建、拷貝、修改和刪除)。

• 查看描述緩存集合的SQL語句。

• 爲創建緩存集合生成必須的SQL語句,併發送信息到到創建它的數據存儲。

• 創建緩存集合。

• 管理緩存代理(啓動、停止、狀態)。

Cache Administrator的在線幫助將說明怎樣執行這些任務。

第七章 在RAC環境中實現Cache Connect

這章將討論怎樣在RAC環境中實現Cache Connect to Oracle。

在RAC環境中Cache Connect怎樣工作

Oracle Real Application Clusters (RAC)能夠使多個Oracle實例使用共享資源訪問一個數據庫,共享資源包括駐留在簇共享磁盤上所有的數據文件、控制文件、PFILE和重做日誌文件。在提供高性能的同時,RAC處理連續的讀/寫和加載平衡。

Fast Application Notification (FAN)是一個與Oracle Call Interface (OCI) in Oracle Database 10g Release 2結合使用的RAC特性。FAN發佈關於簇上變化的信息給訂閱FAN事件的應用。FAN將排除如下的降低效率的行爲:

• 當服務被關閉時的試圖連接

• 當服務被關閉時的試圖完成事務的進程

• 等待TCP/IP終止

不使用FAN,Cache Connec可能要花費數分鐘來接收一個Oracle失敗的通知。

Transparent application failover (TAF)是一個Oracle Net Services的特性,以使可以指定失敗以後需要應用怎樣進行重新連接。Cache Connect將OCI結合FAN使用來接收Oracle事件的通知。OCI應用可以使用下列類型之一的Oracle Net失敗功能:

• 會話:如果一用戶的連接丟失,一個新的會話將自動爲用戶創建。此失敗的類型不會試圖恢復選擇。

• 選擇:此失敗的類型可以使用戶在失敗以後使用打開遊標來繼續在裏面取值。

• 無:這是缺省值。不使用失敗功能。也可以顯式指定來防止失敗的產生。

Cache Connect能夠很快地從Oracle失敗中恢復過來,而不需要用戶的干預。Cache Connect可以與Oracle Database 10g Release 2 server一起用於RAC環境。Oracle客戶端可以是Oracle9i Release 2或Oracle Database 10g Release 2。

Cache Connect的行爲將依賴於TAF的動作和TAF是怎樣配置的。RACCallback Cache Connect屬性缺省地註冊TAF和FAN回叫。如果不需要TAF和FAN可用,則在連接串中設置RACCallback爲0。

表 7.1 顯示在使用不同的TAF失敗類型的RAC環境中Cache Connect特性和操作的行爲。這些行爲與Oracle9i Release 2和Oracle Database 10g Release 2客戶端一樣,除了當Oracle Database 10g Release 2中FAN被激活時,Cache Connect將立即接收到節點失敗的通知。

表 7.1 在RAC環境中Cache Connect特性和操作的行爲

特性或操作

TAF失敗類型

在連接到Oracle數據庫失敗後Cache Connect的行爲

Autorefresh

緩存代理將自動關閉、重啓和等待,直到可以建立到Oracle服務的連接。此行爲與Cache Connect to Oracle release 6.0.1和非RAC環境中的Cache Connect中的一樣。

Autorefresh

Session

將發生下列情形之一:

• 所有失敗的連接將恢復。正在進行中的Autorefresh操作將被回滾並重試。

• 如果TAF時間已到或不能恢復連接,則緩存代理將自動關閉、重啓和等待,直到可以建立到Oracle服務的連接。此行爲與Cache Connect to Oracle release 6.0.1和非RAC環境中的Cache Connect中的一樣。

Autorefresh

Select

將發生下列情形之一:

• Autorefresh將從連接失敗點繼續重新開始。

• 正在進行中的Autorefresh操作將被回滾並重試。

•如果TAF時間已到或不能恢復連接,則緩存代理將自動關閉、重啓和等待,直到可以建立到Oracle服務的連接。此行爲與Cache Connect to Oracle release 6.0.1中的一樣。

Passthrough、

SWT、propagate和flush

通知應用連接丟失並必須回滾TimesTen連接。在下一次passthrough操作期間,Cache Connect試圖重新連接到Oracle數據庫。所有被修改的會話屬性會丟失。此行爲與Cache Connect to Oracle release 6.0.1和非RAC環境中Cache Connect中的一樣。

Passthrough、

SWT、propagate和flush

Session

將發生下列情形之一:

• 將恢復到Oracle數據庫的連接。如果在丟失的連接上有打開的遊標、DML或鎖定操作,則會產生一個錯誤,並且用戶必須回滾事務。否則用戶可以繼續而不使用回滾。

• 如果TAF時間到或不能恢復連接,通知應用連接丟失並必須回滾TimesTen連接。在下一次passthrough操作期間,Cache Connect試圖重新連接到Oracle數據庫。所有被修改的會話屬性會丟失。此行爲與Cache Connect to Oracle release 6.0.1和非RAC環境中Cache Connect中的一樣。

Passthrough

Select

將恢復到Oracle數據庫的連接。如果在丟失的連接上有打開的遊標、DML或鎖定操作,則會產生一個錯誤,並且用戶必須回滾事務。否則用戶可以繼續而不使用回滾。

SWT、

Propagate、

和flush

Select

將發生下列情形之一:

• 將恢復到Oracle數據庫的連接。如果在丟失的連接上有DML或鎖定操作,則會產生一個錯誤,並且用戶必須回滾事務。否則用戶可以繼續而不使用回滾。

• 如果TAF時間到或不能恢復連接,通知應用連接丟失並必須回滾TimesTen連接。在下一次passthrough操作期間,Cache Connect試圖重新連接到Oracle數據庫。所有被修改的會話屬性會丟失。此行爲與Cache Connect to Oracle release 6.0.1和非RAC環境中Cache Connect中的一樣。

Load和

refresh

應用將收到一個連接丟失的錯誤。

Load和

refresh

Session

將發生下列情形之一:

• 加載成功。

• 返回一個錯誤,報告Oracle取值不能執行。

Load和

refresh

Select

將發生下列情形之一:

• 如果Oracle遊標被打開,並且遊標被恢復或Oracle遊標沒有被打開,則加載成功。

• 如果TAF不能恢復會話或打開Oracle遊標,則返回一個錯誤。

注意:返回錯誤的可能性小於TAF失敗類型是Session。

AWT

AWT的複製接收線程存在。產生一個新線程並試圖連接到Oracle數據庫。

AWT

Session、

select

將發生下列情形之一:

• 如果連接被恢復並且在連接上有未提交的DML操作,則批量操作或事務將被回滾並重新執行。

• 如果連接被恢復並且在連接上無未提交的DML操作,則工作繼續。

在RAC環境中使用Cache Connect的限制

可以爲下列Oracle客戶端和服務器的版本在RAC環境中使用Cache Connect to Oracle:

• Oracle Database 10g Release 2。如果客戶端和服務器的版本都是Oracle Database 10g Release 2,則只能使用FAN。

• Oracle Database 10g Release 1

• Oracle9i Release 9.2

對於每個版本,要使用Oracle客戶端最近的版本。

Cache Connect支持的RAC有下列限制:

• Cache Connect的行爲被限制爲使用RAC、FAN和TAF的能力。例如,如果服務所有的節點失敗,服務將不會重啓。Cache Connect將等待用戶來重新啓動服務。

• TAF不會恢復ALTER SESSION操作。由用戶負責在失敗之後恢復改變了的會話屬性。

• Cache Connect結合FAN事件使用Oracle Client Interface (OCI)。此接口自動產生一個線程來等待一個Oracle事件。在一個直接連接的TimesTen應用中產生一個線程只是TimesTen的特性。建修改ODBC應用以解決此線程的創建。如果不需要額外的線程,設置RACCallback Cache Connect屬性爲0。則將不會使用TAF和FAN。

在RAC環境中安裝Cache Connect

安裝Cache Connect和RAC。確保緩存管理用戶在s Oracle GV$SESSION動態執行視圖上有SELECT權限。

有兩個TimesTen環境變量控制TAF超時設置:

• TT_ORA_FAILOVER_TIMEOUT:TAF以分鐘數爲用戶應用(SWT緩存集合、使用propagate選項的緩存集合和使用passthrough特性的緩存集合)進行超時設置。缺省值是5分鐘。

• TT_AGENT_ORA_FAILOVER_TIMEOUT:TAF以分鐘數爲複製代理(對於AWT緩存集合)進行超時設置。缺省值爲5小是。

下列Oracle組件也必須啓動:

• Oracle實例

• Oracle監聽器

• 將用於Cache Connect的Oracle服務

然後執行下列任務:

1. 覈實RACCallback連接屬性被設置爲1(缺省值)。

2. 使用DBMS_SERVICE.MODIFY_SERVICE Oracle PL/SQL包或Oracle Enterprise Manager以使可以進行FAN事件的發佈。這將改變Oracle ALL_SERVICES視圖的AQ_HA_NOTIFICATIONS列爲YES。(這將應用到Oracle Database 10g Release 2客戶端。)

3. 通過下列方式之一使得在服務上能夠使用TAF:

• 在Oracle tnsnames.ora文件中使用下列字符爲Cache Connect創建一個服務:

– LOAD_BALANCE=ON (選項)

– FAILOVER_MODE=(TYPE=SELECT)或FAILOVER_MODE=(TYPE=SESSION)

• 使用DBMS_SERVICE.MODIFY_SERVICE來設置TAF失敗類型。

4. 如果應用是一個ODBC直接連接應用,使用一個線程庫進行連接,以使它能夠接收FAN通知。FAN將產生一個線程來監視失敗。(這將應用到Oracle Database 10g Release 2客戶端。)

第八章 TimesTenOracle之間的兼容性

這章將列出TimesTen和Oracle之間的兼容性問題。此列表不完整,但它包括需要特別注意的地方。

注意:TimesTen不支持Oracle Call Interface (OCI)。

兼容性問題總結

考慮下面TimesTen和Oracle之間的不同:

• TimesTen和Oracle數據庫的元數據保存不同。

• TimesTen和Oracle有不同的事務隔絕模式。

• TimesTen和Oracle有不同的連接和語句屬性。例如,timesTen不支持目錄名、滾動遊標或更新遊標。

• 對於ROWID,TimesTen和Oracle不同的類型和長度。TimesTen 不支持Oracle ROWID數據類型。

• Sequence不會被緩存,並且在緩存和Oracle數據庫之間不同步。

• 觸發器和過程的作用不會傳送到緩存中,直到一個AUTOREFRESH操作或手工REFRESH CACHE GROUP操作之後。

• 在緩存集合中不支持XA和JTA API。

關於Oracle客戶端/服務器版本的Cache Connect支持

Cache Connect to Oracle不防礙所有支持的Oracle客戶端/服務器相互聯合協調工作的配置。例如,在TimesTen服務的機器上Cache Connect使用9.2.0.8 Oracle客戶端安裝並連接到不同服務器上的10.2.0.3 Oracle數據庫是被支持的。用戶應該檢查Metalink Documentation Note 207303.1、“Client/Server/Interoperability Support Between Different Oracle Versions”中關於當前Oracle客戶端/服務器支持的配置信息。用戶也應該檢查關於交互問題的Oracle和TimesTen版本注意事項。

事務的意義

TimesTen和Oracle的事務意義的不同如下:

• Oracle連接的事務在提交時可能失敗,因爲事務不能被連續化。而TimesTen將使用鎖來強制進行連續的事務。

• Oracle用戶可以通過顯式的SQL來鎖定表。此鎖定特徵在TimesTen中不支持。

• Oracle支持保存點。而TimesTen不支持。

• 在Oracle中,事務可以被設置爲只讀/。這在TimesTen中也是不支持的。

JDBC兼容性

應用到JDBC的兼容性問題包括如下:

• JDBC數據庫元數據函數返回TimesTen元數據。如果需要Oracle元數據,可以使用帶有PassThrough屬性的Cache Connect或直接連接到Oracle數據庫。

設置/得到連接和語句屬性將在TimesTen上。

• 所有Oracle java.sql.ResultSet元數據(長度、類型、標籤)將以TimesTen數據類型長度返回。返回的列標籤也是TimesTen列標籤。

• 對於java.sql.CallableStatement方法的輸出參數(OUT和INOUT),在TimesTen中不被支持。

• 不支持Oracle擴展(oracle.sql和oracle.jdbc包)。

• 在TimesTen中不支持Java存儲過程。

注意:TimesTen不支持語句的異步執行,也不支持從一個不同的線程取消一條執行語句。

java.sql.Connection

下面的Connection方法沒有兼容性問題:

close

commit

createStatement

setAutoCommit

prepareCall

prepareStatement

rollback

下面的方法在本地TimesTen中被執行:

getCatalog

getMetaData

get/setTransactionIsolation

isReadOnly

isClosed – 只返回TimesTen連接狀態

nativeSQL

setCatalog

setReadOnly

java.sql.Statement

下面的Statement方法有兼容性問題:

close

execute

executeUpdate

executeQuery

getResultSet

getUpdateCount

getWarnings

executeBatch

clearBatch

addBatch

下面的方法在本地的TimesTen中執行:

get/setMaxFieldSize

get/setMaxRows

get/setQueryTimeout

getMoreResults

setEscapeProcessing

setCursorName

cancel

java.sql.ResultSet

下面的ResultSet方法沒有兼容性問題:

close

findColumn(int) 和 findColumn(string)

getXXX(number) 和 getXXX(name)

getXXXStream(int) 和 getXXXStream(string)

getMetaData

java.sql.PreparedStatement

下面的PreparedStatement方法沒有兼容性問題:

execute

executeUpdate

executeQuery

setXXX

setXXXStream

close

getResultSet

getUpdateCount

addBatch

下面的方法在本地TimesTen中執行:

get/setMaxFieldSize

get/setMaxRows

get/setQueryTimeout

getMoreResults

setEscapeProccessing

setCursorName

cancel

java.sql.CallableStatement

與顯示在java.sql.Statement和應用到CallableStatementjava.sql.PreparedStatement接口有相同的限制。另外,使用任何輸出形態的CallableStatement都不被支持。所有參數都被作爲輸入參數。沒有輸出參數的Callablestatement可能在準備時返回一個錯誤,通過registerOutparameter返回錯誤或應用可能得到非預期的結果。

• 在一個WRITETHROUGH緩存集合中,如果PassThrough=1,則隱藏在存儲過程中或通過觸發器產生的間接DML操作可能被傳送,但沒有被Cache Connect to Oracle發現。

• 從READONLY緩存集合進行更新的、插入或刪除的存儲過程將在另一個異步方式的事務中被自動刷新。因此在存儲過程被執行的相同事務中將不會出現變化,並且在自動刷新到緩存表之前,會有一段時間間隔。

java.sql.ResultSetMetadata

下面ResultSetMetadata方法沒有兼容性問題:

getColumnCount

getColumnType

getColumnLabel

getColumnName

getTableName

isNullable

下面的方法在本地的TimesTen中執行:

getSchemaName

getCatalogName

getColumnDisplaySize

getColumnType

getColumnTypeName

getPrecision

getScale

isAutoIncrement

isCaseSensitive

isCurrency

isDefinitelyWritable

isReadOnly

isSearchable

isSigned

isWritable

Stream support

兼容性問題相關的流是:

• JDBC驅動器在調用executeQuerynext方法時將數據完全取出並放入到內存緩衝區。getXXXStream條目指針返回從此緩衝區讀數據的流。

• Oracle支持最大到2GB的long或long raw數據。

• Oracle總是long/long raw數據流,即使應用沒有調用getXXXStream

• TimesTen沒有close方法。當它移動到下一行時,將使stream流無效。當移動到下一列時,Oracle將關閉流。

• TimesTen不支持markmarkSupportedreset方法。

ODBC兼容性

下表列出ODBC 2.5 API調用和指出函數是否有兼容性問題。

函數

兼容性

SQLAllocConnect

-

SQLAllocEnv

-

SQLAllocStmt

-

SQLBindCol

-

SQLBindParameter

當一條SQL語句有相同的參數名時,TimesTen認爲它們是相同參數的多次出現,不允許它們分別綁定。Oracle認爲它們是不同的參數,並允許它們分別綁定。

SQLBrowseConnect

不支持

SQLCancel

TimesTen不支持語句的異步執行,並且不支持從一不同的線程來取消一條執行語句。

SQLColAttributes

-

SQLColumnPrivileges

不支持

SQLColumns

元數據函數從TimesTen表返回元數據。

SQLConnect

-

SQLDataSource

-

SQLDescribeCol

-

SQLDescribeParam

-

SQLDisconnect

-

SQLDriverConnect

-

SQLDrivers

-

SQLError

是TimesTen錯誤的本地錯誤碼。用戶可以接收到一般錯誤如“execution at Oracle failed, Oracle error code nnn.”。

SQLExecDirect

-

SQLExecute

-

SQLExtendedFetch

不支持

SQLFetch

-

SQLForeignKeys

元數據函數從TimesTen表返回元數據。

SQLFreeConnect

-

SQLFreeEnv

-

SQLFreeStmt

-

SQLGetConnectOption

-

SQLGetCursorName

TimesTen支持get/set遊標名,但不支持遊標delete/update語句。

SQLGetData

-

SQLGetFunctions

-

SQLGetInfo

-

SQLGetStmtOption

-

SQLGetTypeInfo

元數據函數從TimesTen表返回元數據。

SQLMoreResults

不支持

SQLNativeSql

-

SQLNumParams

-

SQLNumResultCols

-

SQLParamData

-

SQLParamOptions

-

SQLPrepare

-

SQLPrimaryKeys

元數據函數從TimesTen表返回元數據。

SQLProcedureColumns

元數據函數從TimesTen表返回元數據。

SQLProcedures

元數據函數從TimesTen表返回元數據。

SQLPutData

-

SQLRowCount

-

SQLSetConnectOption

設置函數設置TimesTen選項或元數據。

SQLSetCursorName

設置函數設置TimesTen選項或元數據。

SQLSetPos

不支持

SQLSetScrollOptions

不支持

SQLSetStmtOption

設置函數設置TimesTen選項或元數據。

SQLSpecialColumns

元數據函數從TimesTen表返回元數據。

SQLStatistics

元數據函數從TimesTen表返回元數據。

SQLTablePrivileges

不支持

SQLTables

元數據函數從TimesTen表返回元數據。

SQLTransact

-

SQL兼容性

這部分比較TimesTen的SQL與Oracle的SQL的執行。目的是提供用戶一個在TimesTen中不支持或使用不同意義支持的Oracle SQL特性的列表。這部分比較Oracle Database 10g Release 2和Oracle TimesTen In-Memory Database 7.0.0.0.0。

計劃對象

TimesTen不承認一些Oracle中支持的計劃對象。當語句操作或使用這些對象並傳送到Oracle時,TimesTen將返回一個語法錯誤。不支持的對象是:

• 與存儲過程相關的對象

– 存儲過程

– 存儲函數

– 包

– 觸發器

• 訪問控制對象

– 角色

– 外形

– 上下文

• 存儲管理特性

– 簇

– 表空間

–回滾段

– CREATE/DROP DATABASE語句

– 數據庫鏈節

– 目錄

– 分區

• 擴展特性

– 擴展程序庫

– Object表

– Object類型

– Object視圖

TimesTen支持視圖和物化視圖,但不支持緩存Oracle視圖。當TimesTen中沒有相同的本地對象名時,包括視圖和物化視圖的語句將傳送到Oracle。

Oracle和TimesTen表之間的差異

一些TimesTen不支持的Oracle特性是:

• ON DELETE SET NULL

• 約束檢查

數據類型支持

下列Oracle數據類型不被TimesTen支持:

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH LOCAL TIME ZONE

INTERVAL YEAR TO MONTH

INTERVAL DAY TO SECOND

ROWID

UROWID

CLOB

NCLOB

BLOB

BFILE

REF

“Any”類型

XML類型

Spatial類型

Media類型

下列TimesTen數據類型不被Oracle支持:

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

TT_VARBINARY

注意:TimesTen NCHAR/NVARCHAR2數據類型將被編譯爲UTF-16。Oracle NCHAR/NVARCHR2將被編譯爲UTF-16或UTF-8。

SQL操作符

TimesTen支持這些Oracle操作符和動詞:

一元數的 -

+, -, *, /

=, , <=, >=, <>=

| |

IS NULL, IS NOT NULL

LIKE(Oracle LIKE操作符將忽略後面的空格,但TimesTen不會。)

BETWEEN

IN

NOT IN (list)

AND

OR

+(外連接)

ANY、SOME

ALL (list)

EXISTS

UNION

MINUS

INTERSECT

SQL函數

TimesTen支持這些Oracle函數:

ABS

ADD_MONTHS

AVG

CEIL

COALESCE

CONCAT

COUNT

DECODE

EXTRACT

FLOOR

GREATEST

INSTR

LEAST

LENGTH

LPAD

LTRIM

MAX

MIN

MOD

NUMTOYMINTERVAL

NUMTODSINTERVAL

NVL

POWER

ROUND

RPAD

RTRIM

SIGN

SQRT

SUBSTR

SUM

SYSDATE

TO_DATE

TO_CHAR

TO_NUMBER

TRIM

TRUNC

SQL表達式

TimesTen支持這些Oracle表達式:

• 列引用

• Sequence

• NULL

• ()

• 綁定參數

• 計算表達式

• CAST

SQL子查詢

TimesTen支持Oracle子查詢:

• IN(子查詢)

• >,

• >,=,< SOME(子查詢)

• EXISTS(子查詢)

• >,=,< (分級子查詢)

• 在DELETE/UPDATE的WHERE子句中

• 在FROM子句中

注意:一個“單行結果集”的非驗證分級子查詢直到執行時才能被確認。TimesTen允許在整個查詢中至多隻能有一個非驗證分級子查詢,並且子查詢不指定在OR表達式中。

SQL查詢

TimesTen支持這些查詢:

• FOR UPDATE

• ORDER BY

• GROUP BY

• 表別名

• 列別名

Oracle支持閃回查詢,以查詢數據庫一些以前狀態(例如,查詢昨天的一個表)。TimesTen不支持閃回查詢。

INSERT/DELETE/UPDATE語句

TimesTen支持這些Oracle DML語句:

• INSERT INTO ... VALUES

• INSERT INTO ... SELECT

• UPDATE WHERE expression(expression可以包含子查詢)

• DELETE WHERE expression(expression可以包含子查詢)

• MERGE(TimesTen不支持ODBC批量執行MERGE語句)

只用於TimesTen的SQL和內部程序

這部分列出Oracle不支持的TimesTen SQL語句和內部程序。使用PassThrough= 3時,這些語句將被傳送到Oracle併產生一個錯誤。

• 所有TimesTen緩存集合DDL和DML語句,包括CREATE CACHE GROUP、DROP CACHE GROUP、ALTER CACHE GROUP、LOAD CACHE GROUP、UNLOAD CACHE GROUP、FLUSH CACHE GROUP和REFRESH CACHE GROUP語句。

• 所有TimesTen複製管理DDL語句,包括CREATE REPLICATION、DROP REPLICATION、ALTER REPLICATION、CREATE ACTIVE STANDBY PAIR、ALTER ACTIVE STANDBY PAIR和DROP ACTIVE STANDBY PAIR語句。

• 所有TimesTen內部程序。

其它SQL問題

• Oracle ROWID數據類型是假的ROWID。TimesTen的ROWID數據類型是BINARY(16)。它們的長度不同。

• PL/SQL是一種Oracle語言,並不被TimesTen支持。

• Oracle內部優化內含在SQL註釋中。TimesTen使用內部程序來設置內部優化。

• Oracle和TimesTen的系統表不同。

• TimesTen不支持Oracle INSERT、UPDATE和DELETE語句中的RETURNING子句。

• Oracle存儲函數可能通過輸出參數返回遊標引用或返回值。TimesTen不支持這種特性。

• 當一條SQL語句有相同的名字的參數時,TimesTen認爲它們是相同參數的重複出現,並且不允許對它們進行分別綁定。Oracle則認爲它們是不同的參數並允許分別綁定。

術語表

age out

在一個指定的時間週期之後(基於時間)或當數據的使用已經達到指定的水平(基於使用),將從緩存集合中刪除緩存實例。

asynchronous writethrough cache group

TimesTen中一個緩存集合中的數據被更新,並異步的傳送到Oracle。

autorefresh

Oracle上的更新通過Oracle觸發器的手段被自動地傳送到TimesTen緩存集合。

AWT cache group

同asynchronous writethrough cache group。

bidirectional propagation

爲了將Oracle或TimesTen緩存集合中的更新拷貝到另一方。

cache agent

一個TimesTen進程以保證緩存集合的操作,如AUTOREFRESH和COMMIT EVERY n ROWS。

cache group

將Oracle表中的數據緩存到一個TimesTen數據存儲中。緩存集合可以創建來緩存一個單表的所有或部分,或是緩存一個Oracle相關聯的表集。如果緩存了多個Oracle表,則緩存集合中的每個表必須與緩存集合中另一個表通過一對多相關聯。

cache group primary key

緩存集合中根表的主鍵。

cache instance

由緩存集合根表中的主鍵指定的數據中一指定的行。如果緩存集合中有多個表,則緩存實例由通過外鍵與根表中行關聯的相關的行集組成。

cache instance key

根表中指定行的主鍵,用來確定根表的行和緩存集合子表中引用根表此行的所有子錶行。

child table

緩存集合中有一個引用根表主鍵的外鍵或引用另一個直接或間接引用根表的子表主鍵的外鍵的表。緩存集合中表的層次可以指定子表是另其它子表的父表。緩存集合中不能有多個父表的子表。

flush

爲了將緩存集合中的插入或更新從TimesTen拷貝到Oracle。

load

爲了從Oracle只拷貝新實例。不會更新或刪除緩存中已經存在實例。

propagate

爲了在Oracle和TimesTen緩存集合之間拷貝數據。

refresh

爲了使用最近的Oracle數據來替換TimesTen緩存集合中所有的緩存實例。

replication

在多個數據存儲中保持數據的副本拷貝的過程。

replication agent

通過一個replication agent來控制在每個主和從數據存儲的複製。在主數據存儲上的複製代理來從事務日誌讀記錄並向前查找所有改變以複製到從數據存儲上的複製代理。從數據存儲上的複製代理然後將更新應用到它的數據存儲中。

root table

緩存集合中的主表不通過外鍵約束來引用緩存集合中的任何其它表。根表的主鍵就是緩存集合的主鍵。

synchronous writethrough cache group

一個緩存集合中緩存數據在TimesTen中被更新,並且同步地傳送到Oracle。

system-managed cache group

System-managed cache group強制指定行爲。系統管理緩存集合是READONLY、SYNCHRONOUS、WRITETHROUGH和ASYNCHRONOUS WRITETHROUGH。

READONLY緩存集合強制地將Oracle表中的更新通過AUTOREFRESH機制應用到TimesTen。不能在READONLY緩存集合中直接更新表。

ASYNCHRONOUS WRITETHROUGH (SWT)緩存集合強制將TimesTen中緩存數據的更新傳送到Oracle。當應用提交事務時,在向TimesTen提交之前向Oracle提交。

ASYNCHRONOUS WRITETHROUGH (AWT)緩存集合的強制緩存行爲與SWT緩存集合相同,即TimesTen中緩存數據的更新被傳送到Oracle,但TimesTen提交的發生與Oracle提交不同步。

user-managed cache group

一個user-managed cache group實現自定義行爲,如雙向傳送。

unload

爲了從緩存集合中刪除一此或所有緩存實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章