<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>eminem</title>
    <description></description>
    <link>http://eminem.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>使用vi编辑器</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/218607" style="color:red;">http://eminem.javaeye.com/blog/218607</a>&nbsp;
          发表时间: 2008年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用vi编辑器<br /> Linux利用大量文本文件进行配置。因此，要用一个文本编辑器来配置Linux。vi编辑器看起来比较旧了，即使在Linux社区中也算不上最普及的编辑器。使用一、两个字母的命令非常古怪，但如果要用引导盘恢复系统，则vi是惟一可用的编辑器。再者，现在很多基于Linux的智能设备一般所支持的编辑器也只有vi。所以掌握vi编辑器的使用也是有必要的。<br /><br />vi &lt;文件名称><br /><br />如：vi /etc/inittab<br /><br />使用vi的基本方法有三种，默认为命令方式，插入方式用于插入文本，几个特殊字符可以用执行方式执行普通shell命令。<br /><br />命令方式<br /><br />  在vi中打开文件时，第一个方式就是命令方式。我们用命令方式滚动文本、搜索不同文本字符串和删除特定字符、字、行。<br /><br />  vi中可以使用行号，为此要在编辑器中用下列命令激活。<br /><br />:set nu<br /><br />移动<br /><br />尽管当前vi版本可以使用键盘上的方向键（箭头、Page Up、Page Down），但这个编辑器是为没有这些键的旧式键盘设计的。四个小写字母可以代替键盘上的方向键：<br /><br />h      向左<br /><br />j      向下<br /><br />k     向上<br /><br />l     向右<br /><br />Page Up、Page Down键分别使用Ctrl+B（back）与Ctrl+F（forward）。<br /><br />如果已经知道所要的行号，则可以用G命令。单独使用G命令时，转到文件最后一行。加个行号时（如20G），可以转到所要的行。和Linux shell一样，大小写很重要，这个命令一定要用大写G。<br /><br />删除文本<br /><br />vi中删除文本很简单。有三个删除命令与光标当前位置有关：<br /><br />x          删除当前字符，包括空格或制表符<br /><br />dw         删除当前单词<br /><br />dd         删除当前行<br /><br />如果不小心删错了内容，则可以用u命令撤销最后一个命令。<br /><br />搜索文本<br /><br />vi中搜索文本很容易，只要用／开关。例如，如果要在文件中搜索单词dollar，输入下列命令：<br /><br />   /dollar<br /><br />光标加亮显示文件中找到的第一个这个单词。要移到下一个实例，输入n。记住，vi编辑器中的大小写很重要。<br /><br />插入方式<br /><br />  如果要在文件中插入文本，用插入方式。为此可以使用几种方法，取决于光标当前位置。<br /><br /> 命令<br /> 动作 <br /> 说明 <br /> <br /> i  Insert 插入输入的一切，从光标当前位置开始  <br /> a Append  插入输入的一切，从光标当前位置后一个字符开始，而A命令，插入输入的一切，从光标当前位置行末开始  <br /> o Open  插入输入的一切，从光标当前位置下一行开始，而O命令插入输入的一切，从光标当前位置上一行开始  <br /> cw Change word  删除与光标当前位置对应的单词（或空格），从这个单词开始插入文件  <br /><br /><br />  无论什么时候，很容易进入插入方式，只要在键盘上按Esc键即可。<br /><br />执行方式<br /><br />  可以在vi编辑器内运行普通shell命令，只要在命令前面加上 ! 即可。例如，如果生成脚本，则可能要知道某个文件的目录地址。可以用下列命令列出/etc/cron.daily目录中的文件：<br /><br />  :!ls /etc/cron.daily<br /><br />普通执行方式以冒号（:）开始。执行方式有几个相关的文件管理命令，包括:q（退出文件）和:w（将当前文本写文件）。提示：如果要从vi退出而不保存任何改变，则可以用:q!命令。<br /><br />基本的vi命令<br /><br /> 命令<br />  描述<br /> <br /> a 在当前光标位置后面开始插入方式  <br /> A 开始插入方式，添加到当前行末尾  <br /> cw 删除当前单词，然后进入插入方式，以便替换这个单词  <br /> dw 删除当前单词，而不进入插入方式  <br /> dd 删除当前行  <br /> G  将光标移到行末 <br /> 15G 将光标移到第15行  <br /> h 将光标移到左边一格  <br /> i 进入插入方式  <br /> o 进入插入方式，打开当前光标下一行  <br /> O 进入插入方式，打开当前光标上一行  <br /> :q 退出vi，如果要从vi退出而不保存任何改变，则可以用:q!命令  <br /> r 用输入的下一个字符替换当前字符  <br /> :set nu 激活当前文件和行号  <br /> u 撤消最后的改变  <br /> :w 写入当前文件  <br /> Esc 退出插入方式  <br /> /system 搜索当前文件中的单词系统
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/218607#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jul 2008 15:46:17 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/218607</link>
        <guid>http://eminem.javaeye.com/blog/218607</guid>
      </item>
      <item>
        <title>V9常用命令</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/204154" style="color:red;">http://eminem.javaeye.com/blog/204154</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、启动DB2服务器<br /><br />DB2START<br /><br /> <br /><br />2、停止DB2服务器<br /><br />DB2STOP<br /><br /> <br /><br />3、强制停止DB2服务器<br /><br />DB2STOP FORCE<br /><br /> <br /><br />4、创建数据库<br /><br />DB2 CREATE DATABASE PjjTest<br /><br /> <br /><br />5、删除数据库<br /><br />DB2 DROP DATABASE PjjTest<br /><br /> <br /><br />6、连接数据库<br /><br />--默认以Windows登陆用户连接数据库<br />DB2 CONNECT TO PjjTest<br /><br /> <br /><br />--用指定用户连接数据库<br />DB2 CONNECT TO PjjTest USER db2admin USING ****<br /><br /> <br /><br />7、断开数据库连接<br /><br />--断开连接<br />DB2 CONNECT RESET<br /><br /> <br /><br />--终止数据库运行的命令并断开数据库连接<br />DB2 TERMINATE<br /><br /> <br /><br />8、列出DB2实例<br /><br />DB2ILIST<br /><br /> <br /><br />9、列出DB2当前实例<br /><br />DB2 GET INSTANCE<br /><br /> <br /><br />10、察看实例配置文件<br /><br />--默认<br />DB2 GET DBM CFG<br /><br /> <br /><br />--分屏显示<br />DB2 GET DBM CFG | More<br /><br /> <br /><br />--将显示结果存入 pjj.out 文件中<br />DB2 GET DBM CFG > pjj.out<br /><br /> <br /><br />11、更新数据库管理器参数<br /><br />DB2 UPDATE DBM CFG USING Para_Name Para_Value<br /><br /> <br /><br />12、察看指定数据库的配置参数<br /><br />--默认<br />DB2 GET DB CFG FOR PjjTest<br /><br /> <br /><br />--分屏显示<br />DB2 GET DB CFG FOR PjjTest | More<br /><br /> <br /><br />--将显示结果存入 pjj.out 文件中<br />DB2 GET DB CFG FOR PjjTest > pjj.out<br /><br /> <br /><br />13、列出当前活动的数据库<br /><br />DB2 LIST ACTIVE DATABASES<br /><br /> <br /><br />14、列出所有系统数据库目录<br /><br />DB2 LIST DATABASE DIRECTORY<br /><br /> <br /><br />15、列出所有DBMS节点目录<br /><br />DB2 LIST NODE DIRECTORY<br /><br /> <br /><br />16、列出应用程序信息<br /><br />--默认<br />DB2 LIST APPLICATIONS<br /><br /> <br /><br />--列出详细信息<br />DB2 LIST APPLICATIONS SHOW DETAIL<br /><br /> <br /><br />--列出指定数据库的应用程序连接<br />DB2 LIST APPLICATIONS FOR DB PjjTest<br /><br /> <br /><br />--列出指定数据库的应用程序连接的详细信息<br />DB2 LIST APPLICATIONS FOR DB PjjTest SHOW DETAIL<br /><br /> <br /><br />17、列出DB2分区信息<br /><br />--默认<br />DB2 LIST DATABASE PARTITION GROUPS<br /><br /> <br /><br />--列出详细信息<br />DB2 LIST DATABASE PARTITION GROUPS SHOW DETAIL<br /><br /> <br /><br />18、列出数据库表空间<br /><br />--默认<br />DB2 LIST TABLESPACES<br /><br /> <br /><br />--列出详细信息<br />DB2 LIST TABLESPACES SHOW DETAIL<br /><br /> <br /><br />19、列出 DB2 命令行处理器选项设置<br /><br />DB2 LIST COMMAND OPTIONS<br /><br /> <br /><br />20、列出 DB2 相关历史<br /><br />DB2 LIST HISTORY {BACKUP | ROLLFORWARD | REORG |<br />CREATE TABLESPACE | ALTER TABLESPACE | DROPPED TABLE | LOAD |<br />RENAME TABLESPACE | ARCHIVE LOG}<br />{ALL | SINCE timestamp |CONTAINING {schema.object_name | object_name}}<br />FOR [DATABASE] database-alias<br /><br /> <br /><br />21、获取 DB2 相关帮助信息<br /><br />--获取数据库提示信息帮助<br />DB2 ? SQLCODE<br /><br /> <br /><br />--获取数据库命令信息帮助<br />DB2 ? LIST<br /><br />22、解除应用程序被锁定<br /><br />--首先列出详细信息<br />DB2 LIST TABLESPACES SHOW DETAIL<br /><br />--记下“状态”为“锁定”的“应用程序句柄”号（假定是95）<br />DB2 FORCE APPLICATION(95)<br /><br /> <br /><br /><br />23、创建数据库<br /><br />DB2 CREATE DATABASE DataBaseName<br /><br /> <br /><br /><br />24、删除数据库（提示：需谨慎执行该命令）<br /><br />DB2 DROP DATABASE DataBaseName<br /><br /> <br /><br /><br />25、数据库备份（完全离线备份）<br /><br />--简明式<br />DB2 BACKUP DB DataBaseName<br /><br />--复杂式<br />DB2 BACKUP DB DataBaseName USER User_Name USING PassWord to BackUp_Dir_Name<br /><br /> <br /><br /><br />26、查看数据库备份历史<br /><br />DB2 LIST HISTORY BACKUP ALL FOR DataBaseName<br /><br /> <br /><br /><br />27、获取数据库快照<br /><br />--正常<br />DB2 GET SNAPSHOT FOR ALL ON DataBaseName<br /><br />--推荐1<br />DB2 GET SNAPSHOT FOR ALL ON DataBaseName > SnapShot.out<br /><br />--推荐2<br />DB2 GET SNAPSHOT FOR ALL ON DataBaseName | more<br /><br /> <br /><br /><br />28、数据库备份（离线增量备份）<br /><br />--第一步：启用数据库增量备份功能（重要）<br />DB2 UPDATE DB CFG FOR DataBaseName USING TRACKMOD YES<br /><br />--第二步：执行离线增量备份前需要完全备份一次（重要）<br />DB2 BACKUP DB DataBaseName<br /><br />--第三步：执行离线增量备份<br />DB2 BACKUP DB DataBaseName INCREMENTAL<br /><br /> <br /><br /><br />29、恢复数据库备份（离线完全备份恢复）<br /><br />--简明式1（进入备份文件所在DIR，例如：C:\TEST.0\）<br />DB2 RESTORE DATABASE DataBaseName<br /><br />--简明式2（假定备份文件所在DIR为 C:\TEST.0\）<br />DB2 RESTORE DATABASE TEST FROM C:\ TAKEN AT 20060302143417<br /><br />--复杂式<br />DB2 RESTORE DATABASE source_db_name USER user_name USING password<br />FROM backup_dir_name TAKEN AT backup_file_create_time<br />TO driver_letter INTO new_db_name<br /><br /> <br /><br /><br />30、恢复数据库备份（离线增量备份）<br /><br />-----------------第一种方法，手动恢复-----------------<br /><br />--第一步：恢复目标增量备份映像文件（假定数据库名称为Test，时间戳记为 20060302143909）<br />DB2 RESTORE DATABASE TEST INCREMENTAL FROM C:\ TAKEN AT 20060302143909<br /><br />--第二步：恢复最近的一次完全备份文件<br />DB2 RESTORE DATABASE TEST INCREMENTAL FROM C:\ TAKEN AT 20060302143909<br /><br />--第三步：恢复自最近的一次完全备份之后的第一次增量备份映像文件，依次类推<br />DB2 RESTORE DATABASE TEST INCREMENTAL FROM C:\ TAKEN AT 20060302144033<br /><br />--第四步：恢复自第N次增量备份映像文件，直至再次恢复目标增量备份映像文件为止。<br />--例如，需要恢复第一次增量备份映像文件，则需要首先恢复第一次增量备份映像，<br />--然后恢复至最近的一次完全备份映像文件，最后再恢复至第一次增量备份映像文件。<br />--注意：目标增量备份映像文件会被还原两次（重要）<br /><br />-----------------第二种方法，自动恢复-----------------<br /><br />--执行自动恢复增量备份数据库时，系统自动执行手动恢复增量备份数据库的一系列命令。<br />DB2 RESTORE DATABASE TEST INCREMENTAL AUTOMATIC FROM C:\ TAKEN AT 20060302144033<br /><br /> <br /><br /><br />31、创建含有自增列的表<br /><br />--COL_1为自增列，非空，从0开始，每次自动增加1<br />CREATE TABLE T1<br />(<br /> COL_1 INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1, NO CACHE ) ,<br /> COL_2 VARCHAR (10)  ,<br />PRIMARY KEY ( COL_1)  )<br />IN USERSPACE1 ;<br /><br />--注意，对于自增列来说，不可以显式的对该字段进行写入操作<br /><br /> <br /><br /><br />32、提高 INSERT INTO 性能的一个写法<br /><br />INSERT INTO TableName(Col_1,Col_2……) Values(V1,V2……);<br />INSERT INTO TableName(Col_1,Col_2……) Values(V3,V4……);<br /><br />--可以写为如下样式，提高性能<br />INSERT INTO TableName(Col_1,Col_2……) Values(V1,V2……),(V3,V4……);<br /><br /> <br /><br /><br />33、删除物理表（删除所有数据以及表，提示：需谨慎执行该命令）<br /><br />DROP TABLE TableName;<br /><br /> <br /><br /><br />34、删除表中的数据（提示：需谨慎执行该命令）<br /><br />--方法1<br />DELETE FROM TableName;<br /><br />--方法2（同 MS SQL SERVER 的 Truncate Table，不记录日志清空数据，很快）<br />ALTER TABLE TableName ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE<br /><br />--其他方法<br />--补充说明，当一个表数据量非常大的时候，执行该语句将导致DBMS性能下降，日志爆增，所以建议<br />--先DROP该表，然后用DDL重新CREATE该表将不会对性能造成太大影响。<br />--当然，还有一种方法是导入一张不含记录的空表来覆盖源表，变相实现删除所有数据功能<br /><br /> <br /><br /><br />35、修改表，使该表数据变动不记录日志（提示：将不可回滚数据，不推荐）<br /><br />ALTER  TABLE  TableName ACTIVATE  NOT  LOGGED  INITIALLY<br /><br /> <br /><br /><br />36、控制查询返回的行数（假定为前50行）<br /><br />SELECT * FROM TableName FETCH FIRST 50 ROWS ONLY<br /><br /> <br /><br /><br />37、使用DB2默认值<br /><br />CREATE TABLE T1<br />(<br /> Col_1 VARCHAR(32),<br /> LastUpdateTime WITH DEFAULT CURRENT TIMESTAMP<br />)In USERSPACE1;<br /><br />--注意：<br />--在update语句中，如果没有对定义了默认值的某个字段显式赋值，<br />--则更新时，此字段不会重新执行默认值中定义的表达式。<br /><br />--为了让其重新执行默认值定义的表达式，可以采用以下方式：<br />UPDATE T1 SET Col_1 = 'new string', LastUpdateTime = DEFAULT;<br /><br /> <br /><br /><br />38、在查询结果中显示行号<br /><br />--示例<br />SELECT row_number()over(),Col_1,Col_2…… FROM TableName<br /><br /> <br /><br /><br />39、字段空值替换函数<br /><br />--如果字段 Col_1 （数字型）为空，则替换为 0<br />COALESCE(Col_1,0)<br /><br />--如果字段 Col_1 （字符串型）为空，则替换为 'NullString'<br />COALESCE(Col_1,'NullString')<br /><br />--如果字段 Col_1 （时间型）为空，则替换为 'NullString'<br />COALESCE(Col_1,'2000-01-01 00:00:00.000000')<br /><br /> <br /><br /><br />40、得到表的描述信息<br /><br />DESCRIBE TABLE TableName
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/204154#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 14:43:36 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/204154</link>
        <guid>http://eminem.javaeye.com/blog/204154</guid>
      </item>
      <item>
        <title>性能测试（并发负载压力）测试分析</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/195375" style="color:red;">http://eminem.javaeye.com/blog/195375</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自：http://freeke.blog.sohu.com/86869207.html<br /><br />分析原则：<br /><br /> <br /><br />• 具体问题具体分析（这是由于不同的应用系统，不同的测试目的，不同的性能关注点）<br /><br /> <br /><br />• 查找瓶颈时按以下顺序，由易到难。<br /><br /> <br /><br />*          服务器硬件瓶颈<br /><br />*          网络瓶颈（对局域网，可以不考虑）<br /><br />*          服务器操作系统瓶颈（参数配置）<br /><br />*          中间件瓶颈（参数配置，数据库， web 服务器等）<br /><br />*          应用瓶颈（ SQL 语句、数据库设计、业务逻辑、算法等）<br /><br /> <br /><br />    注：以上过程并不是每个分析中都需要的，要根据测试目的和要求来确定分析的深度。对一些要求低的，我们分析到应用系统在将来大的负载压力（并发用户数、数据量）下，系统的硬件瓶颈在哪儿就够了。<br /><br /> <br /><br />• 分段排除法 很有效<br /><br /> <br /><br />分析的信息来源：<br /><br />*          • 1 根据场景运行过程中的错误提示信息<br /><br />*          • 2 根据测试结果收集到的监控指标数据<br /><br /> <br /><br />一．错误提示分析<br /><br /> <br /><br />分析实例：<br /><br />1     • Error: Failed to connect to server “ 10.10.10 .30:8080 ″ : [10060] Connection<br /><br />• Error: timed out Error: Server “ 10.10.10 .30 ″ has shut down the connection prematurely<br /><br />分析：<br /><br />• A 、应用服务死掉。<br /><br />（小用户时：程序上的问题。程序上处理数据库的问题）<br /><br />• B 、应用服务没有死<br /><br />（应用服务参数设置问题）<br /><br /> <br /><br />    例：在许多客户端连接 Weblogic 应用服务器被拒绝，而在服务器端没有错误显示，则有可能是 Weblogic 中的 server 元素的 AcceptBacklog 属性值设得过低。如果连接时收到 connection refused 消息，说明应提高该值，每次增加 25 ％<br /><br /> <br /><br />• C 、数据库的连接<br /><br /> <br /><br />(1 、在应用服务的性能参数可能太小了 2 、数据库启动的最大连接数（跟硬件的内存有关） )<br /><br /> <br /><br />2 Error: Page download timeout (120 seconds) has expired<br /><br /> <br /><br />分析：可能是以下原因造成<br /><br /> <br /><br />*          • A 、应用服务参数设置太大导致服务器的瓶颈<br /><br />*          • B 、页面中图片太多<br /><br />*          • C 、在程序处理表的时候检查字段太大多<br /><br /> <br /><br />二．监控指标数据分析<br /><br /> <br /><br />1 ．最大并发用户数：<br /><br /> <br /><br />应用系统在当前环境（硬件环境、网络环境、软件环境（参数配置））下能承受的最大并发用户数。<br /><br /> <br /><br />*          在方案运行中，如果出现了大于 3 个用户的业务操作失败，或出现了服务器 shutdown 的情况，则说明在当前环境下，系统承受不了当前并发用户的负载压力，那么最大并发用户数就是前一个没有出现这种现象的并发用户数。<br /><br />*          如果测得的最大并发用户数到达了性能要求，且各服务器资源情况良好，业务操作响应时间也达到了用户要求，那么 OK 。否则，再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。<br /><br /> <br /><br />2 ．业务操作响应时间：<br /><br /> <br /><br />*          • 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图，可以确定在方案执行期间响应时间过长的事务。<br /><br />*          • 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的？问题是否与网络或服务器有关？<br /><br />*          • 如果服务器耗时过长，请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长，请使用“网络监视器”图确定导致性能瓶颈的网络问题<br /><br /> <br /><br />3 ．服务器资源监控指标：<br /><br /> <br /><br />内存：<br /><br /> <br /><br />1 UNIX 资源监控中指标内存页交换速率（ Paging rate ），如果该值偶尔走高，表明当时有线程竞争内存。如果持续很高，则内存可能是瓶颈。也可能是内存访问命中率低。<br /><br /> <br /><br />2 Windows 资源监控中，如果 Process\Private Bytes 计数器和 Process\Working Set 计数器的值在长时间内持续升高，同时 Memory\Available bytes 计数器的值持续降低，则很可能存在内存泄漏。<br /><br /> <br /><br />内存资源成为系统性能的瓶颈的征兆 :<br /><br /> <br /><br />*          很高的换页率 (high pageout rate);<br /><br />*          进程进入不活动状态 ;<br /><br />*          交换区所有磁盘的活动次数可高 ;<br /><br />*          可高的全局系统 CPU 利用率 ; <br /><br />*          内存不够出错 (out of memory errors)<br /><br /> <br /><br />处理器：<br /><br /> <br /><br />1 UNIX 资源监控（ Windows 操作系统同理）中指标 CPU 占用率（ CPU utilization ），如果该值持续超过 95% ，表明瓶颈是 CPU 。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于 SQL Server, 可接受的最大上限是 80-85% <br /><br /> <br /><br />合理使用的范围在 60% 至 70% 。<br /><br /> <br /><br />2 Windows 资源监控中，如果 System\Processor Queue Length 大于 2 ，而处理器利用率（ Processor Time ）一直很低，则存在着处理器阻塞。<br /><br /> <br /><br />CPU 资源成为系统性能的瓶颈的征兆 : <br /><br /> <br /><br />*          很慢的响应时间 (slow response time) <br /><br />*          CPU 空闲时间为零 (zero percent idle CPU) <br /><br />*          过高的用户占用 CPU 时间 (high percent user CPU) <br /><br />*          过高的系统占用 CPU 时间 (high percent system CPU) <br /><br />*          长时间的有很长的运行进程队列 (large run queue size sustained over time)<br /><br /> <br /><br />磁盘 I/O ：<br /><br /> <br /><br />1 UNIX 资源监控（ Windows 操作系统同理）中指标磁盘交换率（ Disk rate ），如果该参数值一直很高，表明 I/O 有问题。可考虑更换更快的硬盘系统。<br /><br /> <br /><br />2 Windows 资源监控中，如果 Disk Time 和 Avg.Disk Queue Length 的值很高，而 Page Reads/sec 页面读取操作速率很低，则可能存在磁盘瓶径。<br /><br /> <br /><br />I/O 资源成为系统性能的瓶颈的征兆 :<br /><br /> <br /><br />*          过高的磁盘利用率 (high disk utilization) <br /><br />*          太长的磁盘等待队列 (large disk queue length) <br /><br />*          等待磁盘 I/O 的时间所占的百分率太高 (large percentage of time waiting for disk I/O) <br /><br />*          太高的物理 I/O 速率 :large physical I/O rate(not sufficient in itself) <br /><br />*          过低的缓存命中率 (low buffer cache hit ratio(not sufficient in itself)) <br /><br />*          太长的运行进程队列，但 CPU 却空闲 (large run queue with idle CPU)<br /><br /> <br /><br />4 ．数据库服务器：<br /><br /> <br /><br />SQL Server 数据库：<br /><br /> <br /><br />1 SQLServer 资源监控中指标缓存点击率（ Cache Hit Ratio ），该值越高越好。如果持续低于 80% ，应考虑增加内存。<br /><br /> <br /><br />2 如果 Full Scans/sec （全表扫描 / 秒）计数器显示的值比 1 或 2 高，则应分析你的查询以确定是否确实需要全表扫描，以及 SQL 查询是否可以被优化。  <br /><br /> <br /><br />3 Number of Deadlocks/sec( 死锁的数量 / 秒 ) ：死锁对应用程序的可伸缩性非常有害，并且会导致恶劣的用户体验。该计数器的值必须为 0 。<br /><br /> <br /><br />4 Lock Requests/sec( 锁请求 / 秒 ) ，通过优化查询来减少读取次数，可以减少该计数器的值。<br /><br /> <br /><br />Oracle 数据库：<br /><br /> <br /><br />1 如果自由内存接近于 0 而且库快存或数据字典快存的命中率小于 0.90 ，那么需要增加 SHARED_POOL_SIZE 的大小。<br /><br /> <br /><br />快存（共享 SQL 区）和数据字典快存的命中率：  <br /><br /> <br /><br />select(sum(pins-reloads))/sum(pins) from v$librarycache; <br /><br /> <br /><br />select(sum(gets-getmisses))/sum(gets) from v$rowcache; <br /><br /> <br /><br />自由内存： select * from v$sgastat where name= ’ free memory ’ ; <br /><br /> <br /><br />2 如果数据的缓存命中率小于 0.90 ，那么需要加大 DB_BLOCK_BUFFERS 参数的值（单位：块）。<br /><br /> <br /><br />缓冲区高速缓存命中率：<br /><br /> <br /><br />select name,value from v$sysstat where name in (’db block gets’,<br /><br /> <br /><br />‘ consistent gets’,'physical reads’) ;<br /><br /> <br /><br />Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))<br /><br /> <br /><br />3 如果日志缓冲区申请的值较大，则应加大 LOG_BUFFER 参数的值。<br /><br /> <br /><br />日志缓冲区的申请情况 ：<br /><br /> <br /><br />select name,value from v$sysstat where name = ‘redo log space requests’ ;<br /><br /> <br /><br />4 如果内存排序命中率小于 0.95 ，则应加大 SORT_AREA_SIZE 以避免磁盘排序 。<br /><br /> <br /><br />内存排序命中率 ：<br /><br /> <br /><br />select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’<br /><br /> <br /><br />注：上述 SQL Server 和 Oracle 数据库分析，只是一些简单、基本的分析，特别是 Oracle 数据库的分析和优化，是一门专门的技术，进一步的分析可查相关资料。<br />经验表明，瓶颈很容易发生在如下地方：数据库连接与队列中；应用服务器的程序代码中；应用服务器和Web服务器硬件上；网络和TCP配置中。实际中可以着力对这些环节进行监控。
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/195375#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 17:49:56 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/195375</link>
        <guid>http://eminem.javaeye.com/blog/195375</guid>
      </item>
      <item>
        <title>The Grinder试用记录一-脚本录制</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/193303" style="color:red;">http://eminem.javaeye.com/blog/193303</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          The Grinder试用记录一-脚本录制<br /> <br />The Grinder是开源性能测试工具，用Java编写，其脚本语言用Jython编写，脚本编辑的界面不友好，但是脚本编写比较灵活，可以支持参数化和关联操作。跟openSTA一样，其脚本录制功能也可以录制dwr请求。支持分布式负载，测试过程中没有提供对服务器的监控方式。可以运行在window和liunx环境。脚本采用Jython，所以需要测试员有Jython经验，上手比较难。 <br />从http://grinder.sourceforge.net 网站下载The Grinder 3，解压后放到C盘下面，文件夹改名为grinder。该文件夹下面可以看到contrib，etc，example，lib文件夹，新建一个bin文件夹，用于存放生成的cmd可执行文件。 <br />The Grinder的脚本采用专用工具TCPProxy录制。具体步骤如下： <br />1、编写一个setGrinderEnv.cmd文件，放在bin文件夹下面，用于设置环境变量，内容如下： <br />    set GRINDERPATH=C:\grinder<br />           set GRINDERPROPERTIES=C:\grinder\etc\grinder.properties<br />2、编写一个startProxy.cmd文件，放在bin文件夹下面，用于启动TCPProxy，内容如下：<br />    call C:\grinder\bin\setGrinderEnv.cmd<br />           java net.grinder.TCPProxy -console -http > %GRINDERPATH%\grinder.py<br />           pause<br />    功能是录制http请求，把录制得到的脚本存储在grinder.py文件中。<br />3、双击startProxy.cmd文件后，录制启动，出现一个java程序窗口 TCPProxy Console。在这个窗口，你可以控制停止录制，也可以随时给脚本加评论。打开浏览器，设置代理服务器的地址为127.0.0.1，端口8001，然后 地址栏输入被测试服务的url，进行录制，录制过程中，可以随时用“Insert comment”按钮在脚本中插入评论。录制完成后，点击窗口中的“Stop”按钮，录制停止。<br />4、录制停止后，进入C:\grinder，找到文件 grinder.py，该文件就是录制得到的测试脚本。<br />  <br /> <br /> The Grinder试用记录二-分布式测试<br />    The Grinder的分布式测试操作很简单，步骤如下：<br />    1、客户端（192.168.0.101）建立一个C:\grinder\etc\grinder.properties配置文件，该文件是一个配置文 件，指定运行的测试脚本，运行的进程，线程数，循环次数，并指定分布式测试的控制服务器地址和端口（默认为6372，端口值可以通过 文件-选项 修改）。例如：<br />         grinder.processes=2<br />         grinder.threads=3<br />         grinder.runs=4<br />         grinder.logDirectory=log<br />         grinder.numberOfOldLogs=2<br />         grinder.consoleHost=192.168.0.100<br />         grinder.consolePort=6372<br />         grinder.useConsole=true<br />         grinder.script=grinder.py<br />    2、控制端（192.168.0.100）建立一个startConsole.cmd文件并启动，启动后会出现一个“The Grinder控制台”窗口。文件内容如下：<br />         call C:\grinder\bin\setGrinderEnv.cmd<br />         java net.grinder.Console<br />         pause<br />    3、客户端（192.168.0.101）建立一个startAgent.cmd文件并启动，文件内容如下：<br />         call C:\grinder\bin\setGrinderEnv.cmd<br />         java net.grinder.Grinder %GRINDERPROPERTIES%<br />         pause<br />        把测试脚本 grinder.py拷贝到和startAgent.cmd同一个文件夹下面。<br />   4、客户端启动后，会根据grinder.properties文件的配置连接控制端，连接上以后，控制端的 动作-启动进程 选项变成可选，点击该选项，客户端的测试进程启动，开始测试。测试过程中，控制端能看到各个测试项运行的状态。<br />   5、测试结束后，查看bin文件夹下面的log文件夹，可以看到各个测试进程，各个测试项的统计指标。<br />   如果不想用分布式测试，把控制端和客户端都放到一个机器下运行就可以。<br /><br />字号： 大  中  小 <br />The Grinder试用记录三-脚本编辑<br />    如果懂Jython语法，那么操作脚本（包括参数化和关联）是非常简单的事情，下面这个脚本向blog.163.com发送一个dwr请求，并把response内容保存到文件。<br />from net.grinder.script import Test<br />from net.grinder.script.Grinder import grinder<br />from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest<br />from HTTPClient import NVPair<br />connectionDefaults = HTTPPluginControl.getConnectionDefaults()<br />httpUtilities = HTTPPluginControl.getHTTPUtilities()<br /># To use a proxy server, uncomment the next line and set the host and port.<br /># connectionDefaults.setProxyServer("localhost", 8001)<br /># These definitions at the top level of the file are evaluated once,<br /># when the worker process is started.<br />connectionDefaults.defaultHeaders = \<br />  ( NVPair('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'), )<br /><br />headers3= \<br />  ( NVPair('Accept', '*/*'),<br />    NVPair('Referer', 'http://blog.163.com/'),<br />    NVPair('Accept-Language', 'zh-c'), )<br />url7 = 'http://blog.163.com:80'<br /># Create an HTTPRequest for each request, then replace the<br /># reference to the HTTPRequest with an instrumented version.<br /># You can access the unadorned instance using request101.__target__.<br />request1001 = HTTPRequest(url=url7, headers=headers3)<br />request1001 = Test(1001, 'POST UserBean.getProvinceAndCity.dwr').wrap(request1001)<br />class TestRunner:<br />  """A TestRunner instance is created for each worker thread."""<br />  def page10(self):<br />    """POST UserBean.getProvinceAndCity.dwr (request 1001)."""<br />    result = request1001.POST('/dwr/call/plaincall/UserBean.getProvinceAndCity.dwr',<br />      '''callCount=1\n\<br />page=/\n\<br />httpSessionId=\n\<br />scriptSessionId=4FC528EBDD341FE22046F074D587F3733\n\<br />c0-scriptName=UserBean\n\<br />c0-methodName=getProvinceAndCity\n\<br />c0-id=0\n\<br />c0-param0=boolean:false\n\<br />c0-param1=boolean:false\n\<br />batchId=0\n\<br />''',<br />      ( NVPair('Content-Type', 'text/plain'), ))<br />    return result<br /> <br />  def __call__(self):<br />    """This method is called for every run performed by the worker thread."""<br />    result1=self.page10()     # POST UserBean.getProvinceAndCity.dwr (request 1001)<br />    writeToFile(result1.getText())<br />    <br />    <br />def writeToFile(text):<br /> filename = grinder.getFilenameFactory().createFilename(<br />  "page", "-%d.html" % grinder.runNumber)<br /> file = open(filename, "w")<br /> print >> file, text<br /> file.close()<br />    <br />    <br />参考资料：<br />1、官方介绍资料：http://grinder.sourceforge.net/g3/scripts.html<br />2、Script API ：http://grinder.sourceforge.net/g3/script-javadoc/index.html<br />3、官方例子：http://grinder.sourceforge.net/g3/script-gallery.html<br />4、Jython学习资料：https://www6.software.ibm.com/developerworks/cn/education/java/j-jython2/tutorial/
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/193303#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 15:16:13 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/193303</link>
        <guid>http://eminem.javaeye.com/blog/193303</guid>
      </item>
      <item>
        <title>JDK中Jconsole的使用</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/193254" style="color:red;">http://eminem.javaeye.com/blog/193254</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JDK中Jconsole的使用<br />2008-04-03 14:16<br />JAVA应用程序打成jar包的部署方式：<br /><br />一、Local方式<br />1、cmd进入dos下，进入到应用程序所在目录，执行语句如下：<br />java -Dcom.sun.management.jmxremote -jar 程序名.jar<br />(java -Dcom.sun.management.jmxremote -jar Java2Demo.jar)(测试例子Java2Demo.jar在C:\Program Files\Java\jdk1.6.0_02\demo\jfc\Java2D\)<br /><br />还出不来的话 直接 在dos里 jconsole 进程号<br /><br />2、启动jdk_home\bin目录下的Jconsole.exe就可以看到有一个<br /><br />本地的连接在里面。点击连接就可以进入相应的监视界面了。<br /><br />二、JMX方式（远程连接）：<br />1、cmd进入dos下，进入到应用程序所在目录，执行语句如下：<br />java -Dcom.sun.management.jmxremote.port=8903 -<br /><br />Dcom.sun.management.jmxremote.ssl=false -<br /><br />Dcom.sun.management.jmxremote.authenticate=false<br />-Djava.rmi.server.hostname=192.168.***.***<br /><br />2、启动jdk_home\bin目录下的Jconsole.exe点高级。在JMX<br /><br />URL:中输入语句如下：<br /><br />service:jmx:rmi:///jndi/rmi://192.168.***.***:8903/jmxr<br /><br />mi<br />点连接就可以进行远程监控了<br /><br /><br /><br />web应用程序在tomcat中部署JMX（示例：tomcat-6.0.14）<br />1、启动tomcat\bin目录下的tomcat6w.exe，在JAVA_OPTS里设<br /><br />置如下：<br />-Dcom.sun.management.jmxremote.port=8903<br />-Dcom.sun.management.jmxremote.ssl=false<br />-Dcom.sun.management.jmxremote.authenticate=false<br />-Djava.rmi.server.hostname=192.168.***.***<br /><br />注意：不能有空格，不然tomcat不能启动。<br /><br />2、tomcat启动成功后，就可以在另一台机器上启动<br /><br />jdk_home\bin目录下的Jconsole.exe点高级。在JMX URL:中输<br /><br />入语句如下：<br /><br />service:jmx:rmi:///jndi/rmi://192.168.***.***:8903/jmxr<br /><br />mi<br />点连接就可以进行远程监控了<br /><br />以上是JMX基本部署，没有涉及到验证方面，如果使用的话，可<br /><br />能会有漏洞，因为SSL和authenticate设置为false的话，那么<br /><br />8903端口就有可能有暴露的危险。<br /><br />如果想进行密码验证话，可以在网上找资料，自己进行调试。<br /><br /><br />我自己的应用：<br />1.修改Linux下tomcat的bin目录下的catalina.sh文件<br />添加<br />JAVA_OPTS=-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false <br />-Dcom.sun.management.jmxremote.port=7080  <br />-Dcom.sun.management.jmxremote<br />2.修改/etc/hosts文件下的localhost对应的IP（127.0.0.1）地址，改为linux自身的IP如10.0.0.157.<br />3.打开jconsole远程输入 10.0.0.157:7080
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/193254#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 13:06:56 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/193254</link>
        <guid>http://eminem.javaeye.com/blog/193254</guid>
      </item>
      <item>
        <title>Jprofiler 安装</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/190287" style="color:red;">http://eminem.javaeye.com/blog/190287</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          2008-02-14 11:22WEB服务总是莫名其妙的运行一段时间后JVM直接OutOfMemory错误，这个问题一直困扰着程序的正常运行。大概半个月时间一次，上网查了些资料，也做了不少优化，什么weblogic环境变量Xms，Xmx，MaxPermSize参数调整，可问题依旧，况且这也是治标不治本，问题也许发生在程序中，可能存在内存泄露，或spring和hibernate框架相关的问题。<br /><br />在网上找到个大家说很好的工具叫Jprofiler，学着弄弄，down下来个最新版本。软件需要注册，注册后有十天的试用期。现在把安装过程记下来。<br /><br />由于我要监控的程序是在远程的linux系统下的weblogic服务，所以这里记录的是远程监控的配置过程。<br /><br />先介绍下环境：<br /><br />系统服务器：<br /><br />操作系统：linux redhat<br /><br />web服务器：weblogic 8.1<br /><br />java虚拟机版本：1.4.2<br /><br />jprofiler版本：jprofiler_linux_5_1_2.tar.gz（安装包共三个版本 sh，exe，tar.gz）<br /><br />客户端：<br /><br />操作系统：Windows Xp SP2<br /><br />jprofiler5.1.2 for windows（安装包：jprofiler_windows_5_1_2.zip）<br /><br />安装：<br /><br />一.客户端安装：<br />1 windows下直接解压zip包，运行jprofiler5.1.2的exe安装即可。<br />2 运行jprofiler并进行配置<br />1）Quick Start:<br />       选择 An application on a remote computer <br />       ->Next<br />2）Local or remote:<br />       The profiled application s located 选择 On a remote computer,<br />      Platform of the remote computer 下拉菜单选择“Linux X86/AMD64”<br />      ->Next<br />3）Remote address :填写被监控应用程序所在远程计算机的IP<br />4）Installation directory:解压路径：/var/jprofiler5<br />5) choose JVM : <br />     JVM Vendor: Sun jvm提供商<br />    Version:1.4.2 版本<br />     Mode：hotspot 系统默认 <br />6）jprofile port :8849 <br />7）startup mode:<br />      Wait for ……   为了在开发环境中获取监控的信息，它将等待远程计算机上的Jprofile GUI 启动，并和本机建立连接，这种方式比较便于修改jprofiler的配置信息。<br />        Don't wait for …… 不必等待远程计算机的Jprofile GUI 先启动和建立连接，立即启动。但在启动远程应用程序前必须校验当前所配置会话的配置文件。虚拟机参数将参考Jprofile 的config 文件的路径。<br />这里选择Don't wait for ……<br />      ->Next <br />8) Config synchronization:<br />      Directory for config file in the remote computer:/opt (远程config文件的路径)<br />      同步方式：<br />    Manual synchronization；copy to diretory；execute command:<br />      提供三种同步方式，这里我选择的是第一个手工同步。<br />     ->Next<br />9)Perform modifications:<br />     Integration type: [Generic application]<br />     Selected JVM: Sun 1.4.2 (hotspot)<br />    Startup mode: Don't wait for JProfiler GUI, startup immediately<br /><br />     Important: The local config file C:\Documents and Settings\Jan\.jprofiler5\config.xml must be copied manually to /opt on the remote computer when the profiling settings are changed.<br /><br /><br />    (1) Please insert<br /><br />         -Xrunjprofiler:port=8849,nowait,id=115,config=/opt/config.xml -Xbootclasspath/a:/var/jprofiler5/bin/agent.jar<br /><br />      into the start command of your remote application right after the java command.<br /><br />     (2) Please add<br /><br />         /var/jprofiler5/bin/linux-x86<br /><br />     to the environment variable LD_LIBRARY_PATH.<br /><br />      A remote session named Remote application on 10.5.31.49 will be created that connects to a running instance of the remote application that is started with the modified start command.<br /><br />      这里的黑体文字部分要保存下来，在服务器端安装时会用到。<br />      ->Next<br />   10) Finished:<br />        选No，I will start the session later<br />      因为我们还没有配置服务器端。<br /><br />二.服务器端安装<br />1 将jprofiler_linux_5_1_2.tar.gz上传到服务器上，/var/下建立jprofiler5目录，并将程序解压到/opt/jprofiler5下即可<br />2 修改用户环境变量.bash_profile。<br />    加入export LD_LIBRARY_PATH=/var/jprofiler5/bin/linux-x86。如果是 64 位服务器，则选择linux-x64。 <br />    运行source .bash_profile 使环境变量立即生效<br />3 添加weblogic启动参数<br />    将一.9).(1)中黑体的部分加到weblogic的启动文件startWebLogic.sh的参数中如：<br />    ${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} ${JAVA_OPTIONS} -verbosegc <br />    -Xrunjprofiler:port=8849,nowait,id=115,config=/opt/config.xml -Xbootclasspath/a:/var/jprofiler5/bin/agent.jar <br />    -Dweblogic.Name=${SERVER_NAME} -Dweblogic.ProductionModeEnabled=${PRODUCTION_MODE} -Djava.security.policy="${WL_HOME}/server/lib/weblogic.policy" weblogic.Server<br />    尽量让它在一行中。<br />4 把 C:\Documents and Settings\Jan\.jprofiler5\ 下的config.xml上传到服务器上，路径为一.8)中配置的Directory for config file in the remote computer:/opt <br />    因为这里选择的同步方式是Manual synchronization，所以以后配置发生改变时，需要手工再次上传新的config.xml到这个路径。<br />三.启动weblogic服务：<br /><br />**************************************************<br />* To start WebLogic Server, use a username and   *<br />* password assigned to an admin-level user. For *<br />* server administration, use the WebLogic Server *<br />* console at http://[hostname]:[port]/console    *<br />***************************************************<br />JProfiler> Protocol version 25<br />JProfiler> Using JVMPI<br />JProfiler> 32-bit library<br />JProfiler> Don't wait for frontend to connect.<br />JProfiler> Using config file /opt/config.xml (id: 114)<br />JProfiler> Listening on port: 8849.<br />[Full GC 114K->84K(520256K), 0.0063330 secs]<br />JProfiler> Native library initialized<br />JProfiler> If output stops here, please remove -Xdebug from the command line<br />JProfiler> Using dynamic instrumentation<br />JProfiler> Time measurement: elapsed time<br />JProfiler> CPU profiling enabled<br />JProfiler> Hotspot compiler enabled<br />JProfiler> Starting weblogic/Server ...<br /><br />&lt;Feb 5, 2008 11:41:31 AM CST> &lt;Info> &lt;WebLogicServer> &lt;BEA-000377> &lt;Starting WebLogic Server with Java HotSpot(TM) Client VM Version 1.4.2_09-b05 from Sun Microsystems Inc.> <br />&lt;Feb 5, 2008 11:41:31 AM CST> &lt;Info> &lt;Configuration Management> &lt;BEA-150016> &lt;This server is being started as the administration server.><br /><br /> <br />二<br /><br /><br />版本jprofiler5_0 <br /><br />Server两台 TOMCAT | WEBLOIGC<br /><br /><br /><br />一.Linux<br /><br />1.安装<br /><br /># ./jprofiler_linux_5_0.sh -q<br /><br />1.配置环境<br /><br />export LD_LIBRARY_PATH=/opt/jprofiler5/bin/linux-x64<br /><br />3.配置<br /><br />a)TOMCAT<br /><br />修改bin/catalina.sh # ----- Execute The Requested Command -----------------------------------------<br />JAVA_OPTS="-servezhdr -Xmx768m -Xms512m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true <br />将下面补充到已有的JAVA_OPTS后,保持在一行中<br />-agentlib:jprofilerti=port=8849,nowait,id=104,config=/opt/config.xml -Xbootclasspath/a:/opt/jprofiler5/bin/agent.jar<br /><br />config.xml文件放到/opt目录下,修改其中SESSION标签IP地址内容<br /><br />重启TOMCAT<br />配置后tomcat会出现无法shutdown,可以通过kill进程杀掉,然后重启即可.<br /><br /><br />b)WEBLOGIC<br /><br />修改bin/setDomainEnv.sh<br /><br />JAVA_OPTIONS="${JAVA_OPTIONS} ${JAVA_PROPERTIES} -Dwlw.iterativeDev=${iterativeDevFlag} -Dwlw.testConsole=${testConsoleFlag} -Dwlw.logErrorsToConsole=${logErrorsToConsoleFlag}" <br />将下面补充到已有的JAVA_OPTS后,保持在一行中<br />-agentlib:jprofilerti=port=8849,nowait,id=104,config=/opt/config.xml -Xbootclasspath/a:/opt/jprofiler5/bin/agent.jar<br /><br /><br />config.xml文件放到/opt目录下,修改其中SESSION标签IP地址内容<br /><br />重启WEBLOGIC<br />配置后weblogic会出现无法shutdown,可以通过kill进程杀掉,然后重启即可.<br /><br /><br /><br />二.Windows安装<br /><br />注册码可到官方网站注册即可获得(10 days).<br /><br />http://www.ej-technologies.com
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/190287#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 16:31:46 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/190287</link>
        <guid>http://eminem.javaeye.com/blog/190287</guid>
      </item>
      <item>
        <title>DB2基础（精）</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/183756" style="color:red;">http://eminem.javaeye.com/blog/183756</a>&nbsp;
          发表时间: 2008年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://database.ctocio.com.cn/tips/153/8080153.shtml" target="_blank">http://database.ctocio.com.cn/tips/153/8080153.shtml</a>
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/183756#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Apr 2008 14:39:14 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/183756</link>
        <guid>http://eminem.javaeye.com/blog/183756</guid>
      </item>
      <item>
        <title>水晶报表文档</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/181744" style="color:red;">http://eminem.javaeye.com/blog/181744</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1  环境部署<br />1.1       水晶报表插件<br /><br />现在我搭建的水晶报表的开发环境是eclipse，首先，我们要下载水晶报表的插件，下载地址是：<br /><br />http://diamond.businessobjects.com/node/450<br /><br />其中上面有三种插件：<br /><br />·                               Download All-in-one Installation 是带有Crystal Reports插件的eclipse3.2完整版; （现在使用）<br /><br />·                               Download Crystal Reports for Eclipse Runtime - Manual Installation 这是纯Crystal Reports插件;(建议)<br /><br />·                               Download and Install Crystal Reports for Eclipse via the Update Manager 通过eclipse的更新来安装CR4E;<br />1.2       水晶报表的设计<br /><br />（1）新建一个crystal report web project<br /><br />（2）新建一个blank report<br /><br />（3）空报表创建完成后，就进入了报表设计界面，首先，连接数据库，在batabase explore面板新建一个连接，依次填入下面的内容：<br /><br />     选择相应的数据库（如：Oracal 9）；<br /><br />     Connection Name：可填可不填；<br /><br />     Databasebase：要连接的数据库的名称；<br /><br />     JDBC driver class：（如：oracle.jdbc.driver.OracleDriver）<br /><br />     Class location：（如：载入classes12.jar）<br /><br />     Connection URL：（如：jdbc:oracle:thin:@10.16.11.252:1521:obd）<br /><br />     User information：填入用户名和密码；<br /><br />     最后完成。<br /><br />（4）设计报表：设计界面由四个面板Layout，Formulas，Data，Preview。<br /><br />     Layout:设计界面，Formulas：公式设计界面，Data：数据表的存放界面，Preview：预览界面。<br /><br />在batabase explore面板里选择添加的表，拖到Data面板内。要插入字段右击该字段选择insert，可以进行ctrl和shift操作。<br /><br />（5）报表的其他详细的设计细节不在本文档中详细介绍。<br />1.3        水晶报表的web部署<br /><br />第一种方法傻瓜式水晶报表的jsp显示:<br /><br />创建好报表后，直接右击水晶报表crystal report——〉create viewer jsp自动生成代码。<br /><br />第二种自定义报表源式：<br /><br />1.   将一个指向查看器标记库描述符文件的引用添加到 JSP 页面的顶部。同时必须确保相应的 JAR 文件和附加支持文件都存在。<br /><br />         &lt;%@ import="com.crystaldecisions.reports.sdk.ReportClientDocument"><br /><br />         &lt;%@ taglib uri="/crystal-tags-reportviewer.tld" prefix="crviewer" %><br /><br />         注意：    可以为 prefix 属性指定任何名称。prefix 确定要使用什么标记前缀来访问标记库的标记。<br /><br />       2.  创建报表源，设置报表源的属性，把报表源缓存于session变量中（必需的）<br /><br />           &lt;% <br />                final String reportName="rpt/Sample.rpt";<br />                ReportClientDocument crDoc = new ReportClientDocument();<br />                crDoc.open(reportName,0);<br />                crDoc.getDatabaseController().logon("sa","");<br />                session.setAttribute("reportSource",crDoc.getReportSource());<br />          %><br /><br />          注意：如果viewer标记的reportSourceVar属性的默认值是crystalReportSource，如果用这个做session变量的名称，那可以不用设置reportSourceVar。 <br /><br />      3.   创建一个开始 viewer 标记。在此标记中，指定查看器名称和报表源的类型。<br /><br />            &lt;crviewer:viewer viewerName="CrystalViewer" reportSourceType="pageServer" reportSourceVar="reportSource"><br /><br />       4.  结束 viewer 标记。 JSP 页面现在即可查看名为 Sample的报表。<br /><br />           &lt;/crviewer:viewer>
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/181744#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 13:46:45 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/181744</link>
        <guid>http://eminem.javaeye.com/blog/181744</guid>
      </item>
      <item>
        <title>DB2中常用备份,恢复命令和db2move的使用</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/165544" style="color:red;">http://eminem.javaeye.com/blog/165544</a>&nbsp;
          发表时间: 2008年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DB2离线和在线全备、增量备份及恢复的操作步骤<br /><br />1、离线全备份<br /><br />1）、首先确保没有用户使用DB2:<br />$db2 list applications for db sample<br />2）、停掉数据库并重新启动，以便断掉所有连接：<br />db2stop force<br />db2start<br />3）、执行备份命令：（使用TSM作为备份的介质）<br />db2 backup db sample use tsm<br />备份成功，将会返回一个时间戳。<br />4）、检查备份成功：<br />db2 list history backup all for sample ，可以看到多了这个备份的纪录。<br />db2adutl query命令也可以看到返回值。<br />5）、备注：<br />首先对主节点（catalog表空间在的节点）执行备份命令，再对另外的节点也做这个操作。<br /><br />2、 在线备份：<br /><br />1）、首先打开一下支持在线备份的数据库配置参数：<br />db2 update db cfg for sample using userexit on 启用用户出口<br />db2 update db cfg for sample using logretain on 启用归档日志<br />db2 update db cfg for sample using trackmod on 启用增量备份功能<br />(需要各个Node都分别做设置)<br />开启这些参数后，数据库处于backup pending状态，要求做数据库的离线全备份。做一下离线全备份，参考上面的命令。<br />2）、在线备份命令如下：<br />db2 backup db sample online use tsm<br />备份成功，返回一个时间戳。<br />3）、同样可以用db2adutl 和db2 list history察看备份纪录。<br />4）、备注：<br />同样，对每个节点都做这个操作。<br /><br />3、 在线增量备份<br /><br />1）、在开启了必须的三个参数的情况下，做增量备份：<br />db2 backup db sample online incremental use tsm<br />备份成功，返回一个时间戳。<br />2）、同样可以用db2adutl 和db2 list history察看备份纪录。<br />3）、还有一种delta的备份：<br />db2 backup db sample online incremental delta use tsm<br />这两种备份的区别，类似Oracle Exports的Incremental和Cumulative方式，db2的incremental对应oracle的cumulative方式，而db2的delta方式则对应oracle的incremental方式。<br />4）、备注：<br />同样，对每个节点都做这个操作。<br /><br /><br />4、 恢复数据库<br /><br />1）、手工drop数据库，模拟灾难恢复的情况，执行如下操作：<br />db2 drop db sample<br />2）、恢复备份历史纪录（每次backup，不论类型，都会备份历史纪录文件）。这里的时间戳应该是最新的：<br />db2 restore db sample history file use tsm taken at 20030102223107 buffer 100<br />3）、使用db2的恢复帮助工具：<br />db2ckrst -d sample -t 20030101224424 -r database<br />命令返回建议的必需的恢复操作命令。<br />4）、按照帮助工具的提示，先做版本恢复，恢复命令如下：<br />db2 restore db sample incremental use tsm taken at 20030101224424 buffer 100<br />同样先做主节点的恢复，再做其他节点的恢复操作。<br />5）、这时数据库处于rollforward-pending state的状态，需要做roll forward 操作：<br />db2 rollforward db sample to 2003-01-12-13.27.25.000000 on all nodes and stop<br />前滚到同一个时间点。这个操作要在主节点来做。<br /><br /><br />5、有关说明：<br /><br />1）、恢复操作也有online和offline的,区别如同backup的操作。<br />2）、按照表空间的备份和恢复类似，加子句TABLESPACE ( tablespace-name )即可。表空间级别的备份/恢复操作要求数据库处于归档日志和启用增量备份模式下。<br />3）、恢复的例子中只做了版本恢复。若还有更新的全备份和增量备份的image，可以依次做恢复（注意使用db2ckrst的建议恢复次序和次数）后，再做roll forward.<br /><br /> <br /><br />db2 force applications all<br />db2 backup db ldapdb2 to directory_or_device<br />db2 restore db ldapdb2 from directory_or_device replace existing其中 directory_or_device 是存储备份的目录或设备的名称。<br /><br />windows 迁移到 linux:<br />db2move tfms export;<br />create db tfms;<br />db2move tfms -u -p import > a.txt;<br />db2move tfmsw179 import -u db2admin -p db2admin > a.txt<br /><br />确认执行:TERMINATE<br /><br />6、恢复数据库<br /> (1)先创建空数据库:db2 create db NewdbName<br /> (2)db2 restore olddbName(需恢复数据库名称) taken at Times(时间点) into NewdbName(新数据库名称)<br /> 注：在恢复新的数据库的名称和刚创建的名称一样。<br />//////<br /><br />我自己的运用:<br />导出数据：<br />1：在DOS里运行DB2CMD<br />2:在D盘新建个文件夹CMS，在DB2CMD的DOS里CD到CMS目录<br />3：运行db2move 要备份的数据库名称 export -u 用户名 -p 密码<br />4：成功<br />导出数据：<br />1：在DB2控制台里建设一个空的数据库（缺省缓冲池和表空间大小设置大点最高32K，代码集设置UTF-8）<br />2.首先在D盘选择一个文件夹例如cms<br />3：运行db2move test import -u 用户名 -p 密码 <br /><br /><br />注：改日志空间大小 右键数据库--->配置参数--->LOGFILSIZ设置大小 可以设置大点 例如50000
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/165544#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Feb 2008 18:06:43 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/165544</link>
        <guid>http://eminem.javaeye.com/blog/165544</guid>
      </item>
      <item>
        <title>SQL面试</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/164776" style="color:red;">http://eminem.javaeye.com/blog/164776</a>&nbsp;
          发表时间: 2008年02月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1 	SQL面试题<br />	<br />1)Which statement shows the maximum salary paid in each job category of each department?_______<br />A. select dept_id, job_cat,max(salary) from employees where salary > max(salary);<br />B. select dept_id, job_cat,max(salary) from employees group by dept_id,job_cat;<br />C. select dept_id, job_cat,max(salary) from employees;<br />D. select dept_id, job_cat,max(salary) from employees group by dept_id;<br />E. select dept_id, job_cat,max(salary) from employees group by dept_id,job_cat,salary;<br /><br />2)description of the students table:<br />  sid_id                       number<br />  start_date                   date<br />  end_date                     date<br />which two function are valid on the start_date column?_________。<br />A.sum(start_date)<br />B.avg(start_date)<br />C.count(start_date)<br />D.avg(start_date,end_date)<br />E.min(start_date)<br />F.maximum(start_date)<br /><br />3)for which two constraints does the oracle server implicitly create a unique index?______。<br />A. not null<br />B. primary<br />C. foreign key<br />D. check<br />E. unique<br /><br />4)in a select statement that includes a where clause,where is the group by clause placed in the select statement?______。<br />A. immediately after the select clause<br />B. before the where clause<br />C. before the from clause<br />D. after the order by clause<br />E. after the where clause<br /><br />5)in a select statement that includes a where clause,where is the order by clause placed in the select statement?______.<br />A.immediately after the select clause<br />B.before the where clause<br />C.after all clause<br />D.after the where clause<br />E.before the from clause<br /><br />6)evaluate there two sql statements______.<br />Select last_name,salary from employees order by salary;<br />Select last_name,salary from employees order by 2 asc;<br />A.the same result  B.different result C.the second statement returns a syntax error<br /><br />7) you would like to display the system date in the format“20051110 14：44：17”。Which select statement should you use?______。<br />A. select to_date(sydate,’yearmmdd hh:mm:ss’)from dual;<br />B. select to_char(sydate,’yearmonthday hh:mi:ss’)from dual;<br />C. select to_date(sydate,’yyyymmdd hh24:mi:ss’)from dual;<br />D. select to_char(sydate,’yyyymmdd hh24:mi:ss’)from dual;<br />E. select to_char(sydate,’yy-mm-dd hh24:mi:ss’)from dual;<br /><br />8)which select statement will the result ‘ello world’from the string‘Hello world’?______.<br />A. select substr(‘Hello World’,1)from dual;<br />B. select substr(trim(‘Hello World’,1,1))from dual;<br />C. select lower(substr(‘Hello World’,1))from dual;<br />D. select lower(trim(‘H’from‘Hello World’))from dual;<br /><br />9)which are DML statements(choose all that apply)______.<br />A.commit  B.merge   C.update  D.delete E.creat  F.drop<br /><br />10)Select 语句中用来连接字符串的符号是______.<br />A. “+”   B. “&” C.“||” D.“|”<br /><br />问答题： 什么是聚集索引，什么是非聚集索引，什么又是主键？<br />	<br />	作者： fffly   2006-10-4 10:52 　 回复此发言  <br />	<br />2 	回复：SQL面试题<br />	<br />1<br />B. select dept_id, job_cat,max(salary) from employees group by dept_id,job_cat;<br /><br />2<br />C.count(start_date)<br />E.min(start_date)<br /><br />3<br />B. primary<br />E. unique<br /><br />4<br />E. after the where clause<br /><br />5<br />C.after all clause<br /><br />6<br />A.the same result <br /><br />7<br />D. select to_char(sydate,’yyyymmdd hh24:mi:ss’)from dual;<br /><br />8<br />D. select lower(trim(‘H’from‘Hello World’))from dual;<br /><br />9<br />不详,猜测B,( E.creat F.drop 都是DDL)<br /><br />10<br />C.“||”<br /><br />问答题： 什么是聚集索引，什么是非聚集索引，什么又是主键？<br /><br /> 表中经常有一个列或列的组合，其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键.<br /> 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿，后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序，<br /> 因此一个表只能包含一个聚集索引。但该索引可以包含多个列（组合索引），就像电话簿按姓氏和名字进行组织一样。<br /> 非聚集索引与课本中的索引类似。数据存储在一个地方，索引存储在另一个地方，索引带有指针指向数据的存储位置。<br /> 索引中的项目按索引键值的顺序存储，而表中的信息按另一种顺序存储（这可以由聚集索引规定）。<br /> 如果在表中未创建聚集索引，则无法保证这些行具有任何特定的顺序。<br />	<br />	作者： fffly   2006-10-4 10:53 　 回复此发言  <br />	<br />3 	回复：SQL面试题<br />	<br />1.磁盘柜上有14块73G的磁盘， 数据库为200G 大小包括日志文件，如何设置磁盘？<br />2.有两服务器群集，分别为node1和node2 现在要打win200系统补丁，打完后，要重新启动，如何打补丁，不能影响用户使用。<br />3.有一个A 数据库，分别复制到B和C B 要求 每次数据更新 也同时更新，C 每天更新一次就行，如何制定复制策略!<br />4.有一个order 表，有90个字段，20个索引，15个复合索引，其中有3个索引字段超过10个，如何进行优化<br />5.有一个数据库200G大小，每天增加50M 允许用户随时访问，制定备份策略。<br />6.管理50台数据库，日常工作是检查数据库作业是否完成，你该如何完成这项检查工作？<br />7.自定义函数和存储过程的区别是什么，什么情况下只能用自定义函数，什么情况下只能用存储过程<br />8.SQL 2005 的新特性是什么 ？ 与oracle 有什么区别？<br />9.DBA 的品质应该有哪些，你有哪些， 有什么欠缺的？<br />	<br />	作者： fffly   2006-10-4 10:54 　 回复此发言  <br />	<br />4 	回复：SQL面试题<br />	<br />1)采用RAID 5方式.数据文件和日志文件分别放在不同的磁盘上.<br />2)先打node2,完成后切换到node2然后再打node1.<br />3)A->B采用事务复制,A->C采用快照复制并指定日期过滤条件<br />4)采用差异日志备份.<br />5)写一个自动管理程序,遍历50太机器上的所有job执行状态然后给出状态报表<br />6)函数都有返回值,存储过程不一定有,函数都必须被其他程序调用,存储过程不是,函数结果可以作为查询结果集的一个字段,存储过程不能.当要直接获得结果集时,只能使用存储过程<br />7)SQL server 2005增加了CRL和Try...catch异常检查语法增加了rownumber,rank, dense_rank以及pivot和unpivot等等新的语法.把先前的开发和管理以及监控等工具集成到了一个叫management studio 的工具.<br />8)DBA应有敏锐的观察力和判断能力,要细心和有耐心.<br /><br />1.磁盘柜上有14块73G的磁盘， 数据库为200G 大小包括日志文件，如何设置磁盘？<br /> Raid0+1<br />2.有两服务器群集，分别为node1和node2 现在要打win200系统补丁，打完后，要重新启动，如何打补丁，不能影响用户使用。<br /> 先启动一台再启动另一台<br />3.有一个A 数据库，分别复制到B和C B 要求 每次数据更新 也同时更新，C 每天更新一次就行，如何制定复制策略!<br /> 事务复制和快照复制<br />4.有一个order 表，有90个字段，20个索引，15个复合索引，其中有3个索引字段超过10个，如何进行优化<br /> 索引过多，要整合，90个字段，尽量范式<br />5.有一个数据库200G大小，每天增加50M 允许用户随时访问，制定备份策略。<br /> 先做一次完整备份，然后日志备份<br />6.管理50台数据库，日常工作是检查数据库作业是否完成，你该如何完成这项检查工作？<br /> a、作业运行完发mail<br /> b、写程序访问msdb中的相关表<br />7.自定义函数和存储过程的区别是什么，什么情况下只能用自定义函数，什么情况下只能用存储过程<br /> 区别：我想存储过程被调用后会常驻内存，下次调用会更快；函数必须有返回值而存储过程可以没有。<br />8.SQL 2005 的新特性是什么 ？ 与oracle 有什么区别？<br /> 增加了新的数据类型varchar(MAX)、XML；增强了排序功能(Row_Number、Rank、NTile等)；新增CET功能，表分区，在线索引，DDL触发器，安全方面的加强等等。<br /> 当然与oracle有区别，很多方面都不同，具体问题才好具体回答。<br />9.DBA 的品质应该有哪些，你有哪些， 有什么欠缺的？<br /> 至少有良好的心理素质，抗压能力强！强的责任心，细心，太多了...
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/164776#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Feb 2008 16:35:54 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/164776</link>
        <guid>http://eminem.javaeye.com/blog/164776</guid>
      </item>
      <item>
        <title>DB2纯SQL存储过程入门实践</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/158385" style="color:red;">http://eminem.javaeye.com/blog/158385</a>&nbsp;
          发表时间: 2008年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DB2纯SQL存储过程入门实践<br /> <br /> <br />背景：本人现在在DB2 9.1做Birt应用，需用写纯SQL的存储过程，经过多层嵌套循环查询多个表，并返回一个最终的结果集（打开的游标）。然后再在birt中直接调用以下就获取了结果集的纪录，并展示在页面中。为此，我在网上搜索了很多资料，但是没有一个完整的可以执行的DB2存储过程。研究好久了，终于写出来了一个模板性的示例出来。现在拿出来，和各位网友共同分享交流。<br /> <br />示例说明：先创建一个临时表，并插入数据，然后查询临时表，返回游标。<br /> <br />create procedure testPrc()<br /> -- 返回一个纪录<br /> dynamic result sets 1<br />------------------------------------------------------------------------<br />-- sql 存储过程<br />------------------------------------------------------------------------<br />p1: begin<br />-- 定义一个全局临时表tmp_hy<br />declare global temporary table session.tmp_hy<br />    (<br />       dm varchar(10),<br />       mc varchar(10)        <br />    )<br />     with replace -- 如果存在此临时表，则替换<br />     not logged;  -- 不在日志里纪录<br />    -- 给临时表插入三条数据<br />    insert into session.tmp_hy values('1','1');<br />    insert into session.tmp_hy values('1','1');<br />    insert into session.tmp_hy values('1','1');<br />   <br />p2: begin   <br /> -- 声明游标<br /> declare cursor1 cursor with return for<br />  select * from session.tmp_hy;  <br /> -- 游标对客户机应用程序保持打开<br /> open cursor1;<br /> <br />end p2;<br />end p1<br /> <br />另:鉴于有人问到此例子怎么执行,我是在集成开发环境里执行的.运行存储过程的方法很多,可以存在高级编程语言里调用,也可以在命令行调用,也可以在sql开发工具里调用,没法一概而论,还有,这个游标,你要看到结果,需要逐条取出所有纪录.这些都是其它方面的知识,你可以去别的地方补充.我这里怎么运行的,以及怎么处理的,为了避免误导读者,我还是不说了.下面我给出我调用此存储过程得出的结果,如下图:<br /> <a href="http://blog.51cto.com/attachment/200612/1166756483234.png" target="_blank">http://blog.51cto.com/attachment/200612/1166756483234.png</a><br /> <br /> <br />总结：这个例子很简单，但是很实用，可以作为一个存储过程的模板来用。完全操作的是临时表，你在任何db2数据库下都可以执行，并查看结果。为了保持例子的简洁易懂，我没有设置输入输出参数，这些参数和Oracle里，高级变成语言中函数的参数差不多，所以就写了这个不带参数的。<br /> <br />题外话：DB2 的存储过程和函数与Oracle的差别太大，DB2存储过程允许返回值，还可以设定返回值的数量，而Oracle的存储过程是不允许返回值的；DB2的函数也可以返回值，也可以返回表，而Oracle返回比较随意。用DB2做开发是件很痛苦的事情，原因是没有很好的开发工具，不像Oracle有 PL/SQL这样强大的开发工具可用，但是DB2的性能比Oracle的好，海量T级别的数据库尤为明显。目前我用的是Quest Central For DB2 4.3，功能很弱，连自动弹出表的列名功能都没有！DB2自带的开发中心更烂，没法用，shit！严重与IBM的品牌不相符合。不知道各位网友你们都在用什么开发工具呢？
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/158385#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jan 2008 17:29:39 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/158385</link>
        <guid>http://eminem.javaeye.com/blog/158385</guid>
      </item>
      <item>
        <title>Oracle SQL到DB2 SQL移植解决方案(引)</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/156921" style="color:red;">http://eminem.javaeye.com/blog/156921</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Oracle SQL到DB2 SQL移植解决方案<br /><br />1、Oracel中的decode <br />DB2解决方案：用case条件表达式完成。 <br /><br />case两种语法模式：<br /><br />(1)CASE<br /><br />WHEN 条件 THEN 结果1<br /><br />ELSE 结果2<br /><br />END<br /><br />(2)CASE 表达式1<br /><br />WHEN 表达式2 THEN 结果1<br /><br />ELSE 结果2<br /><br />END<br /><br />上面的WHEN可以重复多次，就像C中的SWITCH ..CASE的表达.<br /><br />例如：<br /><br />SELECT ORDNO,CUSNO,<br /><br />CASE MONTH(SHIPDATE)<br /><br />WHEN ''01'' THEN ''Jan''<br /><br />WHEN ''02'' THEN ''Feb''<br /><br />WHEN ''03'' THEN ''Mar''<br /><br />WHEN ''04'' THEN ''Apr''<br /><br />WHEN ''05'' THEN ''May''<br /><br />WHEN ''06'' THEN ''Jun''<br /><br />WHEN ''07'' THEN ''Jul''<br /><br />WHEN ''08'' THEN ''Aug''<br /><br />WHEN ''09'' THEN ''Sep''<br /><br />WHEN ''10'' THEN ''Oct''<br /><br />WHEN ''11'' THEN ''Nov''<br /><br />WHEN ''12'' THEN ''Dec''<br /><br />END<br /><br />FROM FILE<br /><br />应用实例：<br /><br />Oracle SQL：<br /><br />-------------------------<br /><br />select decode(t.organtypecode, ''D'', t.parent, ''S'', t.parent, t.id)<br /><br />from A_ORGAN t<br /><br />where t.parent = 35<br /><br />DB2 SQL：<br /><br />-------------------------<br /><br />select case x.organtypecode<br /><br />when ''D'' then<br /><br />x.parent<br /><br />when ''S'' then<br /><br />x.parent<br /><br />else<br /><br />x.id<br /><br />end<br /><br />from a_Organ x<br /><br />where x.parent = 35;<br /><br />2、Oracle中的Start with...Connect By递归查询<br /><br />DB2解决方案：用with公共递归表达式来解决。<br /><br />DB2解决方案：用case条件表达式完成。<br /><br />Oracle SQL：<br /><br />-------------------<br /><br />select t.id<br /><br />from a_organ t<br /><br />start with t.id in (select decode(t.organtypecode,<br /><br />''D'',<br /><br />t.parent,<br /><br />''S'',<br /><br />t.parent,<br /><br />t.id)<br /><br />from A_ORGAN<br /><br />where t.id = 35)<br /><br />connect by t.parent = prior t.id<br /><br />DB2 SQL：<br /><br />-------------------------<br /><br />WITH FKK(id) as<br /><br />(select o.id from a_organ o<br /><br />where o.id=35<br /><br />UNION ALL<br /><br />select case x.organtypecode <br /><br />when ''D'' then x.parent<br /><br />when ''S'' then x.parent<br /><br />else x.id<br /><br />end<br /><br />from FKK fk, a_organ x<br /><br />where fk.id=x.parent) <br /><br />select distinct id from FKK;<br /><br />3、Oracle中的dual表对应DB2中的SYSIBM.SYSDUMMY1表<br /><br />DB2解决方案：对应于DB2中的 SYSIBM.SYSDUMMY1表<br /><br />Oracle SQL：<br /><br />-------------------------<br /><br />select 15 as ttt from dual<br /><br />结果：<br /><br />ttt<br /><br />-------<br /><br />15<br /><br /> <br /><br />DB2 SQL：<br /><br />-------------------------<br /><br />select 15 as ttt from SYSIBM.SYSDUMMY1<br /><br />结果：<br /><br />ttt<br /><br />-------<br /><br />15<br /><br />4、日期转换问题<br /><br />DB2解决方案：有相应的函数<br /><br />Oracle SQL：<br /><br />-------------------------<br /><br />select m.*<br /><br />from dj_mcdj m<br /><br />where m.mcqc || '' '' like ''%$P%''<br /><br />and m.xzqhdm || '' '' like ''%$P%''<br /><br />and m.hylbdm || '' '' like ''%$P%''<br /><br />and m.blqsrq >= to_date(''$P'', ''yyyy-mm-dd'')<br /><br />and m.blqsrq &lt; to_date(''$P'', ''yyyy-mm-dd'')+1<br /><br />DB2 SQL：<br /><br />---------------------<br /><br />--------------------<br /><br />--名称：名称库查询<br /><br />--作者：雷智民<br /><br />--日期：2006-10-27<br /><br />--FOR ：DB2<br /><br />--------------------<br /><br />select m.*<br /><br />from dj_mcdj m<br /><br />where m.mcqc || '' '' like ''%%''<br /><br />and m.xzqhdm || '' '' like ''%%%''<br /><br />and m.hylbdm || '' '' like ''%%%''<br /><br />and date(m.blqsrq) >= date(''1900-01-01'')<br /><br />and date(m.blqsrq) &lt; date(''2050-01-01'')+1 day<br /><br />5、nvl 问题<br />DB2解决方案：利用coalesce(,) 或 value(,)方法。<br />oracle中的nvl对应db2中的value ，只是oracle中的语法更有宽松一些，在db2中，value要求两个参数必须是同一种类型的，nvl要求则不是很严格，nvl(A,‘’)，如果A是数字类型或者日期类型的这个表达式也没有 问题，但是在db2中，若是也这么写的话， value(A,''),那肯定就有问题了，总的来说，基本上是一致的。<br /><br />6、左右外连接问题<br />db2的左右外连接的语法和标准sql语法一样，只是没有oracle中的(+)这个简单符号来标记左右外连接，left (right) outer join  on<br />1）.内连接INNER JOIN的Oracle和DB2的写法 <br /><br />　　Oracle可以这样实现? Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no; DB2 可以这样实现? Select * from db2admin.bsempms inner join db2admin.bsdptms on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no; <br /><br />2）.外连接的Oracle和DB2的写法(右外连接,左外连接,完全外连接,组合外连接) <br /><br />　　Oracle可以这样实现? <br />　　Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+); <br />　　Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no; <br />　　DB2 可以这样实现? <br />　　Select * from db2admin.bsempms right outer join db2admin.bsdptms <br />　　on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no; <br /><br />　　Select * from db2admin.bsempms left outer join db2admin.bsdptms <br />　　on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no; <br /><br />　　Select * from db2admin.bsempms full outer join db2admin.bsdptms <br />　　on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;<br /><br />7、LIKE问题<br /><br />db2中谓词LIKE后边的表达式不支持字段。只支持一下类型：<br />A constant <br />A special register <br />A host variable <br />A scalar function whose operands are any of the above <br />An expression concatenating any of the above <br /><br />（附DB2文档：<br />使用格式： match-expression LIKE pattern-expression<br />match-expression <br />An expression that specifies the string that is to be examined to see if it conforms to a certain pattern of characters. <br />The expression can be specified by: <br /><br />A constant <br />A special register <br />A host variable (including a locator variable or a file reference variable) <br />A scalar function <br />A large object locator <br />A column name <br />An expression concatenating any of the above<br /> <br />pattern-expression <br />An expression that specifies the string that is to be matched. <br />The expression can be specified by: <br /><br />A constant <br />A special register <br />A host variable <br />A scalar function whose operands are any of the above <br />An expression concatenating any of the above <br />with the following restrictions: <br /><br />No element in the expression can be of type LONG VARCHAR, CLOB, LONG VARGRAPHIC, or DBCLOB. In addition it cannot be a BLOB file reference variable. <br />The actual length of pattern-expression cannot be more than 32 672 bytes. <br />）<br /><br />DB2中几个隔离级别select..for update with ** 的行锁<br /><br />看了很多介绍DB2中隔离级别和锁的各种用法和机制，动手做了一个比较详尽的试验，<br />对于有些结果我还真没想明白。。<br /> <br /> <br />在　db2 9 中我做了以下的试验，<br />Create table RRTest (pkID VARCHAR(20) NOT NULL ,unID1 varchar(20) Not NULL,UnID2 varchar(20) ,"CUSTOMER_ID" VARCHAR(6) ,<br />                  "ORDER_TYPE" DECIMAL(2,0) , <br />                  "EXECUTION_TYPE" DECIMAL(2,0) , <br />                  "ORDER_DATE" VARCHAR(8) , <br />                  "ORDER_TIME" VARCHAR(6) , <br />                  "ORDER_DATETIME" TIMESTAMP , <br />                  "SIDE" DECIMAL(1,0) , <br />                  "TRADE_TYPE" DECIMAL(1,0) , <br />                  "ORDER_AMOUNT" DECIMAL(15,2) , <br />                  "ORDER_PRICE" DECIMAL(8,4),<br />                   TSID varchar(20) ) <br /><br />insert into RRTest <br />SELECT Order_ID, Order_ID, Order_ID, CUSTOMER_ID, ORDER_TYPE, EXECUTION_TYPE, ORDER_DATE, ORDER_TIME, ORDER_DATETIME, SIDE, TRADE_TYPE, ORDER_AMOUNT, ORDER_PRICE ,ORDER_ID<br />    FROM DB2INST1.Fx_Order where ORDER_DATE >'20070401'<br />GO<br />select count(*) From RRTEST<br />72239<br /><br />ALTER TABLE "DB2INST1".RRTest<br />        ADD PRIMARY KEY<br />                (pkID);<br /><br />CREATE UNIQUE INDEX UNIQINDX ON RRTest(unID1)<br />CREATE INDEX INDX002 ON RRTest(unID2)<br />db2 "RUNSTATS ON TABLE DB2INST1.RRTest ON ALL COLUMNS AND INDEXES ALL ALLOW WRITE ACCESS"<br /> <br /><br />db2 connect to db2TT<br />db2 +c<br /><br />select * From RRTEST where TSID='20070223ORD01267732' for update with RR<br />select * From RRTEST where TSID='20070222ORD01266302' for update with RR<br /><br />select * From RRTEST where TSID='20070223ORD01267732' for update with RS<br />select * From RRTEST where TSID='20070222ORD01266302' for update with RS<br /> <br />select * From RRTEST where unID1='20070223ORD01267732' for update with RR<br />select * From RRTEST where unID1='20070222ORD01266302' for update with RR<br />select * From RRTEST where unID1='20070223ORD01267732' for update with RS<br />select * From RRTEST where unID1='20070222ORD01266302' for update with RS<br /> <br />select * From RRTEST where unID2='20070223ORD01267732' for update with RR<br />select * From RRTEST where unID2='20070222ORD01266302' for update with RR<br />select * From RRTEST where unID2='20070223ORD01267732' for update with RS<br />select * From RRTEST where unID2='20070222ORD01266302' for update with RS<br /> <br />select * From RRTEST where pkID='20070223ORD01267732' for update with RR<br />select * From RRTEST where pkID='20070222ORD01266302' for update with RR<br />select * From RRTEST where pkID='20070223ORD01267732' for update with RS<br />select * From RRTEST where pkID='20070222ORD01266302' for update with RS<br /> <br /> <br /><br />按照以上字段　pkID 是主键，unID1 是唯一健索引，unID2 是普通健索引，TSID 是普通字段，没有在上建立索引。<br /><br />试验结论：<br /><br />       <br />  PK_INDEX    UNIQ_INDEX   NormalINDEX   NO_INDEX <br /> WITH  RR     锁行,不锁表  锁行,不锁表  不锁行,不锁表(1)  锁行,锁表 <br /> WITH  RS     锁行,不锁表  锁行,不锁表  锁行,不锁表  锁行,锁表(2) <br />          <br /><br /><br />锁行是指在一个事务中用某种方式读取并更改了改行数据并显示得指明要修改后，这个事务将锁住改行，直到它提交或者回滚了事务后，才释放该锁。<br /><br />锁表是指在用以上各种SQL在读取并更改一行的同时锁住了整个表。<br /><br />对以上红字部分(1)可能有不能理解的是:为什么对普通索引和主键或者唯一健索引的不同结论?　<br /><br />　对　PK和UNIQ的解释是因为RR 是可重复的读的级别，对这次检索扫描到的有可能成为自己的潜在检索对象的内容都会锁住，而因为是主键或者唯一健，别的行不可能成为这次这个检索的潜在读的范围，就是对别的数据此事务根本就没有必要锁，任何情况的更改都不可能出现幻读的情况(此表上的约束限制），所以只锁这一行。这么理解对PK,UNIQ没有问题。<br /><br />但是NormalINDEX　我认为应该是锁住这个表而不是不锁。这点一直没想明白。留待以后再加强理解。<br /><br />对　ＲＳ隔离级别是“锁定检索到的数据行”，是通过SQL检索到的结果进行锁定， PK,UNIQ,INDEX的结论完全都可以理解。　对 tableScan的检索而出现的锁表有些象RR隔离级别的所为。<br /><br />嗯，想了一圈没想明白，故把详细过程贴出来给自己留个纪念，以供以后遇到此类并发控制程序中注意一下，select * From TTT where ****= ? for update with RR(RS)，这里的　*** 可不是随便定义的。<br /><br />隔离级别分为RR/RS/CS/UR这四个级别。 下面让我们来逐一论述：<br /><br />1． RR隔离级别： 在此隔离级别下， DB2会锁住所有相关的纪录。 在一个SQL语句执行期间， 所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定， 如果是读取，则加共享锁； 如果是更新， 则加独占锁。 由于会锁定所有为获得SQL语句的结果而扫描的纪录， 所以锁的数量可能会很庞大， 这个时候， 索引的增加可能会对SQL语句的执行有很大的影响，因为索引会影响SQL语句扫描的纪录数量。<br /><br />2． RS隔离级别： 此隔离级别的要求比RR隔离级别稍弱，此隔离级别下会锁定所有符合条件的纪录。 不论是读取， 还是更新， 如果SQL语句中包含查询条件， 则会对所有符合条件的纪录加相应的锁。 如果没有条件语句， 也就是对表中的所有记录进行处理，则会对所有的纪录加锁。<br /><br />3． CS隔离级别： 此隔离级别仅锁住当前处理的纪录。 <br /><br />4． UR隔离级别：此隔离级别下，如果是读取操作，不会出现任何的行级锁。对于非只读的操作，它的锁处理和CS相同。<br /><br /><br />DB2默认的隔离级别是　CS。即　游标稳定性。<br /><br />DB2分页查询<br />SELECT * FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20<br />SELECT * FROM (Select T.*,rownumber() over(ORDER BY T.ID ASC) AS rn from ADMINISTRATOR.TEST_BY_HUFENG T) AS a1 WHERE a1.rn BETWEEN 1 AND 3
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/156921#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Jan 2008 15:51:18 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/156921</link>
        <guid>http://eminem.javaeye.com/blog/156921</guid>
      </item>
      <item>
        <title>BIRT Viewer 2.2 参数设置详解(引用)</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/156840" style="color:red;">http://eminem.javaeye.com/blog/156840</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: greens">BIRT Viewer 2.2 参数设置详解<br /><br />作者：会飞的球球<br />2007.08.24<br /><br />BIRT作为一款功能强大的开源报表工具，其版本的升级更新速度也非常快，从1.0到2.0，一直到最新的2.2.1版本，无论从功能上还是性能上都得到了极大的提高和扩充。BIRT也提供了一个标准的J2EE实现组件，可以发布到支持J2EE应用的web server服务器上，可以对生成的报表进行预览等操作。在大家使用BIRT Viewer的时候，可能会对它日益纷繁的参数设置如云里雾里，在网上论坛里也有很多人碰到这样哪样的问题，同时官方的文档也不细致不全。所以我就对这些参数进行了一个简单系统的总结，希望能对大家的BIRT开发有所帮助。这些参数以2.2.1版本为准，请大家特别注意。<br /><br />1. Servlet模式说明<br /><br />  查看BIRT Viewer自带的web.xml文件，可以看到有以下几个pattern：<br /><br />  frameset ---- 采用Ajax框架，可以显示工具条，导航条和TOC面板，实现复杂的操作，如分页处理，导出数据，导出报表，打印等等。该模式下会自动生成report document文件(预览report design文件)到特定的目录(用户可以用参数指定，也可以定义在web.xml里)。采用Ajax，速度较慢。<br /><br />  run ---- 也采用Ajax框架，但不实现frameset的复杂功能，不会生成临时的report document文件(预览report design文件)，也不支持分页，这个主要是应用在BIRT Designer里的preview tab里，可以支持cancel操作，其它不怎么常用。采用Ajax，速度较慢。<br /><br />  preview --- 没有用到Ajax框架，直接调用底层Engine API对报表进行render，把生成的报表内容直接输出到浏览器。这种模式和run模式调用的是相同的Engine API，唯一区别在于run采用Ajax获取报表内容，而preview直接输出到浏览器。如果要支持分页，用户需要在URL上定义__page和 __pagerange参数，这两个参数也会在后面详细说明。需要特别说明的是，在这几种预览模式中，preview的速度是最快的。<br /><br />  document --- 该模式主要是为了从report design文件生成report document文件。用户可以在URL上提定document文件生成存放的路径(存放在server端)，如果未指定，会直接生成 rptdocument发送到客户端浏览器，用户可以下载到客户端。<br /><br />  output --- 该模式类似于frameset，会自动生成report document文件(预览report design文件)，区别在于output不采用Ajax，而是将生成的报表内容直接输出到浏览器。<br /><br />  parameter --- 该模式主要用于生成一个参数对话框，一般用户不常用，用户可以直接通过提供的JSP Tag--parameterPage去实现参数对话框，不需要直接调用。<br /><br />  download --- 用于导出报表数据为CSV格式，当你使用frameset工具条里的导出数据功能时，会用到这个模式。<br /><br />2. web.xml里的参数设置<br />web.xml文件里有许多参数，用户应该根据自已的需求出发对这些参数有一个深入的了解。下面我会对这些参数一一做以说明。<br /><br />[BIRT_VIEWER_LOCALE]<br />设置默认的Locale信息，暂时没有太大意义。因为Locale的信息，首先以URL上定义的__locale为准，如果没有定义，会找到当前浏览器的Locale信息，最后才会用到这里定义的信息。<br /><br />[BIRT_VIEWER_WORKING_FOLDER]<br />设置BIRT Viewer的工作目录。用户可以把report design或是report document文件存放在这个目录下，这样就可以在URL上采用相对路径去预览这些报表文件了。默认是当前根目录。<br />当前支持三种形式：<br />相对路径 --- 这个相对当前的WEB应用的context root.<br />绝对路径<br />JAVA系统变量 --- 可以在启动服务器时，定义JVM的系统变量，如java –Dmyworkingfolder=D:/reports。这样就可以在web.xml中用${myworkingfolder}进行引用了。<br /><br />[BIRT_VIEWER_DOCUMENT_FOLDER]<br />设置生成的document文件的存放路径。默认是documents目录。路径设置同上。<br /><br />[WORKING_FOLDER_ACCESS_ONLY]<br />简单的报表访问限制控制实现，如果设为true,哪就只能预览存放在工作目录下的报表文件。默认值是false。<br /><br />[BIRT_VIEWER_IMAGE_DIR]<br />设置生成的临时图片的存放路径。默认是report/images目录。路径设置同工作目录设置。<br /><br />[BIRT_VIEWER_LOG_DIR]<br />设置生成的日志文件存放路径。默认是logs目录。路径设置同工作目录设置。<br /><br />[BIRT_VIEWER_LOG_LEVEL]<br />设置日志的level，可选的值有：ALL|SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST|OFF。级别由高到低。<br /><br />[BIRT_VIEWER_SCRIPTLIB_DIR]<br />设置用户script lib文件的存放目录( 在报表中用到的Java Event Handler Class )。默认值是scriptlib。路径设置同工作目录设置。<br /><br />[BIRT_RESOURCE_PATH]<br />设置用户资源存放路径，这些资源包括library文件，image文件等。默认是当前根目录。路径设置同工作目录设置。<br /><br />[BIRT_VIEWER_MAX_ROWS]<br />设置获取dataset的最大记录数。主要应用于设计报表的时候，预览报表如果记录数太多，会花费很多的时间，也可能会引起out of memory问题。默认是不限制。<br /><br />[BIRT_VIEWER_MAX_CUBE_LEVELS]<br />设置CUBE查询的最大级数。和前面的参数作用类似。默认是不限制。<br /><br />[BIRT_VIEWER_CUBE_MEMORY_SIZE]<br />设置在生成CUBE时，可以写在memory中的最大值，单位是MB。可以提高效率，写在内存会比直接写在硬盘快很多。但同时也要注意内存占用的问题。<br /><br />[BIRT_OVERWRITE_DOCUMENT]<br />该参数主要用于frameset/output模式，它们会生成临时的document文件上。如果设为true，则每次刷新页面时，都会重新去生成document文件，如果为false，则不会重新生成，只会用原来的document文件去生成报表内容。<br /><br />[BIRT_VIEWER_CONFIG_FILE]<br />定义properties文件的路径，不可以修改。<br /><br />[BIRT_VIEWER_PRINT_SERVERSIDE]<br />在frameset工具条上，提供有后台服务器打印的功能，该参数可以设置是打开还是关闭后台打印的功能。默认是打开。可选值为: ON 和 OFF。<br /><br />[HTML_ENABLE_AGENTSTYLE_ENGINE]<br />这个参数是会传递给Engine的，主要用于一些CSS的兼容性方面的问题。默认值是true。<br /><br />3. viewer.properties参数设置<br />viewer.properties文件主要是定义一些扩展的参数。<br /><br /># configurable variable for JSP base href. Please uncomment the below line.<br />#base_url=http://127.0.0.1:8080<br />该设置主要应用于代理服务器的情况下，在使用代理服务器后，从request里获取的URI并非真正的URI，需要在这里定义。<br /><br /># [EXTENSION SETTING]<br />viewer.extension.html=html<br />viewer.extension.pdf=pdf<br />viewer.extension.postscript=ps<br />viewer.extension.doc=doc<br />viewer.extension.xls=xls<br />viewer.extension.ppt=ppt<br />定义输出的报表文件的后缀名，和format相关联。<br /><br /># [OUTPUT FORMAT LABEL NAME]<br />viewer.label.html=HTML<br />viewer.label.pdf=PDF<br />viewer.label.postscript=PostScript<br />viewer.label.doc=Word<br />viewer.label.xls=Excel<br />viewer.label.ppt=PowerPoint<br />定义导出报表对话框里的报表格式列表，和format相关联，这样名字会更有意义。<br /><br /># [CSV SEPARATOR]<br />viewer.sep.0=,<br />viewer.sep.1=;<br />viewer.sep.2=:<br />viewer.sep.3=|<br />viewer.sep.4=\t<br />支持多种CSV分隔符，用户也可以增加新的分隔符(只支持char，而不是string)。但同时需要修改JSP文件和Messages.properties文件。<br /><br /># [LOGGERS]<br /># "logger."+class=level<br /># if no level is specified or the text "DEFAULT",<br /># then the default level from the web.xml will be used<br />logger.org.eclipse.datatools.connectivity.oda=DEFAULT<br />logger.org.eclipse.datatools.enablement.oda=DEFAULT<br />当前的日志都是通过Engine输出的，如果需要其它组件的日志输出，可以在这里定义。注意格式必须为logger.org……。而且该组件必须实现了java的logger。<br />可以单独为该组件设置日志级别，如果设为DEFAULT，就会使用web.xml里的设置。<br /><br />4. URL参数<br />下面是一些主要用到的URL参数。<br /><br />“__report”<br />定义要预览的rptdesign文件路径，支持相对路径和绝对路径，相对路径是相对于web.xml中定义的工作目录。<br /><br />“__document”<br />定义要预览的rptdocument文件路径，同样支持相对和绝对路径。相对路径是相对于web.xml中定义的工作目录。在同时定义了__report 和__document参数时，以__document为优先，如未找到相应的document文件，才会从design文件生成document文件 (frameset/output)或是直接去render这个design文件(preview/run)。<br /><br />“__title”<br />定义报表显示的标题。<br /><br />“__showtitle”<br />是否显示frameset模式下上方的标题部分。true | false<br /><br />“__toolbar”<br />是否显示frameset模式下的工具条。true | false<br /><br />“__navigationbar”<br />是否显示frameset模式下的导航条。true | false<br /><br />“__parameterpage”<br />是否强制弹出或不弹出报表参数对话框。true | false<br /><br />“__format”<br />输出报表的格式，默认为html。现在支持：pdf | doc | xls | postscript | ppt<br /><br />“__locale”<br />设置Locale信息，如 __locale=zh_CN， 注意必须是国家加语言。<br /><br />“__svg”<br />设置chart输出是否以SVG格式输出。true | false<br />frameset和run模式下，会采用javascript判断客户端浏览器是否支持svg，但并非对所有浏览器有效。<br /><br />“__bookmark”<br />设置页面要定位的书签名字。<br /><br />“__istoc”<br />指定定位的书签是不是一个TOC名字。如为true,就会根据__bookmark参数值去获取一个真正的书签名，从而实现正常的跳转。这个主要用于定位到一个TOC上。<br /><br />“__rtl”<br />指定HTML页面输出是否需要right to left。支持不同国家的阅读习惯，如阿拉伯国家是从右到左的。<br /><br />“__page”<br />指定要输出的报表页数，这个依赖于报表的分页设计(page break)。<br /><br />“__pagerange”<br />指定要输出的报表页数范围。如1,3,5-9。<br /><br />“__resourceFolder”<br />定义资源目录路径。同web.xml中的BIRT_RESOURCE_PATH设置。<br /><br />“__asattachment”<br />是否以附件方式下载报表，如生成PDF或是其它格式里。默认是inline。<br /><br />“__masterpage”<br />是否要显示master page。true | false<br /><br />“__designer”<br />该参数主要是应用在BIRT Designer环境下，如会读取cache的报表参数等等，一般不用。true | false<br /><br />“__overwrite”<br />该参数同web.xml定义的参数，不过web.xml里是全局设置，在URL上通过参数可以定义本次操作的设置。<br /><br />“__imageID”<br />内部参数，用于image的引用，一般不用。<br /><br />“__maxrows”<br />设置Dataset查询的最大记录数，要注意这个设置是全局的，会影响后面所有的请求。主要用于BIRT Designer下，提高报表设计效率。同web.xml中的BIRT_VIEWER_MAX_ROWS设置。<br /><br />“__maxlevels”<br />设置查询获取Cube的最大级数。同上面的__maxrows，也主要用于BIRT Designer设计环境。<br />同web.xml中的BIRT_VIEWER_MAX_CUBE_LEVELS设置。<br /><br />“__cubememsize”<br />同web.xml中的BIRT_VIEWER_CUBE_MEMORY_SIZE参数设置。<br /><br />“__instanceid”<br />如果查看BIRT输出的HTML代码，你就可以看到一些HTML Element会有一个iid的属性(如table)，这个就是instanceid。这个是Engine动态生成的，不可提前预知。所以你需要从 HTML代码中得到这个值。该参数主要是为了获取reportlet(报表片断，如只输出报表中的一个Table或是一个Chart)。需要配合 __isreportlet参数。<br /><br />“__isreportlet”<br />指定当前输出是不是一个reportlet。true | false<br />特别说明：为了输出一个reportlet，BIRT现在提供两种方式。<br />1． 为要输出的对象(表格或是Chart)定义一个bookmark，然后可以用下面的URL输出reportlet.<br />http://localhost:8080/birt/frameset?__report=test.rptdesign&__bookmark=bk&__isreportlet=true<br /><br />2． 采用instanceid，但这个值事先是无法预知的，需要预览一次后从HTML代码中得到。然后用下面的URL输出reportlet.<br />http://localhost:8080/birt/output?__report=test.rptdesign&__instanceid=iid&__isreportlet=true<br />还有就是要注意，reportlet只支持document文档。如果是预览design文档去输出reportlet，就必须要使用frameset/output(自动生成document文档)。<br /><br />“__clean”<br />BIRT里临时生成的一些文件都是和session相关的，比如临时document文件，还有image文件。这些文件也可以通过session进行管理，这个参数就是指定是否需要在session timeout的时候清除这些临时文件。默认值是true。<br />true | false<br /><br />“__dpi”<br />可以设置输出Chart的dpi数值。<br /><br />“__fittopage”<br />暂时这个参数只对PDF和postscript格式报表有效，指定是否调整至适合页面。<br /><br />“__pagebreakonly”<br />暂时这个参数只对PDF和postscript格式报表有效，指定是否只采用BIRT报表内定的分页设置。这个参数一般需要和__fittopage联合使用。<br /><br />“__agentstyle”<br />同web.xml中的HTML_ENABLE_AGENTSTYLE_ENGINE参数设置。<br /><br />========================== 后台Server端打印相关参数 ==========================<br />“__action”<br />定义执行的指令名称。当前只支持print指令，用于后台服务器打印。<br /><br />“__printer”<br />后台打印机名称。<br /><br />“__printer_copies”<br />对应打印机的打印份数参数。<br /><br />“__printer_collate”<br />对应打印机的双面打印参数。<br /><br />“__printer_duplex”<br />对应打印机的duplex参数。<br /><br />“__printer_mode”<br />对应打印机的模式参数。是单色还是彩色。<br /><br />“__printer_pagesize”<br />对应打印机的纸型参数。比如A4。<br />===============================================================================<br /><br />========================== JSP Tag相关参数  ===================================<br />“__id”<br />viewer的ID号，这个参数一般不常用，主要用于JSP Tag中，如在一个页面插入两个BIRT Viewer，而且预览同一个报表文件，这时候因为在一个session下面，所以需要用不同的ID去生成单独的document文件。不至于都生成同一个document文件上，从而引发冲突。<br /><br />“__pattern”<br />在JSP Tag中用于指定要提交的Servlet Pattern名字，如frameset/output/run/preview等。主要用于采用parameter模式生成parameter dialog对话框时。<br /><br />“__target”<br />可以指定提交到的窗口名称。如_blank,_self等。<br /><br />“__nocache”<br />指定是否会用到cache的报表参数值，这些cache的值一般保存在rptconfig文件里。在设计报表并预览的时候，可以保存输入的报表参数值。这个在runtime的时候不常用。<br />===============================================================================<br /><br />========================== 报表参数相关 ===================================<br />“__isnull”<br />指定当前的报表参数为null值，后面是报表的参数名。<br /><br />“__islocale”<br />指定当前的报表参数值是和Locale/Format相关的，必须用特定的Locale/Format转化参数值(从String转化为Object)。格式为__islocale=paramName。<br /><br />“__isdisplay__”<br />指定报表参数的displayText值,格式为__isdisplay__paramName=displayText。可以在报表中引用displayText值，如params[“p1”].displayText。<br />在URL上传displayText时如下(报表参数名为p1)：<br />&__isdisplay__p1=hello<br /><br />“__islocale__”<br />指定该报表参数值是Locale/Format相关的，同时给定了参数值。格式为__islocale__paramName=paramValue。<br />===============================================================================<br /><br />========================== Export Data参数 ===================================<br />“__exportEncoding”<br />该参数应用于导出数据为CSV中，可以指定导出的文件编码，如GBK或是GB2312等。<br /><br />“__sep”<br />该参数应用于导出数据为CSV中，可以指定数据分隔符，如逗号，冒号等。<br /><br />“__exportdatatype”<br />该参数应用于导出数据为CSV中，可以指定是否输出数据类型。true | false<br /><br />“ResultSetName”<br />要导出数据的记录集名字。<br /><br />“SelectedColumnNumber”<br />要导出的栏位数。<br /><br />“SelectedColumn”<br />要导出的数据栏位名称。<br /><br />具体可以查看BirtSimpleExportDataDialog.js文件。<br />===============================================================================<br /><br />5. 其它参数设置<br />在BIRT Viewer里还有一个比较特殊的参数应用，就是用户可以自定义自已的servlet，然后传递对象到Application Context中，在报表中就可以从全局的Application Context去获取到这个对象。<br />这里相关的有两个内定的参数，AppContextKey和AppContextValue。下面是一个简单的示例。<br /> public void service( HttpServletRequest request,<br />   HttpServletResponse response ) throws ServletException,<br />   IOException, BirtException<br /> {<br />  String myKeyName = "mykey";<br />  List values = new ArrayList();<br />  values.add( "hello" );<br />  values.add( new Date() );<br />  request.setAttribute( "AppContextKey", myKeyName );<br />  request.setAttribute( "AppContextValue", values );<br />  RequestDispatcher rd = request.getRequestDispatcher( "/frameset" );<br />  rd.include( request, response );<br /> }</span>
          <br/>
          <span style="color:red;">
            <a href="http://eminem.javaeye.com/blog/156840#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Jan 2008 11:03:51 +0800</pubDate>
        <link>http://eminem.javaeye.com/blog/156840</link>
        <guid>http://eminem.javaeye.com/blog/156840</guid>
      </item>
      <item>
        <title>DB2数据库发生死锁了怎么办？（转）</title>
        <author>eminem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eminem.javaeye.com">eminem</a>&nbsp;
          链接：<a href="http://eminem.javaeye.com/blog/151010" style="color:red;">http://eminem.javaeye.com/blog/151010</a>&nbsp;
          发表时间: 2007年12月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          相关图：http://tech.it168.com/db/2007-12-18/200712181037451.shtml<br /><br />【IT168 技术文档】在新的数据库应用系统上线初期，由于测试不完善或不熟悉DB2的机制，常会出现锁等待死锁等现象存在于我们的应用系统中，如何捕获锁等待或死锁信息并解决锁问题，是保证平稳上线必须面对的问题。目前应用系统最常使用的DB2数据库版本有多个，有 8.1，8.2，9.1还有新推出的9.5，对于不同版本的DB2数据库提供的解决办法不尽相同，下面对于上述问题的解决作了一个简单说明，希望对大家有用。<br /><br />首先在上线前有几件跟锁相关的事情需要开发设计人员一定要做好<br /><br />1． 相关参数的更改<br /><br />注册表变量参数：<br /><br />    DB2_EVALUNCOMMITTED=on 当启用此变量时，在可能的情况下，它将进行表或索引访问扫描以延迟或避免行锁定，直到知道数据记录满足谓词求值为止。 <br /><br />    DB2_SKIPDELETED=on 当启用此变量时，在可能的情况下，它允许使用无条件地跳过已删除的键或跳过已删除的行。<br /> <br />    DB2_SKIPINSERTED=on 当启用此变量时，在可能的情况下，它允许跳过未落实的已插入行，就好像从未插入这些行一样。<br /><br />数据库参数：<br /><br />    LOCKLIST 锁定列表的内存量，当此参数设置为 AUTOMATIC 时，就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。如果不是自动，需要设置相对大一些；DB2默认是行锁，每个行锁大约占64或128个字节（64位数据库），计算锁定列表内存的大小公式是： ( 每个应用程序的平均锁定数目的估计值 * 每个锁定所需的字节数(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%，这里只是建议公式，实际情况还要视操作系统实际的内存量来定。<br /><br />    MAXLOCKS 升级前锁定列表的最大百分比，默认是22%(windows)或10%(unix)，可以根据要求自行改动，计算公式是 2 * 100 / maxappls <br /><br />    DLCHKTIME 死锁检测时间间隔，默认是10000毫秒(10秒)，可以根据要求自行改动，也可不动。增大此参数以降低检查死锁的频率，因此增加应用程序必须等待消除死锁的时间。 减小此参数会增大检查死锁的频率，从而减少应用程序必须等待死锁解决的时间，但是会增加数据库管理器检查死锁所花的时间。 <br /><br />    LOCKTIMEOUT 锁等待时间，默认是 -1，也就是永远等待，请改成固定的值，在事务处理（OLTP）环境中，可以使用 30 秒的初始启动值。在一个只查询的环境中，您可以从一个较高的值开始。 <br /><br />    LOGFILSIZ 日志文件大小，此参数定义每个主日志文件和辅助日志文件的大小。如果数据库要运行大量更新、删除或插入事务，而这将导致日志文件很快变满，则应增大日志文件，了解您的并发应用程序的日志记录需求，来确定一个不会分配过量而浪费空间的日志文件大小。 <br /><br />    LOGPRIMARY 主日志文件数，了解您的并发应用程序的日志记录需求，适当增大日志文件数。<br /><br />注意： 在更新参数时，需要注意有些参数在更改后需要重新启动数据库DB2实例才可以生效；有些参数需要断开当前所有的应用程序，重新链接才能生效；有些参数可以立即生效，使用者请参考相关文档，注意参数生效特性。<br /><br />2． 应用程序设计<br /><br />－程序尽量短小精悍<br /><br />－程序尽量晚地访问关键资源<br /><br />－程序尽可能快地提交工作<br /><br />－程序尽可能快地关闭游标<br /><br />－建立合适索引<br /><br />3． 性能测试<br /><br />要根据将来实际的并发用户数和数据量进行测试<br /><br />上线之后维护时我们要做的几件事情<br /><br />1. 做好定期维护<br /><br />通过使用如下命令进行维护：<br />－reorg表和索引定期重组<br />－runstats表和索引的统计信息定期更新<br />－rebind 程序包定期重新编译<br /><br />2. 日常观察db2diag.log文件<br /><br />查看下面锁升级信息 escalation<br /><br />2006-02-13-11.05.08.060000-480 E613164H452 LEVEL: Warning PID : 2112 TID : 3132 PROC : db2syscs.exe INSTANCE: DB2 NODE : 000 DB : SAMPLE APPHDL : 0-170 APPID: *LOCAL.DB2.060213185727 FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:3 MESSAGE : ADM5502W The escalation of "35" locks on table "TEDWAS .<br /><br />STAFF" to lock intent "X" was successful.<br /><br /><br />查看下面死锁或锁超时信息DeadLock or Lock timeout<br /><br />2006-11-08-16.29.11.398155+480 E36235682A521 LEVEL: Error PID : 12979 TID : 1 PROC : db2agent (TESTDB) 0 INSTANCE: db2inst1 NODE : 000 DB : TESTDB APPHDL : 0-288 APPID: 198.132.3.100.57177.061108070923 AUTHID : TESTDB FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:4 MESSAGE : ADM5503E The escalation of "2" locks on table“TESTDB.TEST12" to lock intent "X" has failed.<br /><br />The SQLCODE is "-911". 2006-11-08-16.24.39.672914+480 E36100838A502 LEVEL: Error PID : 20866 TID : 1 PROC : db2agent (TESTDB) 0 INSTANCE: db2inst1 NODE : 000 DB : TESTDB APPHDL : 0-1394 APPID: 198.132.3.110.58426.061108075556 AUTHID : TESTDB FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:4 MESSAGE : ADM5503E The escalation of "1" locks on table “TESTDB.<br /><br />TEST11" to lock intent "X" has failed. The SQLCODE is "-952".<br /><br /><br />    我们可以看到红字标识出的锁升级(escalation)，锁等待锁超时（The SQLCODE is "-911"），程序由于锁的原因而终止（The SQLCODE is "-952".）<br /><br />3. 观察命令list applications的输出<br /><br />    查看应用程序的状态是否有锁定等待(Lock-wait)状态出现。<br />   <br />    执行命令 list applications for db sample show detail 得到如下结果<br /><br />DB2ADMIN db2bp.exe 1129 *LOCAL.DB2.071128162517 00001 1 0 348<br /><br />锁定等待 2006-11-29 00:25:52.417899 TEST SAMPLE C:\DB2\NODE0000\SQL00001\ DB2ADMIN db2taskd 1127 *LOCAL.DB2.071128162445 00001 1 0 628<br /><br />连接已完成 2006-11-29 00:24:43.909356 TEST SAMPLE C:\DB2\NODE0000\SQL00001\ 。。。。。。。。 DB2ADMIN db2bp.exe 1126 *LOCAL.DB2.071128162443 00001 1 0 976 UOW<br /><br />正在等待 2006-11-29 00:25:00.559420 TEST SAMPLE C:\DB2\NODE0000\ SQL00001\ 。。。。。。。。<br /><br />    这里我们可以看到应用程序（1129）正在等待其他应用程序锁的释放，而应用程序（1126）正在执行程序，其中1129和1126分别是应用程序的ID。<br /><br />4. 观察快照信息（snapshot）的输出<br /><br />    在得到快照信息之前需要将锁定信息快照开关打开，命令如下<br /><br />update dbm cfg using dft_mon_lock on(实例级别)<br />update monitor switches using lock on(会话级别，推荐使用) <br /><br />    之后可以用如下命令取出快照信息<br /><br />get snapshot for locks on sample <br /><br />    我们可以得到类似信息：<br /><br />数据库锁定快照<br />数据库名称           = SAMPLE<br />数据库路径            = C:\DB2\NODE0000\SQL00001\<br />输入数据库别名            = SAMPLE<br />挂起的锁定            = 8<br />当前已连接的应用程序            = 2<br />当前正等待锁定的代理程序数            = 1<br />快照时间戳记            = 2007-11-29 17:54:13.992157<br />应用程序句柄            = 54<br />应用程序标识            = *LOCAL.DB2.071129094306<br />序号            = 00001<br />应用程序名            = db2bp.exe CONNECT<br />授权标识            = DB2ADMIN<br />应用程序状态            = 锁定等待<br />状态更改时间            = 2007-11-29 17:50:16.124739<br />应用程序代码页            = 1386<br />挂起的锁定            = 4<br />总计等待时间（毫秒）            = 237867<br /><br />锁定列表<br />锁定名称            = 0x030006000500C0020000000052<br />锁定属性            = 0x00000008<br />发行版标志            = 0x40000000<br />锁定计数            = 1<br />挂起计数            = 0<br />锁定对象名            = 46137349<br />对象类型            = 行<br />表空间名            = IBMDB2SAMPLEREL<br />表模式            = DB2ADMIN<br />表名            = TEST1<br />方式            = X<br /><br />。。。。。。。。。。。。。。<br /><br />锁定名称            = 0x03000600000000000000000054<br />锁定属性            = 0x00000000<br />发行版标志            = 0x40000000<br />锁定计数            = 1<br />挂起计数            = 0<br />锁定对象名            = 6<br />对象类型            = 表<br />表空间名            =  IBMDB2SAMPLEREL<br />表模式            = DB2ADMIN<br />表名            =  TEST1 方式 = IX 。。。。。。。。。。。。。<br /><br />    从上面信息可以看到应用程序（54）正处于锁定等待状态，而这个程序所要求的锁，在快照信息里有详细描述（由红字标识出的），同时我们还可以看到整个数据库其他程序的锁定信息，要想得到某个应用程序的锁定信息，可用如下命令：<br /><br />get snapshot for locks for application agentid 54 <br /><br />    其中54就是应用程序的句柄<br /><br />5. 注意无效程序（Invalid pakage）的监控 <br /><br />    如果系统里有存储过程或用户自定义函数或嵌入C的程序，这些程序包含静态SQL，在编译时会生成执行代码片段，存储在数据库的系统表里，在程序执行时直接调用这些代码执行。 <br /><br />    在系统运行一段时间后，如果发生了表结构变了，索引删除了，统计