TIMESTEN安裝配置指南-中文版

TimesTen內存數據庫

第一章 Cache Connect to Oracle概念

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

TimesTen贊成經過建立cache group來快速緩存Oracle數據,以在TimesTen中映射一個或多個Oracle表。web

贊成快速緩存Oracle數據的TimesTen聯合特徵就做爲Cache Connect to Oraclesql

關於快速緩存集合

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

快速緩存集合可以使用CREATE CACHE GROUP SQL語句或基於瀏覽器的Cache Administrator(Chapter 6, 「CacheAdministrator.」)來建立。express

圖 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肯定根表中的行和引用此行的子表中所有的行。oracle

圖 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。Oracleclient的版本號沒必要與Oracleserver端的版本號一樣。Cache Connect支持如下的Oracleclient和server端的版本號:

• 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賬號。假設操做者實際擁有數據庫管理權限,則在Oracleserver上打開命令窗體並啓動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

• Oracleserver的狀態

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緩存表中的VARCHAR二、NVARCHAR二、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賬號中,並有一個不一樣的名稱,但做爲同義詞它必須駐留在同一個Oracleserver上。緩存集合中的表名必須是私有同義詞名稱,但同義詞可以指向還有一個公有或私有的同義詞。同義詞終於必須指向(直接或間接)一個表、分區表或物化視圖。

包括爲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語句將記錄在Oracleserver日誌中。查看此日誌以更好的理解緩存集合操做的機制和運行。

如下是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的Oracleclient和server端。

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

• 使用Oracle Database 10gclient和server

• 將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推薦Oracleclient的版本號要與serverOracle的版本號一樣或較低。雖然做爲推薦,也會發生下列狀況:

• 在從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特性來操做遠程Oracleserver的指定步驟。

1.在TimesTen主機上安裝Oracleclient或Oracle數據庫。Oracleclient或數據庫必須在安裝TimesTen以前裝以防止使用Cache Connect特性時會出現故障。

2. 爲特定的操做系統配置環境變動。

3. 安裝TimesTen。

4. 假設打算使用基於Web的Cache Administrator,配置內植的webserver。

5. 假設在TNSNAMES.ORA文件裏定義Oracle Service Names,要使用系統級TNSNAMES.ORA文件。TimesTen的主守護程序、緩存代理、webserver和複製代理將使用系統級TNSNAMES.ORA文件裏提供的信息。不要使用不一樣的TNSNAMES.ORA文件來配置Oracleclient。

注意: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-位Oracleserver,則庫路徑是$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的username和口令將從DSN定義的屬性中或ODBC鏈接串中取出。在鏈接串中給出的值將覆蓋指定DSN中的值。

好比,可以在ttIsql鏈接串中指定Oracle UID和OraclePWD

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

假設經過ODBC應用發送更新並提交,必須在鏈接串中指定username和口令。好比:

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權限來啓動或中止緩存代理。另外,TimesTenusername必須與Oracleusername相匹配(應用到內部和外部的username)。

從命令行控制緩存代理

使用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規劃來定義一個或多個緩存集合。可以設置Webserver以使可以訪問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以前,確保:

• Oracleclient已經安裝到要啓動Cache Administrator的機器上。

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

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

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

• TimesTen守護程序正在運行。

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

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

http://localhost:port/cache

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

port是守護程序Webserver的端口號。端口號在安裝時指定。假設不知道此端口號,查看守護程序文件夾中守護程序的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環境。Oracleclient可以是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 2client同樣,除了當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的限制

可以爲下列Oracleclient和server的版本號在RAC環境中使用Cache Connect to Oracle:

• Oracle Database 10g Release 2。假設client和server的版本號都是Oracle Database 10g Release 2,則僅僅能使用FAN。

• Oracle Database 10g Release 1

• Oracle9i Release 9.2

對於每個版本號,要使用Oracleclient近期的版本號。

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 2client。)

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 2client。)

第八章 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。

關於Oracleclient/server版本號的Cache Connect支持

Cache Connect to Oracle不防礙所有支持的Oracleclient/server相互聯合協調工做的配置。好比,在TimesTen服務的機器上Cache Connect使用9.2.0.8 Oracleclient安裝並鏈接到不一樣server上的10.2.0.3 Oracle數據庫是被支持的。用戶應該檢查Metalink Documentation Note 207303.一、「Client/Server/Interoperability Support Between Different Oracle Versions」中關於當前Oracleclient/server支持的配置信息。用戶也應該檢查關於交互問題的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(子查詢)

• >,<,= ANY(子查詢)

• >,=,< 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

爲了從緩存集合中刪除一此或所有緩存實例。

相關文章
相關標籤/搜索