這章將討論怎樣使用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)或TimesTen(UNIX)。
創建必需的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緩存集合
第1步:創建一Oracle表
圖 2.2 創建一Oracle表
連接到新帳號並創建一數據表:
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緩存集合
使用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
使用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
第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緩相聚集合
在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緩存集合表
使用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 attributesLogging=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。 |