这章将讨论怎样使用SQL语句来创建并管理简单的缓存集合。也可使用基于浏览器的Cache Administrator来创建缓存集合。
在能够创建缓存集合之前,必须安装TimesTen和Oracle环境。完成以下任务:
1. 在TimesTen主机上安装Oracle Client。
2. 创建必需的Oracle帐号。
3. 创建一个TimesTen帐号。
4. 创建TimesTen DSN。
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)。
在能够使用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帐号。
作为实例管理者,使用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数据库帐号和口令相同。
在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';
对于其余设置,使用缺省值。
在已经安装TimesTen和Oracle并进行配置以后,就可以创建缓存集合。
这部分将讨论怎样创建一个简单READONLY缓存集合,以缓存Oracle数据库中单一表中的内容。尽管一个缓存集合可以由多个表组成,这里只缓存一个Oracle表以保持示例的简单。
图 2.1 显示一个缓存一单个Oracle表的READONLY缓存集合。
图2.1 简单READONLY缓存集合
图 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.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);
加载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.
图 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
在TimesTen窗口中,使用DROP CACHE GROUP语句从TimesTen数据存储中删除缓存集合:
Command> DROP CACHE GROUP readcache;
调用ttCacheStop程序停止数据存储的缓存代理:
Command> call ttCacheStop;
这部分将讨论怎样在DSN中设置PassThrough属性来命令TimesTen通过SQL定向到Oracle。
图 2.5 显示从一个应用将SQL传递到Oracle表。缓存表通过自动刷新机制从Oracle接收更新。
图 2.5 从Cache Group to Oracle传递SQL
在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.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);
加载Oracle表的内容到缓存集合表中。
Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
4 cache instances affected.
图 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
使用ttIsql,输入DROP CACHE GROUP语句来从TimesTen数据存储中删除缓存集合:
Command> DROP CACHE GROUP readcache;
调用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。 |