IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

Cloudscape 常见问题一览表

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论


级别: 初级

Stanley Bradbury (bradbury@us.ibm.com), 社区协调人 - Cloudscape, IBM

2004 年 8 月 03 日
2005 年 8 月 18 日 更新

IBM® Cloudscape™ 是一种占用内存少、多用户、标准驱动的关系数据库系统,它完全用 Java™ 编写,适合嵌入到 Java 应用程序和服务器中。本文回答了关于 Cloudescape 的一些常见问题。

常见问题

问: 在 Cloudscape, Version 10.1 中有什么新特性?

答: IBM Cloudscape 10.1 包括 Apache Derby 10.1 发行版,是来自 IBM 的 Apache Derby 的第二个商业版本。除了从 Version 10.0 继承的所有优点和特性以外,Version 10.1 还包含:

  • 对 JSR 169 的支持,JSR 169 是为 Connected Device Configuration (CDC) / Foundation Profile (FP) 而定义的 JDBC API。当在 Java 2 Platform, Micro Edition (J2ME) CDC/FP 环境中运行时,使用 org.apache.derby.jdbc.EmbeddedSimpleDataSource 类。
  • Derby Network Client,这是和 Derby Network Server 一起使用的一个开放源代码客户机库。Network Server, Version 10.1 仍然支持对 IBM DB2 JDBC Universal Driver 的使用,但是以后 Derby Network Client 将成为标准的客户机库。
  • 使用 Derby Network 客户机时对 XA 分布式事务处理的支持。在实现 Java Transaction API (JTA) 的分布式 J2EE 环境中,当在一个 J2EE Resource 管理器中实现 Derby 时,使用 org.apache.derby.client.jdbc.ClientXADataSource 客户机类。
  • 软升级: 可以在 10.1 版本中访问 Cloudscape 10.0 创建的数据库,而无需指定 upgrade=true,并且仍然能够使用更旧的版本来访问该数据库。但是,如果不进行硬升级的话,某些新特性将不可用。
  • 对 JDBC 3.0 Updatable ResultSet API 的支持。
  • SQL 同义词。
  • 用于执行 SQL Date/Time 算术的函数。
  • SQL 侦听和排除
  • 将值导入或插入到 identity 列的能力。
  • 原地压缩表。
  • 用于在从 Cloudscape, Version 5 升级至 IBM Cloudscape, Version 10.x 时起辅助作用的 Migration Tool(在 2005 年 8 月底可以从 developerWorks 上下载)。(参阅 参考资料。)

问: 什么是 Cloudscape, Version 10.0?

答: Cloudscape 10.0 是来自 IBM 的 Apache Derby 的一种商业版本,它是以纯 Java 编写的占用内存少、多用户、标准驱动的关系数据库系统,适合嵌入到 Java 应用程序和服务器中。Derby 和 IBM Cloudscape 的核心功能与这里所谓的 Derby/Cloudscape 是一致的。Derby/Cloudscape 可以在任何功能完整的 JVM 中运行,因而相同的应用程序无需更改便可在很多硬件平台上运行。

Derby/Cloudscape 支持 SQL-92E (全部)标准以及部分 SQL-99 标准。Derby/Cloudscape API 是 JDBC。Derby/Cloudscape 不需要管理(零管理), 所以无需在应用程序之外安装和管理数据库。安装好之后,就不用管了,这正是一个成功的可嵌入组件的关键目标。

问: 什么是“嵌入式(embedded)”?

答: 来自 Merriam-Webster OnLine Dictionary (http://m-w.com) 的定义:

em·bed·ded; em·bed·ding - 及物动词
1 a:紧紧地包围或者像在母体中那样 <fossils embedded in stone>。b:使……成为整体的一部分 <the prejudices embedded in our language>。c:通过渗透和固定在载玻片上准备(显微镜用样品)切片。
2:紧紧围住 <a sweet pulp embeds the plum seed> 不及物动词:成为嵌入的。

“嵌入式 Cloudscape”意味着没有单独的数据库服务器;Cloudscape 是与 Java 应用程序(一个 JAR 文件和几个数据库文件)一起安装的。它和应用程序在同一个 JVM 上运行,启动和关闭都由应用程序控制。终端用户无需关心应用程序中的数据库系统。其结果就是,应用程序很容易部署,并且具有关系数据库系统的所有特性。从应用程序设计的观点来看,Derby/Cloudscape 和 DBMS 具有一样的 'Plug N Play'。

问: 嵌入式 Cloudscape 是一种多用户数据库吗?

A: 是的,无论选择了什么样的部署选项,Cloudscape 都支持多用户访问。“多用户”意味着在需要时,引擎可以管理多个独立的事务。Derby/Cloudscape 手册说明了如何在单用户应用程序中使用 Derby/CLoudscape。Derby/Cloudscape 非常适合在这种架构中运行,但它并不限于单用户或单个连接。即使是在嵌入式部署环境中,Derby/Cloudscape 也支持多连接。每个连接代表一个单独的事务。这样就允许单个应用程序建立多个连接,从而执行多个独立的事务。每个连接可以规定 4 种事务隔离级别,以满足并发性的要求。关于事务隔离级别、并发和锁定类型的完整描述,请参阅 Derby/Cloudscape Developers Guide。

一定要注意的是,Derby/Cloudscape JAR 文件中不含网络代码,再次声明,这并不意味着 Derby/Cloudscape 是单用户的,尽管这种误解很常见。在运行 Derby/Cloudscape 引擎的 JVM 之外进行通信(进程间通信)必须使用网络消息。两个独立进程间的通信称为“客户机-服务器”。为了满足客户机-服务器通信方式的需要,Derby/Cloudscape 提供了 Network Server 功能(在单独的 JAR 文件中)。Derby/Cloudscape 很容易嵌入 Network Server,以便在需要的时候提供客户机-服务器连接。Derby/Cloudscape 也很容易嵌入其他很多服务器程序(如 WebShpere、Apache Tomcat 等),因此选择权在您手中。

警告一句;如果除了应用程序建立的连接外,还需要到数据库的交互式连接,那么建议使用一个服务器环境(嵌入式服务器 架构最为灵活)。在测试期间,当程序员试图用一个单独的查询工具监视测试进程时,在一些实例中会发生数据库损坏。查询工具在其自己的 JVM 中运行,如果被允许进行连接,它就会因为双重启动(double-booting 或 dual-booting)数据库而对数据库造成损害。关于此话题的重要信息,请参阅 DB2 HELP 站点文档中关于 Double-booting 的小节。

问: 为何双重启动带有只读连接的 Cloudscape 会导致数据库损坏?

答: 与 Derby/Cloudscape 数据库建立的第一个连接“启动(boot)”数据库。启动意味着初始化所有内存结构和进程(缓存、管理器、列表,等等),读取数据字典,并回滚事务日志中所有未提交的事务。在双重启动的场景中,未提交的事务是那些在其他 JVM 进程中活动的事务,上述回滚将导致损坏。所以正在建立的连接的类型无关紧要,因为数据库的启动将恢复事务日志中所有未完成的事务,以便保持数据完整性。

Derby/Cloudscape 尽可能检测和阻止双重启动,但是直到最近,也无法在所有环境中都阻止双重启动。使用 1.4 或更高版本的 JVM 可以使 Derby/Cloudscape 阻止 UNIX、Linux 和 类似的操作系统上的双重启动。对于必须使用较早版本的 JVM 的系统,可以通过设置属性 derby.database.forceDatabaseLock=true 来减少双重启动。设置 forceDatabaseLock 属性的一个副作用是数据库锁文件(db.lck)的存在总是会阻止数据库的启动。当数据库没有被正确关闭(例如,崩溃或中止)时,就会留下一个“孤立的”数据库锁文件。当设置了 forceDatabaseLock 时,需要手动删除这个孤立文件。通常,Derby/Cloudscape 会检测并适当处理孤立的数据库锁文件,但即使没有其他进程在这个文件上有活动的锁,forceDatabaseLock 也仍会阻止数据库的启动。在手动删除数据库锁文件之前,请务必确认在数据库机器上没有 JVM 在运行。

问: 为什么 Cloudscape 在其基本产品中不提供 Client/Server?

答: 很多应用程序都是在单个系统上单个进程中运行的,所以不要求 Client/Server 能力。例如,用于存储输入在 Web 表单中的数据的 servlet,或者在 PC 上运行的地址簿应用程序,它们不需要与其他进程通信。Client/Server 代码不但不会带来好处,而且还会增加这些应用程序所占用的内存。对于那样的应用程序,Derby/Cloudscape 提供了关系数据库的所有优点,同时又没有不必要的网络代码。必要时,通过运行 Network Server 或其他某种服务器架构,可以在实例中添加 Client/Server。

问: IBM Cloudscape 和 Apache Derby 之间有什么不同点?

答: Apache Derby 与 IBM Cloudscape 的核心功能并无差别。从 Version 10 开始,IBM Cloudscape 成为 Apache Derby Project(参阅 参考资料)中所开发的数据库的一种商业实现。2004 年 8 月,IBM 将 IBM Cloudscape 产品的源代码捐献给了 Apache Software Foundation (ASF)。该软件被更名为 Derby。IBM 将 IBM Cloudscape, Version 10 及以上版本直接建立在 ASF 代码的基础之上。IBM 对数据库引擎、工具或网络服务器不做任何更改,只是将它们重新打包并发布为 IBM Cloudscape。

除了核心功能,IBM Cloudscape 与 Derby 的不同之处在于打包方式以及 IBM 提供的可选的、有附加价值的模块和工具。由于核心产品是一样的,所以这些附加的模块和工具既可以与 Apache Derby 一起使用,也可以与 IBM Cloudscape 一起使用。在核心级别上,这两种产品难于辨别。下面列出了可与 Derby/Cloudscape 一起使用的打包和具有附加值的模块及工具。

  • 在发布供下载的产品之前,IBM Cloudscape 版本要经受广泛的测试,以保证代码行的稳定性,并包括:
    • 捆扎在一个安装程序包中的主发行版,以简化安装。
    • 各个安装程序包中用于 Windows 和 Linux 的 JRE 的 IBM 版本,必要时可以使用。
    • 可用于连接到 Network Server 的 DB2 JDBC 客户机驱动程序:IBM DB2 JDBC Universal Driver。 [注意: 在大多数安装中,应该以开放源代码 Derby Network Client V10.1 代替这个库。] 这些 JAR 文件和所有的 IBM Cloudscape 安装程序包含在一起,也可以单独下载,以便与 ASF Derby 发行版一起使用。(参阅 参考资料。)
    • PDF 格式的文档。
  • 用于 Cloudscape 的 ODBC 驱动程序 IBM DB2 Runtime Client(可单独下载)。(参阅 参考资料。)
  • 数据库浏览工具,用于 Eclipse 的 IBM DB2 插件(可单独下载)(参阅 参考资料。) [更新: 在 10.1 版发布之后,该工具很快就会有更小的、改进的版本。]

请访问 Cloudscape 下载页面下载这些免费的模块(参阅 参考资料)。

IBM 还为 IBM Cloudscape 用户提供了服务。对于需要保证能够获得对问题的响应和解决的个人和组织,IBM 提供了 IBM Cloudscape 的需付费的 Support 许可(参阅 参考资料)。该解决方案提供了对 IBM 支持组织的声音和电子访问。该服务许可只限于 Derby 的 IBM Cloudscape 发行版,并且是按照“每台机器”计费的。对于不需要正式支持服务的个人和组织,IBM 也提供了免费支持,这种支持可以通过 developerWorks Cloudscape 网站上的文章以及 Cloudscape 社区论坛获得(参阅 参考资料)。

问: 为什么要发布一个新的客户机驱动程序库?

答: Derby Network Client(derbyclient.jar)是用于 Derby Network Server 的新的客户端库。与 DB2 JDBC Universal Driver 一样,它支持从远程机器或进程通过 Derby Network Server 访问 Derby 数据库。与它的先驱不同的是,Network Client 是开放源代码的,能够与 Derby Network Server 更好地集成。其中包含以下改进之处:

  • 只有在使用认证的时候才需要用户名和密码。
  • 不再需要为了转义某些数据库路径中使用的斜杠和冒号字符而使用特殊引用。
  • URL 连接属性是独立于位置的,并且只使用一种定界符(分号)。
  • 不需要为该客户机库使用单独的许可(与 Apache Derby 软件的其他部分一样,它是在 Apache 许可下可用的)。

Derby Network Server 的 10.1 版同时支持 Derby Network Client 和 DB2 JDBC Universal Driver。以后,对 Network Server 的增强将要求使用 Derby Network Client 库。例如,只有 Network Client 包含 Network Server XA 数据源 org.apache.derby.client.jdbc.ClientXADataSource

从使用 Universal Driver 改为使用 Network Client 将要求:

  • 发布 derbyclient.jar 文件并将其放入 CLASSPATH 中,而不是发布 db2jcc.jar 和 db2jcc_license_c.jar 文件。
  • 更新应用程序以装载新的驱动程序(org.apache.derby.jdbc.ClientDriver)
  • 将数据库连接 URL 修改为更简单的语法:

     jdbc:derby://<server>[:<port>]/<databaseName>
    [;<URL attribute>=<value>[;...]]





回页首


安装

问: 如何安装 Cloudscape 环境?

答: 安装非常简单,通过使用 Java 安装程序,安装完全是平台独立的(启动安装过程和指定文件路径的命令行语法仍然和平台有关)。 这里简要说明了如何使用 Java 安装程序进行安装,也可能提供用于特定平台的其他安装程序类型,关于使用平台专用安装程序的信息,请参阅 install.html 文件。

安装需要启动 JVM,而且需要在文件系统有足够的磁盘空间 —— JAR 文件需要 4 Mb 的磁盘空间;带有 javadoc 和例子的完整 Cloudscape 安装需要 24 Mb 的磁盘空间;完全安装 Cloudscape 和 IBM JRE 需要 64 Mb 的磁盘空间(仅针对 Windows)。这些数据不包括安装 JAR 文件的大小。

在命令行提示符下,切换到包含 Cloudscape 安装 JAR 文件的目录,通过下面的命令启动安装程序:

<path-to-java-binary>\java -cp . -jar <cloudscape-installation-jarfile>

其中:

  • <path-to-java-binary>java.exe 文件的完全限定目录(通常用环境变量 JAVA_HOME 规定)。
  • <cloudscape-installation-jarfile> 是安装文件。

对上述提示符的响应:

  • 第 1 屏:检查安装的产品是否正确,单击 Next
  • 第 2 屏:取消对复选框“Yes, I would like to read the release notes now”的选择。单击 Next
  • 第 3 屏:查看许可证条款。如果接受,则选择 I accept the terms of the license agreement。单击 Next
  • 第 4 屏:检查或输入完整的安装路径。单击 Next
  • 第 5 屏:检查安装选项和需要的磁盘空间。单击 Next
  • 第 6 屏:单击 Next,然后单击 Finish





回页首


配置/设置

问: Cloudscape 部署的基本组件有哪些?

答: Derby/Cloudscape 在应用程序中部署的主要组件包括 1) JAR 文件, 2) 数据库文件和 3) Cloudscape 日志。任何部署都必须包括这些组件,而且,在进行任何数据库级操作或者调试之前,必须安装好它们。

在讨论任何 Derby/Cloudscape 部署时,Cloudscape System Home 的概念也很重要。Cloudscape System Home 是创建所有文件的默认位置,也是存放数据库和 Cloudscape 日志的默认位置。如果没有通过属性 cloudscape.system.home 定义这个位置,那么该位置默认为运行 Cloudscape 引擎的 JVM 的当前工作目录。在产品部署中明确定义并记录 Cloudscape System Home 是谨慎的做法。在第一次连接到数据库(或者说“启动 Cloudscape 引擎”)之前,需要设置 cloudscape.system.home

错误日志文件的默认名称是 derby.log,但该文件名是可以配置的,有时候应用程序的程序员也可以更改它。在默认情况下,该日志文件被写入 derby.system.home,采用这一默认位置是一种谨慎做法。任何数据库级的调查/调试活动都需要该错误日志文件。为了进行 Derby/Cloudscape 部署,该文件的位置和名称必须是已知的。日志文件包含 Derby/Cloudscape 引擎启动的所有数据库列表和出现的严重错误(要捕捉较轻微的消息和警告,可以设置 derby.stream.error.logSeverityLevel,请参阅 Tuning Guide“Working with Derby Properties”)。

数据库文件(如 c2a10.dat)和事务日志文件(如 log2.dat)位于主数据库目录的子目录下。主目录和数据库同名(如 toursDB)。 启动数据库需要知道数据库目录的路径。主数据库目录至少包含两个子目录:

  • "seg0" 包含数据文件。
  • "log" 包含事务日志文件。

一定不要直接存取这些目录中的任何文件。

derby.jar 文件包含运行 Derby 引擎的代码。该文件必须位于类路径中,以便装载嵌入式驱动程序和启动 Derby 数据库。Derby/Cloudscape 开发环境包含 Derby/Cloudscape 部署包中的其他可选 JAR 文件。其中包括:

  • derbytools.jar - 工具 ijdblook
    • ij - Derby 与 JDBC 交互的脚本工具和 SQL 命令行接口。
    • dblook - 用于查看或转储数据库中对象的数据定义语言(DDL)的 Derby 实用程序。
  • derbynet.jar - Derby Network 服务器。
  • derbyclient.jar - Derby Network Client。该客户机库在 10.1 版之后可用,并且是首选的客户机库。它也可以用于 Network Server Version 10.0。
  • db2jcc.jar 和 db2jcc_license_c.jar - 支持与 Network Server 进行客户机通信的 DB2 JDBC Universal Driver。[注意:当使用 Network Server 时,derbyclient.jar 是首选客户机库。]





回页首


一般用法/特性(基础)

问: 模式和数据库有何不同?

答: Derby/Cloudscape 数据库由一组模式构成,每个模式都有自己的表集,所有模式都用相同的数据词典(SYS 模式中的系统表)定义。在磁盘上,数据库由一些数据文件(放在 seg0 目录中)和一些事务日志文件(放在 log 目录中)组成。事务不可能跨数据库,但是可以跨越同一个数据库中的不同模式。关于用单个 Derby/Cloudscape 引擎连接多个数据库的更多信息,请参考“How can an application connect to more than one database in a Cloudscape system?”。

Derby/Cloudscape 实现了这些模式,以便在单个 DB 中提供多个名称空间。在将相关的表组成一个逻辑单位时,会用到模式。模式没有相关的单独的磁盘文件。同一数据库中的所有模式都使用相同的数据词典和事务日志。您可以在单个 SQL 语句中引用多个模式,该语句将在同一个连接中执行(不需要打开)。同一数据库中模式间的 SQL 操作是事务性的。

问: 在 Cloudscape 系统中,应用程序如何连接到多个数据库?

答: 可以在单个应用程序中打开多个连接,并且每个连接都针对不同的数据库。但是就通过 SQL 跨数据库操作而言,各个实例/连接并不知道其他连接的存在。两个数据库/连接之间的任何操作,都必须在应用程序级上完成(不能在单个 SQL 语句中),然后显示结果或者将结果写入适当的位置。

例如,您可以把数据库 A 中的表 ONE 读入一个数组,然后把数据库 B 中的表 TWO 读入另一个数组。循环遍历数组中的数据记录并根据需要修改,然后把数据写回原来的数据库和表中。相反,如果是在同一数据库的不同模式下创建了表 ONE 和表 TWO,则可以在单个事务中使用 SQL 语句完成这项操作。

问: 在 Derby/Cloudscape 中如何创建执行日期运算的函数?

答: Version 10.1 通过使用函数 TIMESTAMPADDTIMESTAMPDIFF 为日期/时间运算提供了支持。对于 10.0 版,您需要创建自己的函数,如下面的例子所示。虽然现在已经内建了该特性,这个 FAQ 例子仍然可以很好地演示在 Derby/Cloudscape 中创建用户定义函数的步骤。如果您能想到更适合本节的有用的函数,请将您的想法作为本文的反馈发给我们。

创建数据库函数的基本步骤是:

  • 创建执行所需操作的 java 方法并将其放入一个 JAR 文件中。
  • 将该 JAR 文件安装(装载)到数据库。
  • 设置数据库类路径以包括这个 JAR 文件。
  • 创建(定义)调用每个方法的函数。
  • 测试新定义的函数。


清单 1. 支持 addDays 函数的 Java 代码

import java.sql.*;
import java.util.Date;

public class dateFunctions 
{
    public static Timestamp addDays(int dayIncrement, Timestamp 
inTimestamp)
    {
	long	msDay = 24*60*60*1000;
	long 	msIncrement	= dayIncrement * msDay;
	
	Timestamp calcDate;
	calcDate = new Timestamp(inTimestamp.getTime() + 
(dayIncrement * msDay) 

);
	return calcDate;
    }
}


清单 2. 将 JAR 文件安装到数据库的 SQL 语法


Format: CALL SQLJ.install_jar( ’jarFilePath’, 'qualifiedJarName', 0)

Example: CALL sqlj.install_jar( ’dateFunctions.jar’, 
’APP.dateFunctions’, 0)


清单 3. 设置数据库类路径以包括 JAR 文件


Format: Call SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY('KEY','VALUE')


Example: CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY
( ’derby.database.classpath’, ’APP.dateFunctions’)



清单 4. 定义数据库函数


Example:
CREATE FUNCTION ADDDYS(incr int, myTs TIMESTAMP)
RETURNS TIMESTAMP
LANGUAGE JAVA 
PARAMETER STYLE JAVA
EXTERNAL NAME 'dateFunctions.addDays'


清单 5. 测试(使用)该函数来添加 3 天


Example:
select TsCol, ADDDAYS(3,tsCol) from myTable;






回页首


性能

问: 如何调整 Cloudscape、提高缓存命中率和减少 I/O 次数?

答: 通过增加 Derby/Cloudscape 可用数据缓存的大小,可以改善处理大量数据的系统的性能,减少 I/O 次数。通过设置 pageCache 容纳尽可能多的数据(直到整个数据库),同时避免 OutOfMemory 异常(OOM),可以实现改变缓冲区大小来提高性能的目标。通过 seg0 目录中数据文件的总体大小,可以粗略估计数据库中的数据量(结果偏大)。因为这些文件中存在自由空间,所以文件大小之和总是要大于数据库中所有记录的总和。在计算数据文件大小之前压缩数据库,可以减少这种方法的估计偏差。将 pageCache 设得比这个值还大是没有意义的,通常较小的缓存能够提供很好的性能。

优化缓存大小需要反复试验,以保证增加后的缓存既提高了性能,又不会超出 JVM 可用的内存(最大堆)。如果 Derby/Cloudscape pageCache 太大,有可能导致 JVM 崩溃。为了避免 OutOfMemory 异常(OOM),需要考虑下面这些因素:

  • 机器上的物理内存,JVM 必须装载到物理内存中。
  • 允许的 JVM 最大堆(-Xmx)。
  • Cloudscape pageCache 的大小( pageCache * pageSize 的平均值)。

关于调整这些值的更多信息,请参考本文 故障检修 一节中“运行 Derby/Cloudscape 时如何避免 OutOfMemory 异常”一问。





回页首


故障检修

问: 运行 Derby/Cloudscape 时如何避免 OutOfMemory 异常?

答: 下面几节提供了 Derby/Cloudscape 内存使用方面的背景知识,并介绍了调整 Cloudscape 和 JVM 占用的内存大小,避免 OutOfMemory 异常的一种方法。

与 Derby/Cloudscape 内存使用有关的因素

如果不满意 Derby/Cloudscape 的性能,或者遇到了 OutOfMemory 异常(OOM),您要做的第一件事就是调整 Derby/Cloudscape pageCache。可以安全分配给 pageCache 的内存受到多种因素的影响:物理内存、pageSize 的平均大小和 JVM 的最大 Heap 大小( maxHeap)是最主要的因素。基本的方法是按照 JVM 最大 Heap 大小的一定比例,计算分配给 pageCache 的页数。

JVM 最大 Heap 大小

JVM 最大 Heap 大小(maxHeap)是用 Java 参数“-Xmx#m”设置的,其中 # 是分配给堆的最大 Mb 数(如 java -Xmx128m 即分配 128 Mb 的 maxHeap)。一定要保证规定的 JVM 最大堆长度小于机器的物理内存。

JVM MaxHeap 和 Derby/Cloudscape PageCache 的联系

使用 Cloudscape 4.0 和 Java 1.4.0 进行内部测试表明,将 heapSize 和 Cloudscape pageCache 的比例设置为 20:1 是安全的。这个比例足以支持活动非常频繁的应用程序,很多应用程序采用较小的比例也能工作得很好。每秒钟内处理的事务量更大的应用程序,即使采用更大的 JVM maxHeap 和 Cloudscape pageCache 比例,也可能会出现 OutOfMemory 异常。如果遇到 OOM,我们建议您进行重负荷测试来确定最佳的系统比例。首先将 JVM 和 pageCache 的比例设为 20:1,然后长期进行重负荷测试,以检查内存使用的稳定性。如果没有出现 OOM,则采用较小的比例继续测试,直到获得可以接受的吞吐量或者应用程序遇到 OutOfMemory 异常。轻量级的应用程序甚至能在 2.5:1 的比例下运行。Derby/Cloudscape 5.1 版采用 16:1 的默认比例(pageCache [= 4 MB cache] 和 64K maxHeap),多数应用程序都能在这个比例下很好地工作。最佳比例是能够提供足够的性能而又不会出现 OOM 的比例。

PageCache:计算

Derby/Cloudscape pageCache 是由数据库使用的平均 pagesize 决定的,可以通过属性 cloudscape.storage.pageCacheSize 对其进行设置。pageCache 规定了 Derby/Cloudscape 页面缓冲区能够保存的最大页数。估计 pageCache 所用内存需要用 pageCache 乘上数据库中的平均页大小(关于页大小的更多信息,请参考关于 derby.storage.pageSize 属性的文档)。如果数据库中所有表都使用默认的 4K 页面大小,那么计算起来非常简单: (pgSz = 4k) x ( pageCache 设置)。

JVM Heap 和 PageCache 的比例:计算

对于运行在 1.4 版和更低版本 JVM 上的 Cloudscape 4.0,默认的 heap:pageCache 比例是(如果没有设置 maxHeappageCache)400:1(64M / (40*4K)/1000)。在 5.0 版中,pageCache 的默认大小从 40 增加到了 1000,相应的比例变成了 16:1 (64M / ( (1000*4)/1000 ) )。对于非常活跃的应用程序,这个比例可能太小,因此使用 5.0 版的默认比例可能造成 OOM。

问: 如何设置 Derby/Cloudscape 开发环境?

答:按照下述说明设置开发测试环境中的 Derby/Cloudscape 属性,能够避免自动删除 Derby/Cloudscape 日志并记录下所有的错误和警告。使用这些设置时,Derby/Cloudscape 不再是零管理系统,因此需要注意日志文件的大小。一定不要在零管理很重要的生产环境中使用这些属性。

设置这些属性最简单的办法是创建一个文件,将其命名为 cloudscape.properties,放在 Derby/Cloudscape system.home 目录中(通常和包含 Derby/Cloudscape 错误日志文件的目录相同)。也可以在 Java 命令行中使用 - D 参数指定每一个属性。重新启动 Derby/Cloudscape 之后,修改的属性才能生效。下面是用于开发测试环境的属性文件,其中带有注释:


清单 6. 在开发和测试环境中使用的属性文件

#		Top of Sample  File
# This is a sample Derby/Cloudscape properties file provided to show
#      setting properties which are useful for development and 
#      troubleshooting
#
#  -- Append to the log file rather than overwriting it 
#   - manually remove the derby.log when it becomes large
derby.infolog.append=true
#
#  -- Log all errors/messages of any severity (will list deadlocks)
derby.stream.error.logSeverityLevel=0
#
#  --  Log all lock timeouts with additional trace information 
derby.locks.monitor=true
#
# - List transaction information on victim and survivor transactions
#     for both lockTimeouts and Deadlocks
derby.locks.deadlockTrace=true
#		End of Sample File



参考资料

学习

获得产品和技术
  • Migration Tool:在从 Cloudscape, Version 5 升级至 IBM Cloudscape, Version 10.x 的过程中可以起到辅助作用(在 2005 年 8 月底可以从 developerWorks 下载)。

  • 随 Cloudscape 10.0 一起提供的用于 Apache Derby Network Server 的 IBM DB2 JDBC Universal Driver; 但是它没有随 Derby Network Server 一起发布。可以从该页面免费下载该工具。

  • IBM DB2 plug-ins for Eclipse, Version 1.0.2 Beta”(developerWorks, 2004 年 8 月)讨论了用于 Eclipse 的 IBM DB2 插件,并提供了这些插件的下载链接(注意: 在 10.1 版发布之后,该工具很快就会有改进的版本)。

  • 来自 Cloudscape 下载页面的 免费模块


讨论


关于作者

Stanley Bradbury 目前在 IBM 的 Cloudscape 小组担任社区协调人的工作。在此之前,他为 Cloudscape 提供三级支持(2001 年到 2005 年)。在与 Cloudscape 打交道之前,他先后管理过生物技术、制造业和 Internet 安全服务业的数据库。他毕业于 Berkeley 加州大学,喜欢和家人呆在一起。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款