用 solidDB 和 DB2 for Linux, UNIX, and Windows 实现 SQL passthrough

使用 solidDB SQL Editor

SQL passthrough 是 IBM® solidDB® Universal Cache 中的一个特性,支持应用程序只使用一个连接就可从前端和后端数据库访问数据。您可以将该特性配置为默认的,或者在运行时针对一个事务或一个会话启用它。本文介绍了配置和使用 SQL passthrough 的方法。

Amit Bhattacharya, 软件测试专家, IBM China

Amit Bhattacharya 的照片Amit Bhattacharya 在班加罗尔 IBM 印度软件实验室的 DB2 Functional Verification Test 团队工作。他主要专注于 SQL 兼容性领域。加入 IBM 之前,他在 Microsoft 和 Sybase 工作。Amit 喜欢研究新产品和为客户构建示例演示。他开展了 solidDB 培训项目,已经安装并设置了 solidDB 用于概念验证演示。



2011 年 1 月 21 日

概述

本文介绍了如何在 AIX® 环境下的 solidDB V6.5 数据库与 Windows® 环境下的 DB2® v9.7 数据库之间配置 SQL passthrough。我将介绍配置 SQL passthrough 所需的各种参数,并提供一个配置示例。本文还通过一个示例,使用 solidDB SQL Editor 展示如何将查询传递到后端、或如何在 solidDB 前端执行查询,具体取决于 passthrough 模式。

SQL passthrough 往往是同 solidDB Universal Cache 系统一起使用的。然而,本文将介绍在没有 InfoSphere® Change Data Capture (CDC) 组件(包含在 solidDB Universal Cache 设置中)交互的情况下对 SQL passthrough 的使用。


什么是 SQL passthrough?

SQL passthrough 是 solidDB 中的一个特性,支持应用程序使用一个连接在前端和后端数据库访问数据。该特性默认情况下通过配置参数启用,对于一个会话或事务,使用 solidDB 管理命令启用。本文将介绍这两种配置 SQL passthrough 的方法。

启用了 SQL passthrough 后,当从应用程序执行一个 SQL 查询时,solidDB 试着在前端 solidDB 数据库中搜索相关数据表。如果不能找到这个数据表,将传递 SQL 查询到后端数据库并返回对应的结果。SQL 查询要么整体传递,要么都不传递。查询绝不可能在一个数据库执行一部分,在另一个数据库执行另一部分。

您可以针对以下 3 个行为之一配置 SQL passthrough:

  • NONE:SQL 语句绝不传递到后端。
  • FORCE:不考虑数据表是否在前端,SQL 语句总是在后端数据库中执行。
  • CONDITIONAL:如果数据表在前端数据库中,SQL 语句将在前端执行。如果表格不在前端,SQL 数据将被传递到后端。

设置 SQL passthrough 的关键参数和注意事项

准备使用 SQL passthrough 时,记住这些注意事项:

  • SQL passthrough 总是在前端 solidDB 服务器中配置。
  • 配置 SQL passthrough 之前,IBM Data Server Driver for ODBC and CLI 必须安装在前端,不管有没有驱动程序管理器,您都可以使用 IBM Data Server Driver for ODBC and CLI(没有时,直接链接)。本文的示例使用直接链接。

SQL passthrough 配置参数

所有这些 passthrough 相关的参数都在 solid.ini 文件的 [Passthrough] 部分。

  • RemoteServerDriverPath:该参数为后端数据特定服务器 ODBC 驱动程序指定驱动程序路径。当使用 solidDB 在后端执行查询时,ODBC 驱动程序被加载。
  • RemoteServerDSN:该参数指定后端连接字符串(直接链接)或数据源名称(驱动程序管理器)。在本文中使用的是连接字符串。
  • Force32bitODBCHandles:当后端服务器是 DB2 for Linux®, UNIX®, and Windows (DB2 LUW),且 IBM Data Server Driver For ODBC And CLI 使用直接链接时,该参数在 64 位环境中是必需的。该参数强制 passthrough 模块为后端 ODBC 驱动程序使用 32 位 ODBC 处理程序。
  • SqlpassthroughRead/SqlpassthroughWrite:这些参数指定读取和写入语句的默认 passthrough 模式。可能值为 NONE、CONDITIONAL 和 FORCE,如前文所示。

注意:这个 passthrough 模式在运行时可使用 SET PASSTHROUGH 和 SET TRANSACTION PASSTHROUGH 语句予以更改。


系统要求

本文的示例使用以下软件:

表 1. 示例场景中使用的软件
操作系统软件
AIX 6.1IBM solidDB V6.5.0.2 Fix Pack 2
IBM Data Server Driver For ODBC And CLI V9.7.0
Windows 2008 ServerIBM DB2 V9.7 Fix Pack 1 for Windows

在 solidDB 与 DB2 Linux, Unix, and Windows 之间设置 SQL passthrough

设置前端(AIX 6.1 机器)

  1. 创建一个用户 “solid” 并作为新用户登录。
  2. 在以下路径安装 solidDB 6.5.0.2 FP2 作为用户 “solid”
    /home/solid/solidDB6.5.0.2
  3. /home/solid 下创建一个 solid_db 目录。数据库文件将创建在这个目录下。
  4. 将许可文件(solid.lic)复制到 /home/solid/solid_db
  5. 转到 /home/solid/solid_db。创建一个名为 MYSOLD 的 solidDB 数据库,用户名为 “mysoluser”,密码为 “mysolpwd”。使用以下命令:
    solid -f -x exit -Umysoluser -Pmysolpwd -CMYSOLDB:
  6. 停止 solidDB 服务器,使用命令:
    solcon -eshutdown MYSOLDB mysoluser mysolpwd
  7. 创建一个空 solid.ini 文件,将以下条目复制到文件中。
    清单 1. solid.ini 文件条目
    [General]
    DefaultStoreIsMemory=yes
    
    [IndexFile]
    Cachesize=100M
    
    [LogReader]
    LogReaderEnabled=yes
    
    [Logging]
    DurabilityLevel=1
    
    [Com]
    Listen=tcp 21315
    
    [Data Sources]
    SOLDB=tcp 21315
  8. 再次从 /home/solid/solid_db 启动 solidDB 服务器,使用命令
    solid

    solidDB 服务器启动,包含 solid.ini 文件中定义的条目。
  9. 在以下路径安装 IBM Data Server Driver for ODBC and CLI。
    /home/solid/software/odbc_cli/
  10. 提取共享库(/home/solid/software/odbc_cli/clidriver/lib/libdb2.a),生成 64 位操作系统所需的 shr_64.o。为了避免混淆,将文件重命名为 libdb2.so。使用如下命令:
    cd /home/solid/software/odbc_cli/clidriver/lib/ 
    ar -x -X 64 libdb2.a
    mv shr_64.o libdb2.so

    这些步骤在 AIX 上是必需的,因为 solidDB 将自动加载驱动程序。稍后,libdb2.so 文件名将作为 Passthrough.RemoteServerDriverPath 参数。
  11. 设置 DB2NOEXITLIST 环境变量为 ON。
    export DB2NOEXITLIST=ON

设置后端(Windows 2008 Server 机器)

  1. 创建一个 Windows 用户 “db2admin”。
  2. 安装 DB2 V9.7.0 Fix Pack 1。
  3. 创建一个名为 SAMPLE 的 DB2 数据库,用户 “db2admin”,密码 “db2admin”。该用户需要在 SAMPLE 数据库中创建、修改和删除数据表的权利。

在 solidDB 配置文件中配置 SQL passthrough

配置 SQL passthrough 模式和启用该特性之前,您需要在 solid.ini 配置文件中定义 ODBC 驱动程序与后端数据库之间的连接。可以通过两种方式创建连接:通过直接链接或使用驱动程序管理器。

本文中使用的是直接链接。下面示例中,DB2 数据服务器节点的 IP 地址是 9.126.84.161,端口为 50000。

以下步骤显示如何配置前端 solidDB 与后端 DB2 服务器之间的连接。

  1. 登录到 AIX 计算机,然后打开 solid.ini 文件。
  2. 在 SQL passthrough 下添加以下代码行:
    清单 2. AIX 上 solid.ini 文件的条目
    [Passthrough]
    RemoteServerDriverPath=/home/solid/solid_db/odbc_cli/clidriver/lib/libdb2.so
    RemoteServerDSN="Driver={IBM DB2 ODBC Driver};Database=sample;Hostname=9.126.84.161;
    Port=50000;Protocol=TCPIP;"
    Force32bitODBCHandles=yes
    passthroughEnabled=yes
    SqlpassthroughRead=Conditional
    SqlpassthroughWrite=Conditional
  3. 保存文件然后退出。

使用 solidDB SQL Editor (solsql) 演示如何显示 solidDB 与 DB2 LUW 之间的 SQL passthrough

示例:CONDITIONAL passthrough 模式

在这个示例中,SQLpassthroughRead 和 SQLpassthroughWrite 参数被设置为 CONDITIONAL。

执行下一步之前,您需要确保服务器启动且正常运行。

  1. 连接到 DB2 数据库并使用以下命令创建测试数据表:
    清单 3. 创建测试数据表
    1) Start->Run->db2cmd
    2) db2 "connect to sample user db2admin using db2admin"
    3) db2 "create table testtab(name varchar(20), id int)"
    4) db2 "insert into testtab values
    ('John', 435617),
    ('Sally', 564876),
    ('Larry', 987290)"
    5) db2 "commit"
    6) db2 "select * from testtab"
    
    NAME                 ID
    -------------------- -----------
    John                      435617
    Sally                     564876
    Larry                     987290
  2. 如果服务器已经启动,使用以下命令停止 solidDB 服务器。否则跳过这一步。
    solcon -eshutdown SOLDB mysoluser mysolpwd
  3. 在前端,转至 /home/solid/solid_db,然后使用以下命令启动 solidDB 服务器:
    solid
  4. 启动 solidDB SQL 编辑器,然后使用以下命令连接到 solidDB 数据库:
    solsql SOLDB mysoluser mysolpwd
  5. 使用以下命令创建后端登录数据:
    create remote server MYSERVER username 'db2admin' password 'db2admin';
    commit work;

    CREATE REMOTE SERVER 语句在 SYS_SERVER 表中存储后端服务器的登录数据。您可以查询 SYS_SERVER 表的内容但是不能直接修改 SYS_SERVER 表。另外, SYS_SERVER 表的 PWD 列显示为 NULL,因为密码是隐藏的。

    提示:如果 SYS_SERVER 已含有登录数据,您将看到以下错误:

    SOLID Table Error 13460: Server <server_name> already exists

    在这种情况下,使用 DROP REMOTE SERVER 语句清除登录数据,然后重新创建登录数据:

    清单 4. 清除和重建登录数据
    drop remote server;
    commit work;
    
    select * from sys_server;
    NAME     DRIVER     CONNECT      UID       PWD
    
    ----     ------     -------      ---       ---
    
    0 rows fetched.
    
    create remote server MYSERVER username 'db2admin' password 'db2admin';
    commit work;
  6. 要验证 CONDITIONAL 模式的 passthrough 特性的有效性,在 solidDB 上执行 SQL 语句,如下所示。
    1. 查询 testtab 表。
      清单 5. 测试条件 passthrough
      select * from testtab;
      	
      NAME                      ID
      ----                      --
      John                  435617
      Sally                 564876
      Larry                 987290
      3 rows fetched.

      结果:由于 SQLpassthroughRead 参数被设置为 CONDITIONAL 且前端没有 ‘testtab’ 表,那么 solidDB 将传递 SQL 语句然后从后端 DB2 数据库中获取数据。

    2. 使用以下命令在 solidDB 数据库中创建一个 testtab 表:
      create table testtab(name varchar(20), id int);
      commit work;
    3. 添加以下数据到 testtab 表。
      insert into testtab values('Amit', 663456);
      commit work;
    4. 再次查询 testtab 表。
      select * from testtab;
      	
      NAME		ID
      ----		--
      Amit		663456
      1 rows fetched.
      
      commit work;

      结果:SQL 查询获取到出现在前端的一个行。这是因为 solidDB 能够在前端数据库中找到 SQL 语句引用的数据表。

示例:动态修改 SQL passthrough 模式

使用 SET TRANSACTION PASSTHROUGH 和 SET PASSTHROUGH 语句,可以在每个会话或每个事务中重写在配置文件中指定的默认 SQL passthrough 模式。

  1. 要为一个事务设置 passthrough,使用以下命令:
    1. 将下一个事务的 read-level passthrough 模式设置为 FORCE。
      set transaction passthrough read force;
    2. 查询 testtab 表。
      select * from testtab;
      	
      NAME                      ID
      ----                      --
      John                  435617
      Sally                 564876
      Larry                 987290
      3 rows fetched.

      结果:后端 testtab 表中的数据显示,因为将 passthrough Read 级别设置为 FORCE。FORCE 意味着无论 testtab 表是否在前端数据库中,应用程序都将从后端数据库查询数据。

    3. 再次提交事务和发出 SQL 查询。
      commit work;
      select * from testtab;
      	
      NAME                      ID
      ----                      --
      Amit                  663456
      1 rows fetched.

      结果:现在,查询显示前端数据,因为仅为一个事务将 Read passthrough 模式设置为 FORCE。

  2. 要为一个会话建立 passthrough,使用以下命令:
    1. 将会话的 read-level passthrough 模式设置为 FORCE。
      set passthrough read force;
      commit work;
    2. 查询 testtab 表。
      select * from testtab;
      
      NAME                      ID
      ----                      --
      John                  435617
      Sally                 564876
      Larry                 987290
      3 rows fetched.
    3. 再次提交事务和发出 SQL 查询。
      commit work;
      select * from testtab;
      
      NAME                      ID
      ----                      --
      John                  435617
      Sally                 564876
      Larry                 987290
      3 rows fetched.

      结果:多次执行查询从后端返回数据,这是因为整个会话的 read-level passthrough 模式都被设置为 FORCE。


结束语

本文呈现了成功设置 SQL passthrough 所需的基本步骤和参数,还分步展示了如何使用各种参数以及它们如何影响 SQL passthrough。看完这篇文章之后,读者应该可以成功配置 SQL passthrough 了。


致谢

衷心感谢 Jussi Vuorento 对本文的技术审核,感谢 Katriina Vakkila 对本文内容的审查。没有他们的支持和鼓励也就没有这篇文章。

参考资料

学习

获得产品和技术

  • 以最适合您的方式 评估 IBM 产品:下载产品试用版,在线试用产品,在云环境下试用产品,或者在 SOA Sandbox 中花费几个小时来学习如何高效实现面向服务架构。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=619054
ArticleTitle=用 solidDB 和 DB2 for Linux, UNIX, and Windows 实现 SQL passthrough
publish-date=01212011