TimesTen内存数据库-第四章 管理缓存集合

为缓存集合配置系统

这部分总结将TimesTen主机配置为Oracle Client并使用Cache Connect to Oracle特性来操做远程Oracle服务器的指定步骤。web

1.在TimesTen主机上安装Oracle客户端或Oracle数据库。Oracle客户端或数据库必须在安装TimesTen以前装以防止使用Cache Connect特性时会出现问题。sql

2. 为特定的操做系统配置环境变动。数据库

3. 安装TimesTen。浏览器

4. 若是打算使用基于Web的Cache Administrator,配置内植的web服务器。缓存

5. 若是在TNSNAMES.ORA文件中定义Oracle Service Names,要使用系统级TNSNAMES.ORA文件。TimesTen的主守护程序、缓存代理、web服务器和复制代理将使用系统级TNSNAMES.ORA文件中提供的信息。不要使用不一样的TNSNAMES.ORA文件来配置Oracle客户端。服务器

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

在UNIX平台上配置Cache Connect to Oracle

为TimesTen用户环境和启动TimesTen守护程序(根)的用户环境设置环境变量:oracle

• 设置ORACLE_HOME环境变量为Oracle Client安装目录的路径。例如:异步

$ORACLE_HOME = /oracle/ora10gide

• 对于32-位和64-位Oracle/TimesTen安装应该包括LD_LIBRARY_PATH或SHLIB_PATH环境变动:

$ORACLE_HOME/lib

$ORACLE_HOME/network/lib

install_dir/lib

例如:

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

/timesten/myinstance/lib

注意:若是使用32-位TimesTen安装而配置64-位Oracle服务器,则库路径是$ORACLE_HOME/lib32。

• PATH环境变量应该包括:

$ORACLE_HOME/bin

install_dir/bin

例如:

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

在Window系统中配置Cache Connect to Oracle

必须设置PATH系统环境变量包括:

Oracle_install_dir/bin

install_dir/lib

install_dir/bin

例如:

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

C:/timesten/myinstance/bin;

Oracle数据库中安装任务

这部分将讨论操做Oracle DBA必须使用system账号在Oracle数据库上执行。

建立Oracle用户并设置权限

必须指定一个Oracle用户和口令以访问Oracle表和建立缓存集合。全部Oracle用户账号必须授予CREATE SESSION权限,以使用Cache Connect to Oracle。一些Cache Connect to Oracle操做要求另外的Oracle用户权限。

一些Cache Connect to Oracle操做要求一个使用另外Oracle权限的独立的用户。由于可能要求只授予另外缓存管理用户权限来选择用户,因此Cache Connect to Oracle容许建立一个独立的缓存管理用户账号。

关于用于每一个Cache Connect to Oracle操做的Oracle用户和缓存管理用户最小权限显示在表 4.1中。对一每一个缓存管理用户的权限必须包括全部Oracle表能够被缓存到数据存储中,同时Oracle用户也须要特定的指定在由用户建立的缓存集合中的Oracle表的权限。参阅例 4.1。

表 4.1 对于缓存集合操做的Oracle权限要求

缓存集合操做

授予Cache Connect to

Oracle用户的最小权限

授予缓存管理用户的最小权限

全部操做

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

一个也不须要

CREATE READONLY

CACHE GROUP

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• UNLIMITED TABLESPACE

(或在表空间上适当的空间引用 )

• CREATE TABLE①

• CREATE ANY TRIGGER①

CREATE

SYNCHRONOUS

WRITETHROUGH

CACHE GROUP

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

一个也不须要

CREATE

ASYNCHRONOUS

WRITETHROUGH

CACHE GROUP

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• INSERT②

• UPDATE②

• DELETE ②

• QUERY REWRITE③

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

• UNLIMITED TABLESPACE

(或在表空间上适当的空间引用 )

• CREATE TABLE①

CREATE

USERMANAGED CACHE

GROUP(参阅并发行中的变量)

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

一个也不须要

CREATE

USERMANAGED CACHE

GROUP

.....加上 PROPAGATE

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

一个也不须要

CREATE

USERMANAGED CACHE

GROUP

.....加上 AUTOREFRESH

INCREMENTAL

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• QUERY REWRITE ③

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• UNLIMITED TABLESPACE

(或在表空间上适当的空间引用 )

• CREATE TABLE①

• CREATE ANY TRIGGER①

LOAD CACHE GROUP

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

REFRESH CACHE

GROUP

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

FLUSH CACHE GROUP

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

• INSERT TABLE

• UPDATE TABLE

-

使用Real Application Clusters 进行配置的全部操做

• 在Oracle数据库上CREATE SESSION

• SELECT TABLE

在Oracle GV$SESSION上SELECT动态性能视图

①若是Oracle对象是手工安装的,不要求建立缓存集合

②不强从TimesTen执行

③只对于Oracle server version 9.2才要求

例4.1须要为两个用户SamJohn设立权限,使每一个用户能够发送一条CREATE READONLY CACHE GROUP语句来各自建立只读缓存集合。Sam建立一个缓存Oracle表TTUSER.TABLEA的缓存集合,John建立另外一个缓存OracleTTUSER.TABLEB的缓存集合。

为了提供SamJohn充足的Oracle权限来CREATE READONLY CACHE GROUP,须要建立两个Oracle用户账号,而且其中一个缓存管理用户账号将拥有扩展的权限。缓存管理用户的名称为User2

• oracleUID = Sam

• oracleUID = John

• cacheUid = User2

在Oracle上建立账号:

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

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

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

而后为每一个用户分配下列权限:

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

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

SQL> GRANT

> CREATE SESSION,

> SELECT ON TTUSER.TABLEA, TTUSER.TABLEB,

> UNLIMITED TABLESPACE,

> CREATE TABLE,

> CREATE ANY TRIGGER

> TO User2;

SQL>

为缓存管理用户建立一个独立的表空间

TimesTen强烈推荐为缓存管理用户建立一个独立的表空间。此表空间用做缓存管理用户的缺省表空间。此表空间包含有每一个Oracle表的自动刷新触发器、变化日志表和其它对于每一个缓存集合用户TimesTen须要的对象。若是不指定一个独立的表空间,这些对象将放在Oracle system表空间中。

当在Oracle上建立缓存管理用户时,要指定表空间。也能够建立用户以后使用Oracle ALTER USER语句的DEFAULT TABLESPACE子句来指定表空间。

例4.2例 4.1 显示怎样建立并受权给缓存管理用户User2。为了给User2指定一个名为cacheuser的独立表空间,在Oracle中输入下列语句:

SQL> ALTER USER User2 IDENTIFIED BY User2pwd

DEFAULT TABLESPACE cacheuser;

每一个缓存的Oracle表的变化日志表驻留在缓存管理用户表空间中。对于Oracle表上每次更新,将为此Oracle表向变化日志表插入一行(一条变化记录)。变化日志记录的字节大小以下:

变化日志记录的大小 = Oracle表上主键的大小 + 250

变化日志表中的记录数将依赖于Oracle表的更新率和TimesTen上的自动刷新间隔。每隔20秒,TimesTen将删除已经应用到缓存相关Oracle表的数据存储的变化日志记录。

当缓存管理用户表空间写满时

当缓存管理用户表空间变写满时,自动刷新触发器将经过删除已存在的变化日志记录来为新变化日志记录产生空间。这将引发一些TimesTen数据存储上一些表的彻底自动刷新。

若是表空间写满,检查以下内容:

• 是否正在建立一个缓存集合或正在复制一个数据存储?这些临时操做将中止变化日志表上的清除操做。

• TimesTen数据存储上的缓存代理是否正在运行?若是缓存代理没有运行,变化日志记录将堆积。

• 在数据存储中是否没有经过删除自动刷新缓存集合而抛弃的数据存储?在这种状况下,变化日志记录也将堆积。

为缓存表定义DSN

缓存Oracle数据的数据存储必须定义为系统DSN,不能做为User DSN,若是TimesTen缓存不定义为System DSN,则TimesTen Cache Administrator就不能进行工做,并且ttAdmin也不能启动TimesTen缓存代理。

DSN路径必须是一个绝对值。

当为了缓存Oracle表建立DSN时,DSN的属性必须以下设置:

Logging必须激活为disk-based。

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

Isolation能够是任何isolation模式。

OracleID必须设置为Oracle Service Name for Oracle 9i和之后的Oracle版本。

PassThrough能够设置来控制程序和SQL语句是在本地的TimesTen缓存中执行或是传递到Oracle。

DatabaseCharacterSet必须与Oracle数据库字符集相同。

TypeMode必须设置为0(Oracle)。

下列属性能够指定为DSN属性或做为链接属性:

• Oracle User ID指定Oracle用户ID。此字符串经过设置UID链接属性来间接指定。相应的UNIX平台上的DSN属性是UID。在Window系统中,相应的DSN属性是User ID。

OraclePWD为Oracle用户指定口令。

用来链接到Oracle的用户名和口令将从DSN定义的属性中或ODBC链接串中取出。在链接串中给出的值将覆盖指定DSN中的值。

例如,能够在ttIsql链接串中指定Oracle UID和OraclePWD

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

若是经过ODBC应用发送更新并提交,必须在链接串中指定用户名和口令。例如:

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

OraclePWD=mypsswrd", ...);

在UNIX平台上例如,为UNIX平台上的myOraCache定义就以下形式:

[myOraCache]

DataStore=/users/OracleCache/hotData

Authenticate=0

Logging=1

LockLevel=0

PermSize=40

TypeMode=0

DurableCommits=1

OracleID=system1

UID=testuser

OraclePWD=mypsswrd

DatabaseCharacterSet=WE8ISO1559P1

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

启动和中止缓存代理

一个TimesTen进程调用一缓存代理来执行异步缓存操做,如加载或刷新缓存集合。许多Cache Connect to Oracle操做能够直接经过TimesTen进行,而不须要缓存代理的协助。

若是下列之一或多个情形为真,则必须为每一个包含缓存集合的数据存储启动一个独立的缓存代理:

• 缓存集合为READONLY。

• 缓存集合为USERMANAGED而且包含一条AUTOREFRESH子句。

• 应用加载或刷新缓存集合。

能够从命令行或一个程序来为一个DSN启动缓存代理。

也可从基于浏览器的Cache Administrator来启动缓存代理。

注意:若是安装TimesTen时激活了Access Control,必须拥有数据存储的ADMIN权限来启动或中止缓存代理。另外,TimesTen用户名必须与Oracle用户名相匹配(应用到内部和外部的用户名)。

从命令行控制缓存代理

使用ttAdmin工具来从命令行控制缓存代理。可使用ttAdmin来:

• 从命令行设置缓存管理用户ID和口令

• 从命令行启动缓存代理

• 从命令行中止缓存代理

• 从命令行设置代理启动性质

从命令行设置缓存管理用户ID和口令

若是使用下列之一的缓存集合类型,则必须有一个拥有相应Oracle权限的缓存管理用户账号:

• ASYNCHRONOUS WRITETHROUGH缓存集合

• READONLY缓存集合

• 使用AUTOREFRESH属性的USERMANAGED缓存集合

缓存管理用户ID必须遵照下列规则:

• 长度为1到30字节。

• 必须以字母开头。

• 只能包含ASCII字母、下划线(_)、美圆符号($)和英镑符号(#)。

缓存管理口令必须遵照下列规则:

• 长度为1到30字节。

• 能够包含除了分号(;)外的任何ASCII字符。

在启动缓存代理以前设置缓存管理用户ID和口令。使用以下语法:

ttAdmin -cacheUidPwdSet -cacheUidcacheUid-cachePwdcachePwd DSN

注意:若是数据存储中有自动刷新或AWT缓存集合,则缓存管理用户ID和口令不能进行从新设置。在从新设置缓存管理用户ID和口令以前,必须删除那些缓存集合。

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

若是改变了缓存管理用户ID或口令,则必须从新启动缓存代理。

注意:若是在数据存储中没有缓存集合,则不要设置缓存管理用户ID和口令。若是没有缓存集合时设置了它们,将不会使用缓存管理用户ID和口令,并校验到Oracle数据库。

从命令行启动缓存代理

为了人命令行启动缓存代理,使用以下语法:

ttAdmin -cacheStartDSN

例 4.4ttAdmin -cacheStart myOraCache

若是试图为在DSN中使用相关路径标识的数据存储启动缓存代理,TimesTen将搜索TimesTen运行和失败的相关数据存储。例如,在Window系统中,若是在DSN中为数据存储指定路径为DataStore=./dsn1,而且试图使用下面命令启动缓存代理:

ttAdmin -cacheStart dsn1

缓存代理在install_dir/srv/dsn1中搜索数据存储。将不能在此位置找到数据存储,也不能启动缓存代理。对于UNIX,缓存代理将查找:

/var/TimesTen/ttversion/bits

从命令行中止缓存代理

为了中止代理,使用以下语法:

ttAdmin -cacheStopDSN

例 4.5ttAdmin -cacheStop myOraCache

注意:使用AUTOREFRESH特性时,在删除或改变缓存集合以后,不要当即中止缓存代理。应该至少等待2分钟。缓存代理须要这个时间来清除AUTOREFRESH使用的Oracle对象。

从命令行设置缓存代理启动性质

能够经过调用ttCachePolicySet程序来设置缓存代理启动性质。使用ttCachePolicyGet程序来返回当前的性质。

缺省的缓存代理启动性质是manual。若是要在TimesTen守护程序从新启动时将缓存代理自动从新启动,则设置缓存代理性质为always。一旦设置性质为always,缓存代理将当即启动。

例4.6设置缓存代理性质为always

CALL ttCachePolicySet ('always');

从程序控制缓存代理

为了从程序中控制数据存储的缓存代理,首先链接到数据存储。使用ttCacheUidPwdSetttCacheStart、ttCacheStopttCachePolicySet程序来执行下列任务:

• 从程序设置缓存管理用户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.9sprintf( 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.15AWTdsn数据存储启动复制代理。

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-repStopDSN)。

应用缓存集合定义到数据存储

若是有定义缓存集合的SQL文件,就能够在TimesTen数据存储上使用带有-f选项的ttIsql工具来执行此SQL。语法是::

ttIsql -ffile.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语句的参数分配数据类型。应用将得到分配的数据类型来使用SQLDescribeParamODBC函数。与此相比,passthrough语句的参数将不会为它们分配数据类型。TimesTen将报告passthrough语句的参数的数据类型为VARCHAR2(4000)。此数据类型只是一个占位符。它不意谓着TimesTen指望做为VARCHAR2数据来接收此参数值。做为替代,当应用调用SQLBindParameterODBC函数时,必须通知TimesTen关于passthrough语句参数的数据类型。SQLBindParameter的fSqlType参数指定参数的SQL数据类型。若是使用,cbColDef和ibScale参数指定精度和比例。

例如,为了绑定一个SQL数据类型INTEGER的参数为NUMBER(3)参数,使用下列参数调用SQLBindParameterODBC函数:

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命令

能够经过使用ttIsqlcachegroup命令来得到关于数据存储中当前使用中的缓存集合的信息,以下面例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对象,登陆以下:

sqlpluscacheUid/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标志的ttIsqlcachesqlget命令来获取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程序中执行此代码。