魔方网表 让信息化更简单

 找回密码
 注册
查看: 6723|回复: 5

Cloudscape Version 10:技术概述

[复制链接]
admin 发表于 2009-6-19 18:25:00 | 显示全部楼层 |阅读模式
级别: 初级

Kathy Saunders ([email]ksaunder@us.ibm.com[/email]), Cloudscape 发行和 QA 经理, IBM
Jean Anderson ([email]jander@us.ibm.com[/email]), Cloudscape 社区架构师, IBM


2004 年 8 月 01 日

IBM® Cloudscape? 轻量级的、基于纯 Java? 技术的可嵌入架构,使其成为部署数据库驱动的 Java 应用程序的理想数据库引擎。使用 Cloudscape,数据库引擎可以成为应用程序的一部分,因此,用户不必对其进行安装和管理。本文重点介绍了用于 Java 技术的 Cloudscape 的可嵌入 SQL 数据库引擎,并提供了一些 Cloudscape 技术特性的概述。
简介

Cloudscape 是一个以 Java 类库形式提供的、轻量级的、可嵌入的关系引擎。它的本机接口是带有 Java 关系扩展的 Java Database Connectivity(JDBC)。它实现了 SQL92E 标准和许多 SQL 99 扩展。该引擎提供了事务和崩溃恢复,支持多个连接,而且支持使用一个连接的多个线程。因为 Cloudscape 是一个 Java 类库,您可以很容易地将它嵌入到任何 Java 应用程序或服务器架构中,同时还不会损害该应用程序的 Java 特性。当需要扩充数据库时,Cloudscape 支持复杂 SQL 事务和 JDBC,该特性允许它将应用程序迁移到其他 SQL 数据库,例如 IBM DB2® Universal Database?(UDB)。

Cloudscape 网络服务器(Network Server)为 Cloudscape 数据库提供了单个系统或一个网络中的多用户连通性。Cloudscape 网络服务器通过标准的分布式数据库架构(DRDA)协议接收并响应来自客户机的查询。您可以利用 Cloudscape 网络服务器,使用 IBM JDBC 驱动程序和 DB2 UDB JDBC 通用驱动程序来访问数据库。(在使用网络服务器时,并非所有的 Cloudscape 功能都受支持。请参阅 Cloudscape Server and Administration Guide,来获得有关细节。)

可以从许多技术方面来区分 Cloudscape 和其他数据库系统:

Cloudscape 易于管理。当嵌入到客户机应用程序中时,Cloudscape 系统不需要任何管理干预。
Cloudscape 是可嵌入的。应用程序可以将数据库管理系统(Database Management System,DBMS)引擎嵌入应用程序进程中,从而无需管理单独的数据库进程或服务。
通过网络服务器(Network Server)架构或您选择的服务器架构,可以将Cloudscape 作为单独的进程来运行。
Cloudscape 是一个纯 Java 的类库:对于 Java 开发人员,这点十分重要,因为他们正试图维护 Java 技术的优点,例如平台无关性、易于配置以及易于安装。
Cloudscape 不需要专有的 Java 虚拟机(Java Virtual Machine,JVM)。因为完全是用 Java 语言编写的,所以它适应所有合格的 JVM。
Cloudscape DBMS 引擎是轻量级的。类文件大小大约是 2MB,并且只使用了 4MB 的 Java 堆。
Cloudscape 支持使用 Java 编写存储过程和函数,这些存储过程和函数可以在应用程序的任何层上运行。Cloudscape 没有专用的存储过程语言,它使用 JDBC。
Cloudscape 与其他的关系数据库系统类似。它实现了 SQL92E 语言标准和 JDBC API 标准。Cloudscape 也有事务(提交和回滚),能够通过事务隔离支持多个连接,并提供了崩溃恢复。与其他数据库一样,它允许多个线程共享同一连接,而且,随着对 Java 技术进行扩展,Cloudscape 也实现了许多 SQL99 特性。

这种技术功能的独特组合允许应用程序开发人员构建数据驱动的应用程序,这些应用程序是普遍的(到处运行)、可部署的(可下载的)、可管理的、可扩展的和可连接的。本文将讨论这些技术特性,其中包括:

通用架构
作为可嵌入类库的数据库引擎
程序员的应用程序接口(API)
JDBC 驱动程序
关系数据库管理系统(Relational Database Management System,RDBMS)功能
安全特性
已签署的 Java 类文件档案(JAR)文件
加密的数据库
外部用户身份验证
Java 扩展
Java 函数
在触发器中使用 Java 函数
Java 存储过程
从数据库装入 Java 类
结束语





回页首




通用架构

Cloudscape 是作为 Java 类库实现的关系数据库管理引擎。应用程序可以通过 JDBC API 访问 Cloudscape 引擎管理的数据。

作为可嵌入类库的数据库引擎

该数据库引擎是可嵌入的。这意味着该数据库引擎软件并不是作为单独的进程运行,而是可以包含在应用程序中,以便该应用程序和数据库引擎在同一 JVM 中运行。在嵌入时,应用程序使用 JDBC API 来访问数据库。嵌入式的 JDBC 驱动程序将数据送入和送出数据库引擎,无需进行网络通信。无论是否嵌入,该数据库引擎都支持同时进行多个连接,并支持从多个应用程序线程进行访问。


图 1. 嵌入应用程序的 Cloudscape


还可以将 Cloudscape 部署为传统的客户机/服务器的数据库服务器。为此,需要将 Cloudscape 嵌入到服务器架构中。服务器架构只是一种可以接收并处理网络通信的软件。您可以从 Cloudscape 服务器版中获得 Cloudscape 网络服务器(Network Server)特性。而且还可以在您选择的服务器架构中运行 Cloudscape。


图 2.Cloudscape 在服务器架构中充当客户机/服务器 DBMS


将 Cloudscape 嵌入 Java Web 服务器(例如 IBM WebSphere® Application Server)非常容易。图 3 展示了嵌入 Java Web 服务器的 Cloudscape,其客户机通过向 servlet 发出超文本传输协议(Hypertext Transfer Protocol,HTTP)请求来访问数据库。


图 3. 嵌入 Web 服务器的 Cloudscape


Cloudscape 通过在磁盘文件中存储数据提供了数据的持久存储。Cloudscape 引擎可以管理一个或多个数据库文件,但是每个数据库文件只能由一个 Cloudscape 引擎访问。在客户机/服务器的配置中,该引擎在其控制下提供了对数据库的多用户访问。访问该数据库的所有线程都是通过该数据库引擎来进行的。


图 4. 对 Cloudscape 的线程访问


数据库磁盘文件中的数据是以一种可移植的格式来存储,以便能够很容易地在机器之间传送数据库,而不管机器的 CPU 架构如何。Cloudscape 还可以处理只读介质上的数据文件。这些特点使得您可以很容易地将 Cloudscape 应用程序及其数据库一起下载,或从 CD-ROM 运行它们。可移植数据库格式和纯 Java DBMS 引擎的结合,使得在任何地方(介质或网络上)都可以发布以数据为中心的(data-centric)的应用程序。

Cloudscape 为系统设计师提供了很多灵活性。每个 Cloudscape 实例可以管理多个数据库,数据库可以存储在于不同的介质上,而且,没有东西阻止应用程序连接其他 DBMS 系统。


图 5. 灵活的应用程序架构


程序员的 API

应用程序通过行业标准的 JDBC API 访问数据库。当客户机应用程序需要向数据库中存储数据或从数据库检索数据时,就通过 JDBC API 向 Cloudscape 引擎提交请求(在网络上或者直接向嵌入式引擎提交)。使用任何特定于 Cloudscape 的 API 都不需要客户机程序;客户机只使用 JDBC。 Cloudscape 驱动程序是通过提供 Cloudscape JDBC 连接统一资源定位符(Uniform Resource Locator,URL)来选择的,如清单 1 所示。


清单 1. Cloudscape JDBC 连接 URL
Connection conn = DriverManager.getConnection("jdbc:cloudscape:greetdb");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT message FROM greetings");
while (rs.next())
{
    String greeting = rs.getString(1);
    System.out.println(greeting);
}
rs.close();
stmt.close();
conn.close();


因为该应用程序只使用 JDBC API,所以它是可移植的,而且可以对其他供应商提供的 JDBC 兼容的数据库运行该应用程序。这种标准兼容性使得开发人员可以对 Cloudscape 编写应用程序,然后对另一 DBMS 部署该应用程序。

当客户机从 DBMS 请求数据时,JDBC 驱动程序将数据从数据库复制到应用程序中。直到使用 JDBC 调用将修改送回 DBMS,在应用程序中对该数据有意或无意的修改都不会影响数据库中的数据。同样,当客户机将数据存储在 DBMS 中时,也会将该数据从客户机中复制到 DBMS。因为 Cloudscape 支持事务,所以可以将复杂的数据操作组合成事务。通过确保要么将事务中所有的操作提交给数据库文件,要么不提交事务中的任何操作,Cloudscape 保证了数据的一致性,即使是系统出现故障也不例外。


图 6. 从 DBMS 复制到应用程序的对象


可以在 [url]http://java.sun.com/jdbc[/url] 上找到关于 JDBC 的更多信息。

JDBC 驱动程序

Cloudscape 提供了两个用来从 Java 客户机程序访问 Cloudscape 的驱动程序。一个是 Type 4 驱动程序:客户机上的纯 Java,并且直接连接数据库引擎,无需任何中间转换。另一个是嵌入式驱动程序,当在与应用程序相同的 JVM 中运行时,可以使用该驱动程序与 Cloudscape 进行通信。网络服务器中包含的驱动程序是 IBM JDBC 驱动程序,即DB2 UDB JDBC 通用驱动程序(Universal Driver)。

到 Cloudscape 数据库的 JDBC 连接 URL 都是以前缀 jdbc:cloudscape: 开始的。驱动器 e: 上的嵌入式数据库的连接 URL 可能如下所示: jdbc:cloudscape:e:/db 。到网络服务器的连接 URL 可能如下所示: jdbc:cloudscape:net://localhost:1527/mydb 。

Cloudscape JDBC 驱动程序支持 JDBC 2.0 和 3.0;它们使用 JVM 1.3.1 及其更高版本。而且还提供了用于 JNDI 数据源、连接池和 XA 的标准扩展。这些特性使得 Cloudscape 成为了分布式 J2EE 系统中的资源管理器。






回页首




RDBMS 功能

Cloudscape 通过用于 Java 的扩展实现了 SQL92E 语言标准和许多 SQL99 特性。SQL 语言支持包括下列内容:

基本类型:CHAR、DECIMAL、DOUBLE PRECISION、FLOAT、INTEGER、NUMERIC、REAL 和 SMALLINT
日期时间(Datetime)数据类型(来自 SQL92T):DATE、TIME 和 TIMESTAMP(通过 JDBC date/time 转义语法)
其他类型: BIGINT、VARCHAR、CHAR FOR BIT DATA、VARCHAR FOR BIT DATA、LONG VARCHAR、LONG VARCHAR FOR BIT DATA、BLOB 和 CLOB
基本的数学操作:+、*、-、/、一元 + 和一元 -
基本比较:<、>、<=、>=、<> 和 =
用字母数字表示的日期时间
内置函数: ABS or ABSVAL、 CAST、 LENGTH、连接(||)、 NULLIF 和 CASE 表达式、 CURRENT_DATE、 CURRENT_ISOLATION、 CURRENT_TIME、 CURRENT_TIMESTAMP、 CURRENT_USER、 DATE、 DAY、 HOUR、 IDENTITY_VAL_LOCAL、 LOCATE、 LCASE 或 LOWER、 LTRIM、 MINUTE、 MOD、 MONTH、 RTRIM、 SECOND、 SESSION_USER、 SQRT、 SUBSTR、 TIME、 TIMESTAMP、 UCASE 或 UPPER、 USER 和 YEAR
基本谓词:BETWEEN、LIKE 和 NULL
限定性谓词:IN、ALL、ANY/SOME 和 EXISTS
CREATE 和 DROP SCHEMA
CREATE 和 DROP TABLE
检查约束
ALTER TABLE:ADD COLUMN 和 ADD/DROP CONSTRAINT
CREATE 和 DROP VIEW
约束:NOT NULL、UNIQUE、PRIMARY KEY、CHECK 和 FOREIGN KEY
级联删除
列默认值
定界标识符
可更新的游标(通过 JDBC)
动态 SQL(通过 JDBC)
INSERT、UPDATE 和 DELETE 语句
定位更新和删除
WHERE 限制
GROUP BY
HAVING
ORDER BY
UNION 和 UNION ALL
作为表达式的子查询(来自 SQL92F)
WHERE 从句中的连接(join)
连接(SQL92T):INNER、RIGHT OUTER、LEFT OUTER、命名列连接和条件连接
聚合函数(带有 DISTINCT):AVG、COUNT、MAX、MIN 和 SUM
Select 表达式
SELECT *、SELECT table.*(SQL92T)、SELECT DISTINCT 和 select 表达式
命名选择列
SQLSTATE
视图中的 UNION(SQL92T)
CAST(SQL92T)
INSERT 表达式(SQL92T): insert into T2 (COL) select col from T1
VALUES 表达式: select * from (values (1, 2)) as foo(x, y) 等
触发器
其他传统的数据库功能包括:

基于成本的查询优化器:连接次序、索引选择、批量预取、连接策略(嵌套循环或散列)、排序避免、锁升级、子查询的扁平化、传递闭包以及其他许多查询转换。它使用了一项不需要任何干预的独特抽样技术来进行统计收集,而且还提供了查询计划重写,并在实际查询结果上进行数字统计
多列 B-Tree 索引
未限制行的长度,并可以将发送给客户机的列值转化为“流”
通过快速装入(fast-load)和快速创建(fast-create)索引导入/导出数据
事务提交和回滚
事务隔离(可串行化读、可重复读、读取提交数据或脏读)
崩溃恢复
多个并发连接
多线程连接
行锁定,具有到表锁的升级
用户和连接验证:内置 SH3、应用程序定义的或通过外部用户身份验证系统(LDAP、NIS+ 和 JNDI)
诊断和一致性检查
在线数据库备份
本地化
数据库加密
脚本工具, ij
DDL 检查工具, cslook
修改列以更改其长度或可为空特性
为数据的自动序列号指定默认值





回页首




安全特性

Cloudscape 包含了一些安全特性,以检测已签署的 JAR 文件,将数据库到部署到远程站点,并将其集成到现有的用户身份验证模式中。

已签署的 JAR 文件

在 Java 2 环境中,Cloudscape 可以检测 JAR 文件上的数字签名。在从数据库中存储的已签署的 JAR 文件装入一个类之前,Cloudscape 将验证该 JAR 是否已签署了 X.509 证书,并验证签名有效性。

加密的数据库

当将数据库部署到远程或移动位置上时,不可能使用物理安全性来阻止对数据的未授权访问。如果可以读取该数据文件,老练的用户很可能会破解它们所包含的信息。在这种环境中,保证数据安全的惟一方法就是在磁盘上对其进行加密。这样就只能读取数据库文件,而不会暴露数据。

Cloudscape 支持安全的远程数据的数据库加密。当取读该数据库中的数据时,数据库引擎将对所有数据库进行解密,而当写回到磁盘时,又会再次对它们进行加密。数据库文件中没有以明文(clear-text)的形式存在的数据。因为整个数据库都被加密,所以也隐藏了数据库模式的结构。

要使用加密的数据库,就必须在第一次启动数据库时,提供一个启动口令。该口令不同于通常的数据库连接用户名和口令(也必须提供,以便访问该数据库)。若没有启动口令,就无法启动该数据库。

对于将数据库分布到无法保证文件物理安全性的位置上的应用程序来说,数据库加密十分有用。例如,如果笔记本计算机被盗,那么笔记本计算机上的移动数据库就可能被盗。如果远程管理员没有适当地保护文件,安装在远程多用户机器上的应用程序很容易被未经授权的用户访问。

数据库加密增加了不到 10% 的性能开销,且不占用额外的磁盘空间。它基于 1.2.1 版的 Java 密码术扩展(Java Cryptographic Extension,JCE)而设计。用户可以使用数据加密标准(Data Encryption Standard,DES)作为默认的加密方法,或者可以配置自己要使用的算法。

外部用户身份验证

Cloudscape 还提供了集成到外部用户身份验证模式中的支持。除了维护内部授权用户列表,还可以配置 Cloudscape ,通过外部身份验证服务对其进行检查。Cloudscape 提供了对轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)和网络信息系统(NIS+)的支持,并通过用户定义的 Java Naming and Directory Interface(JNDI)类支持定制模式。

不在数据库中维护用户名和密码意味着可以减少管理开销(将名称传送给数据库)。在必须以尽可能少的管理开销进行部署的服务器应用程序中,这点尤为重要。

LDAP 是新兴的 Internet 标准,提供了运行于 TCP/IP 之上的开放式目录访问协议。通过使用 Netscape NT 同步服务(Synchronization Service),可以由 LDAP 提供 Windows NT ? 域用户身份验证。NIS+ 是 NIS 名称服务的增强版,可用于 Sun Solaris 操作系统上。

因为 Cloudscape 是一个嵌入式系统,所以它提供了简单的用户授权控制。可以将用户限制为只读访问或将他们限制在每个系统或每个数据库级别上进行访问。这确保了只有许可的、已验证的用户才能访问或修改数据库。






回页首




Java 扩展

Cloudscape 支持下列 Java 扩展:

Java 函数
在触发器中使用 Java 函数
Java 存储过程
从数据库装入 Java 类
以下小节中的实例假定数据库中有 ADDRESS 表和 ZIPMAP 表,ZIPMAP 表映射 ZIP 代码和城市。清单 2 展示了这些表的模式。


清单 2. 示例模式
CREATE TABLE address (name VARCHAR(60), street VARCHAR(255), zipcode INTEGER)
CREATE TABLE zipmap  (zipcode INTEGER, city VARCHAR(255))


Java 函数

Java 函数由可以从 SQL 调用的 Java 代码构成。可以在支持 SQL 表达式的 SQL 语句中调用 Java 函数。也可以用 VALUES 关键字或在触发器中调用它。

例如,清单 3 在 ZipMap 类中创建了一个函数,通过给定的 ZIP 代码查找城市名称(为了简便起见,省略了错误和异常处理)。


清单 3. 示例函数的源代码
public class ZipMap
{   
    public static String cityFromZipFunc (int zipcode)
    {
        String city;
        Connection conn = DriverManager.getConnection("jdbc:default:connection");
        String query = "SELECT city FROM zipmap WHERE zipcode = ?";
        PreparedStatement ps = conn.prepareStatement(query);
        ps.setInt(1, zipcode);
        ResultSet rs = ps.executeQuery();
        if (!rs.next())
            city = "Unknown City";
        else
            city = rs.getString(1);
        rs.close();
        ps.close();
        conn.close();
        return city;
    }
}


清单 4 中展示了创建用于该 Java 代码的函数的 SQL 语句:


清单 4. CREATE FUNCTION 示例
CREATE FUNCTION cityFromZip (zipcode INTEGER)
RETURNS VARCHAR(255)
LANGUAGE JAVA
PARAMETER STYLE JAVA
READS SQL DATA
EXTERNAL NAME 'com.acme.sales.ZipMap.cityFromZipFunc'



一旦创建了 cityFromZip 函数,就可以使用 VALUES 关键字或通过在 SQL 语句中对其进行引用来调用它,如清单 5 所示。


清单 5. cityFromZip 函数的使用示例
VALUES cityFromZip(94105)
SELECT name, street, cityFromZip(zipcode), zipcode
FROM   address
SELECT *
FROM   address
WHERE  cityFromZip(zipcode)='San Francisco'



在触发器中使用 Java 函数

SQL 触发器指定了 SQL 语句对表执行插入、更新或删除操作时应发生的动作。可以在触发器中使用 Java 函数,例如,用该函数来提供关于更新的 e-mail 通知,通过 JDBC 在另一数据库中执行更新,或者执行可以通过 Java 编程来完成的任何操作。以下是一个触发器实例,当向 ADDRESS 表插入一条新记录时,它调用 Java 函数发送了一封 e-mail 报警。


清单 6. 触发器中的函数示例
CREATE TRIGGER newaddress AFTER INSERT ON address
REFERENCING NEW as NEW
FOR EACH ROW MODE DB2SQL
    VALUES(sendEmailAlert(NEW.name))  


Java 存储过程

Java 存储过程由可以从 SQL 调用的 Java 代码构成,可以运行于数据库服务器中,并访问该数据库。

Cloudscape 支持用于调用 Java 存储过程的 CALL 语句。Cloudscape 提供了 JDBC OUT 参数,以便可以在参数中返回值;这项操作是通过将 Java 参数用作期望类型的数组来完成的。例如, int 参数将被声明为 int[] ,而 String 参数则被声明为 String[] ,因而可以在这些参数中返回一个值。如果存储过程包含 OUT 参数,那么就需要通过 CallableStatement 接口,从客户机应用程序调用该参数。如果存储过程不包含任何 OUT 参数,那么还可以在执行动态 SQL 语句的工具(例如 ij 工具)中使用 CALL 来调用它。

查看给定 ZIP 代码的城市名称的 Java 存储过程可能如下所示(同样,为了简便起见,这里省略了错误和异常处理的代码):


清单 7. 示例存储过程的源代码
public class ZipMap
{   
    public static void cityFromZipSp (int zipcode, String[] outCity)
    {
        Connection conn = DriverManager.getConnection("jdbc:default:connection");
        String query = "SELECT city FROM zipmap WHERE zipcode = ?";
        PreparedStatement ps = conn.prepareStatement(query);
        ps.setInt(1, zipcode);
        ResultSet rs = ps.executeQuery();
        if (!rs.next())
            outCity[0] = "Unknown City";
        else
            outCity[0] = rs.getString(1);
        rs.close();
        ps.close();
        conn.close();
        return;
    }
}


将按清单 8 中内容所示来创建存储过程:


清单 8. CREATE PROCEDURE 示例
CREATE PROCEDURE cityFromZip ( IN zipcode INTEGER, OUT city VARCHAR(255) )
PARAMETER STYLE JAVA
LANGUAGE JAVA
READS SQL DATA
EXTERNAL NAME 'com.acme.sales.ZipMap.cityFromZipSp'



正如上面所提及的,如果存储过程包含 OUT 参数,那么客户机应用程序就会使用 CallableStatement 方法来执行该存储过程,如清单 9 所示。


清单 9. 调用存储过程的客户机示例
  public static String callOutCity(int zipCode, Connection con)
  {
    String outCity = "";
    try
    {
      // prepare the CALL statement
      String procName = "CITYFROMZIP";
      String sql = "CALL " + procName + "(?, ?)";
      CallableStatement callStmt = con.prepareCall(sql);
      // Set the input parameter to the zipcode
      callStmt.setInt(1, zipCode);
      // Register the output parameter
      callStmt.registerOutParameter(2, Types.CHAR);
      // call the stored procedure
      System.out.println();
      System.out.println("Call stored procedure named " + procName);
      callStmt.execute();
      // retrieve output parameters
      outCity = callStmt.getString(1);
      System.out.println("City name is "
                         + outCity);
    }
    catch (SQLException e)
    {
      System.out.println(e);
    }
    return(outCity);
  }



从数据库装入 Java 类

Java 存储过程、函数或其他应用程序逻辑都可以与数据一起存储在数据库中,而且还可以对该数据库进行编程,以便从那里装入类。这使得数据库数据及其逻辑都包含在一个自我包含的应用程序包中,从而简化了应用程序的部署,因为它减少了用户类路径带来问题的可能性。当存储在数据库中的类包含逻辑,并且将该逻辑用于数据库中列的数据类型时,这特别有用 —— 该数据库将与它外部的任何东西都不存在关联。

数据库中应用程序类的存储和装入是通过两种机制来提供的:可以在数据库中添加、删除和替换 JAR 文件,也可以向类路径添加这些 JAR 文件。

一旦向数据库添加了应用程序代码,就需要移动或复制数据库,以确保适当的应用程序逻辑是随数据一起移动的。这意味着对象数据永远都不会与其方法分离。






回页首




结束语

本文中,您了解了 Cloudscape 的基础架构,以及如何可以将其嵌入客户机或服务器应用程序中。学习了如何使用标准的 JDBC 调用来操作数据。您可以获得对 Cloudscape 中可用安全机制的总结,还可以学习如何利用 Java 集成来创建 Java 函数和存储过程。

Cloudscape 为开发人员提供了占用资源少的、基于标准的 Java 数据库,可以将该数据库紧密地嵌入任何基于 Java 的解决方案中。通过结合健壮的 SQL 特性、对 Java 技术的支持、安全性和嵌入的纯 Java 架构,Cloudscape 成为了为数据驱动的 Java 应用程序选择的数据管理产品。




参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文.


关于 Cloudscape 的更多信息,请参阅 [url]http://www.ibm.com/software/data/cloudscape[/url] 和 [url]http://www.ibm.com/developerworks/cloudscape[/url] 。


下载IBM Cloudscape Version 10.0 Beta。


Cloudscape 文档将向您提供关于 Cloudscape 的详细细节。


请参阅 Cloudscape 论坛,以获得 Cloudscape 开发人员和用户之间的信息交换。




作者简介



  从 Cloudscape 发行第一个通用版本(版本 1.2)开始,Kathy Saunders 就一直在从事与之有关的工作。目前,她是 Cloudscape 发行和 QA 的经理。




  Jean Anderson 是 Cloudscape 社区的架构师,主要负责为 Cloudscape 用户和开发人员开发技术内容。

pobopo 发表于 2010-5-10 00:18:01 | 显示全部楼层
到此一游。风景很好。
回复

使用道具 举报

bpiql 发表于 2012-3-15 12:01:37 | 显示全部楼层
交流交流好啊!楼主真厉害
回复

使用道具 举报

bbsytc 发表于 2013-5-8 15:17:46 | 显示全部楼层
谢谢分享 非常感谢 很不错
回复

使用道具 举报

无时无刻 发表于 2013-11-25 14:45:38 | 显示全部楼层
就看看,不说话。


回复

使用道具 举报

你马子有我闹吗 发表于 2014-5-22 05:23:00 | 显示全部楼层
要顶的啊,楼主辛苦了,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|魔方软件 ( 京ICP备08008787号 )

京公网安备 11010702001722号

GMT+8, 2024-3-29 22:51 , Processed in 0.071831 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表