2008年7月19日 星期六

关于split分割字符串,空结果不能得到的问题(转)

先看源代码

  1. /**
  2. *
  3. * @author 赵学庆 www.java2000.net
  4. *
  5. */
  6. class T {
  7. public static void main(String args[]) {
  8. String num[] = new String[11];
  9. String sLine = "101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||";
  10. num = sLine.split("\\|");
  11. int row = 1;
  12. for (String s : num) {
  13. System.out.println(row+++"="+s);
  14. }
  15. }
  16. }

运行结果为

1=101494

2=360103660318444

3=2008/06/17

4=周润英

5=1292.0

6=3085.76

7=2778.28

8=912.91

9=106.0

查看API,有一个

  1. public String[] split(String regex, int limit);

limit 参数控制应用模式的次数,从而影响结果数组的长度。

如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。

如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度。

如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串。 修改代码为

  1. /**
  2. *
  3. * @author 赵学庆 www.java2000.net
  4. *
  5. */
  6. class T {
  7. public static void main(String args[]) {
  8. String num[] = new String[11];
  9. String sLine = "101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||";
  10. num = sLine.split("\\|",-1); // 这里使用-1作为参数
  11. int row = 1;
  12. for (String s : num) {
  13. System.out.println(row+++"="+s);
  14. }
  15. }
  16. }

运行结果

1=101494

2=360103660318444

3=2008/06/17

4=周润英

5=1292.0

6=3085.76

7=2778.28

8=912.91

9=106.0

10=

11=

12=

结果正常


转载自:http://blog.csdn.net/java2000_net/archive/2008/07/06/2618813.aspx

2008年7月17日 星期四

jconsole监控截图

从下图可以清晰的看到JVM在一段时间内的内存使用率的一个走势.从图中可以看出每隔15分钟左右就会做一次GC,当然也可以手动执GC

下图为线程监控图.


还有很多的其他的,就自己慢慢的去耍了,我就不贴了.

JVM内存监控管理,Tomcat内存的设置

JVM内存监控管理
  • 首先你要启动Tomcat,只能使用startup.bat的方式启动.
  • 启动jdk15\bin\jconsole.exe.
  • 点击连接后,出现管理界面,这个时候我们就可以对内存,线程类等进行查看
  • 可以手动执GC
tomcat自己管理内存,在startup.bat的@echo off下面添加以下代码:
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_HOME%\conf\logging.properties"

解决严重: Exception initializing page context java.lang.OutOfMemoryError: Java heap space 的方法.

设置参数JVM参数-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
可以在环境变量中增加CATALINA_OPTS,值为-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m,当然你也可以根据实际的需要加大内存值.

因为对于操作系统,请求内存的系统调用会占用大量的cpu时间,所以频繁的请求、释放内存将会导致性能的严重下降。所以对于jvm,最好的方式就是尽量多占用内存作为heap,少释放甚至不释放空闲的heap给操作系统以减少消耗在内存请求、释放操作上的cpu时间。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益 出:这一部分用于存放Class和Meta的信息,Class在被Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。

链接:

Tomcat内存释放不了

2008年7月15日 星期二

让Hibernate支持Informix真正意义上的分页方法

这种分页方式只支持10或者10以上的版本.

建一个类InformixDialect继承org.hibernate.dialect.InformixDialect.

并重写下面几个方法useMaxForLimit();supportsLimitOffset();(String querySelect, int offset, int limit);

在Hibernate的配置中hibernate.dialect=您重写的这个类InformixDialect

具体代码见下:

import java.sql.Types;

import org.hibernate.Hibernate;

public class InformixDialect extends org.hibernate.dialect.InformixDialect {

public InformixDialect() {
super();
registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());
}

public boolean useMaxForLimit() {
return false;
}

public boolean supportsLimitOffset() {
return true;
}

public String getLimitString(String querySelect, int offset, int limit) {
// if (offset>0) throw new UnsupportedOperationException("informix has
// no offset");
return new StringBuffer(querySelect.length() + 8).append(querySelect)
.insert(querySelect.toLowerCase().indexOf("select") + 6,
" skip " + offset + " first " + limit).toString();
}

}

2008年7月14日 星期一

informix数据库下导出表结构

1)导出数据库中所有的表结构到文件db.sql
$>dbschema -d your_database -t all db.sql

2)导出数据库中所有的存储过程到文件db.sql
$>dbschema -d your_database -f all db.sql

3)导出数据库中的所有对象(包含表,存储过程,触发器。。。)到文件db.sql
$>dbschema -d your_database db.sql

4)导出数据库中一个表的结构到文件db.sql
$>dbschema -d your_database_name -t your_table_name db.sql

5)导出一个存储过程定义到文件db.sql
$>dbschema -d your_database_name -f your_procedure_name db.sql

6)如果导出更多的表的信息(EXTENT…)
$>dbschema -d your_database_name -ss db.sql

7)导出数据库中对用户或角色的授权信息
$>dbschema -d your_database_name -p all
$>dbschema -d your_database_name -r all

8)导出数据库中的同义词
$>dbschema -d your_database_name -s all

Informix 数据库表迁移工具在实际中的应用

本文是 Informix 数据库表迁移工具在实际中的应用的第 2 部分,在 第 1 部分 中我们讨论了 Informix 提供的 onunload/onload、unload/load 等表级迁移工具进行详细探讨:分析两者存在的差异,不同情况适用哪个工具等。本部分文章将从如何提高 unload/load 性能效率及例举了实际测试样例等方面的问题,全面阐述 Informix 数据库表迁移工具.
提高 unload/load 性能的技巧

1.去掉数据库(表)日志,提高 load 速度

使用 load 工具进行批量装载时,如果数据库有日志,效率很低;尤其数据量较大时,还可能出现锁溢出、长事务等导致装载失败;对于失败的装载为保证数据一致性, IDS 自动回滚。回滚很耗时,尤其当长事务超出排它高水准线( LTXEHWM )时,其他用户的进程将被挂起,性能进一步恶化。这在联机事务处理环境中,势必影响其他业务的正常运行。为此,对有日志的数据库进行大量数据装载时,尽量 去掉数据库日志,提高效率。

对于不能去掉日志的数据库环境,如果 Informix 版本为V9系列,可采用表级日志更改功能,即在装载时停止装载表的日志,装载结束后恢复表日志。

实施步骤:

1) 删除装载表的参照性约束及索引,只能对没有参照性约束及索引的表改变表级日志,所以在装载前先删除表索引及参照性约束,在装载完毕后重新创建。

2) 取掉目的表级日志
ALTER TABLE TABNAME TYPE(RAW)

3) 采用 LOAD 工具装载,创建索引及参照性约束

4) 增加目的表表级日志
ALTER TABLE TABNAME TYPE(STANDARD)

2.采用多进程,加速 unload/load 卸装速度

目前大多数用户数据库服务器配置较高,具有多个 CPU ,物理内存也较大,如果采用单进程卸装海量表,一方面运行速度缓慢,而另一方面大量系统资源闲置。为此,建议采用多进程,加速卸载速度。针对不同的实际情况,可采用不同方法启用多进程:

将需要装卸的多张表分配到不同的进程中并发装卸,可减少整体装卸载时间;
将海量表分配到多个进程中并发卸装,可减少海量表的卸载时间
多进程与单进程卸装速度的见测试6。

需要说明的是,多进程适合运行在资源充分、负载较轻、具有多个 CPU 的主机上,而对资源较少,或负载已重的主机,启动多进程反而会降低性能,甚至影响其他应用程序的执行。一般来说,在多 CPU 机器上可启动少于物理 CPU 个进程,同时将分割的多个输入输出文件分布在不同设备上。

采用多进程装载海量表,如果装载的数据库有日志,情况较为复杂,需要特别注意锁溢出与长事务的出现,为此采用以下方法:

采用小事务,即每个进程每次装载的数据量适当小。
多进程并发装载同一表,防止锁溢出,表锁设置为页级锁,而非行锁。
去掉表的索引,加速每个进程事务的提交。
3.去掉索引,加速 load 装载速度

索引的根本目的是提高查询效率,但在插入操作时,索引的存在却严重地影响效率。当插入数据量非常大时,索引页重建量也很大,索引结点的分裂也相当频繁, I/O 操作显著增大。同时索引页的分裂,导致需要更多的内存空间来存放分裂前相同的数据量,从而降低缓存效率。

下列情况索引的存在甚至导致装载失败:采用多进程向有日志数据库装载数据时,如果表有索引,锁模式为页锁,则会由于锁碰撞导致装载失败。这是因为每 个进程对其插入的索引页加锁,当其他进程插入的记录需要在加锁的索引页上重建的索引时,势必引起索引页上锁碰撞,导致装载失败。这种情况可将表的锁模式改 为行锁得到解决,但对于海量数据而言,采用行锁模式不仅锁管理开销庞大,性能低下,而且很可能由于锁溢出而装载失败。所以去掉索引,保证装载的成功。

4. 调整 IDS 性能参数,加速索引创建

调整 IDS 与性能相关的参数,可加速索引创建:

数据表分片,为数据并行扫描提供可能。
设置 MAX_PDQPRIORITY 及 PDQPRIORITY 参数,启用 PDQ 功能。需要说明,启动 PDQ 功能,将会给操作系统带来很大的负载, PDQ 将占用更多的内存、 CPU VP 、扫描线程、磁盘 I/O 资源。应充分考虑在 OLTP 环境对应用程序的影响。运用 PDQ 技术应该选择多 CPU 的机器。
配置多个临时数据库空间,提高排序速度。
回页首

其他说明

使用 unload 工具迁移,对静态表而言,卸载的文本与源表保持一致;对动态表而言,由于表的更新随时发生,从而造成卸载的文本与源表不一致性。为保证数据的一致性,可考 虑将表加锁卸载。加锁会降低并发,需要权衡两方面的因素。装载时如果表有并发追加操作,同样存在上述问题。为此可对表更名装载,核对正确后,再删除原表, 更名新表为目的表。onunload/onload 工具对卸装表加锁,故不存在上述问题。


测试

1.onunload/onload 与 unload/load 的装卸载速度测试
清单1 . 测试1

主 机:HP-V260小型机,配置有8个CPU,8G内存,操作系统为HP UNIX 版 本:informix Dynamic Server Version 7.30 测试表:test1 ,列长:63, 记录数:8900000,有一复合唯一索引。 测试结果: 命令 耗时: real user sys Unload 12:03.47 5:17.41 2:49.06 Onunload 6:08.35 0.02 0.00 Onload 16:22.89 0.01 0.01 Load 22:13.01 11:59.24 42.19 Load后创建索引: 7:11.74 0.00 0.01

清单2 . 测试2

主 机:HP V2600小型机,配有4个CPU,8G内存,操作系统为HP UNIX 版 本:informix Dynamic Server Version 9.30 测试表:test2,列长:24, 记录数:5009641,有一复合唯一索引。 测试结果: 命令 耗时: real user sys Unload 6:51.30 5:26.23 16.57 Onunload 1.38.00 0 0 Onload 11:27.62 0.01 0.01 Load 33:17:85 4:02.81 13.59

结论:

Onload/onunload 比 load/unload 性能差异与数据量、主机有关。
理论上讲,如果数据库中索引占用比例较大,用unload卸出速度较快,但装入后创建索引较慢; Onload卸装较稳定,只与数据量大小有关。


2. onunload 与 unload 卸载数据占用空间大小比较

测试表 test 2

test 2 表列长:24,记录数:5009641,页大小:P=2K,有一复合索引。

数据页申请空间 数据页占用空间 索引页占用空间 合计

1262696页 1252722页 418004页 (1252722+418004)P=3421646848字节

test 2 测试结果

Unload 输出文件大小 Onunload 输出文件大小

970781283 字节 3422552064 字节

结论: unload 卸出的数据文本比 onunload 卸出的二进制数据文件小。

3. 测试 onunload/onload 对磁盘碎片的整理情况

1) 测试前统计,测试表 test3 在 sysextents 中有 60 个 extents,说明 extents 不连续。

2) 将测试表采用 onunload/onload 卸装。

3) 卸装后统计,测试表 test3 在 sysextents 中仅有 5 个 extents,说明对 extents 进行了整理。

注意:Extents 个数大于 1,可能是测试表太大, IDS 需要多次分配磁盘空间;也可能有并发进程在同一数据库空间有写操作。

4. onunload 对删除的记录卸装的测试

1) 新建一表 test4,装载数据,从而使表每个数据页的 rowid 连续;

2) 对 test4 表使用 onunload 卸载,卸出文件占用磁盘空间为 1858076672K;

3) 采用 mod(rowid, 3)=1 条件删除 test4 表中大量记录;

4) 采用 onload 装载测试表,同时将新装载表更名为 test4_1

5) 使用 onunload 卸载 test4_1 表,卸出文件占用磁盘空间仍为 1858076672K;

6) 检测 test4、test4_1 表的 rowid ,结果一致

结论:onunload/onload 并不清理记录已删除的空间。

5. 测试 PDQPRIORITY 的并行效率
清单 3. 测试 PDQPRIORITY 的并行效率

版 本:informix Dynamic Server Version 9.30 主 机:HP V2600小型机,配有4个CPU,8G内存,操作系统为HP UNIX 表状态:列长:427 记录数:500万 测试序号 测试条件 测试结果 1 set_pdqpriority 0 创建5个索引 24:16 2 set_pdqpriority 100 创建5个索引 07:32

结论:启用 PDQ 可加速索引的创建。

6. 复杂测试及对比:
单进程与多进程装载效率比较
索引表与无索引表装载效率比较
日志与无日志装载效率比较
测试环境

版 本:Informix Dynamic Server Version 9.30

主 机:HP V2600 小型机,配有 4 个CPU,8G 内存,操作系统为 HP UNIX

装载文件:行数 rows=8500000,列宽 rowsize=580。
表 1. 测试结果对比表

序号 日志方式 装载时索引状况 多进程 测试目的 结果
1 数据库及表有日志 无索引 单进程 长事务回滚 在耗时 15 分钟、装载 800 多万时出现长事务,回滚耗时 5 小时
2 数据库及表有日志 无索引 6 个进程 小事务多进程 12 分钟
3 数据库无日志  无索引 1 个进程 无索引非日志单进程装载 18 分钟
4 数据库无日志  无索引 6 个进程 无索引非日志多进程装载 4 分钟
5 数据库无日志  有索引 6 个进程 有索引非日志多进程装载 18 分钟

结论:去掉索引及数据库日志、采用多进程装载时,可显著提高装载效率。


附录

1.onunload 工具卸载空间大小的估计

1) 估算表的数据量
清单4. 估算表的数据量

Select ti_npdata, ti_nrows from sysmaster:systabinfo a, sysmaster:systabnames b where ti_partnum=partnum and tabname=查询的表名 and ti_nkeys=0;

2) 估算表的索引数据量
清单5. 估算表的索引数据量

Select ti_npdata from sysmaster:systabinfo a, database_name: systabnames b , database_name:sysindexes c where ti_partnum=c.partnum and b.tabname=表名 and b.tabid=c.tabid;

将1),2)结果相加,可近似看作 onunload 卸载文件大小。实际 onunload 卸载文件大小比估计结果略大些。这里注意,需要访问两个数据库的内容: sysmaster,与查询表所在的数据库: database_name。

2.unload 工具卸载文本空间大小的估计

1) 统计表的记录数 recnum;

2) 统计每条记录占用磁盘空间大小;

将1),2)结果相乘,可近似看作 unload 卸载文件大小。

3. 查找 extents 个数较多的表
清单6. 查找 extents 个数较多的表

Select tabname, count(*) rec from sysmaster:sysextents group by 1 into temp tj with no log; Select * from tj order by rec desc ;

2008年7月13日 星期日

GlassFish安装

1.首先需要安装JDK5或者是JDK6,并设置好环境变量
2.安装ant1.6.5以上版本,并设置好ANT_HOME,Path。
3.下载GlassFish:http://download.java.net/javaee5/v2ur2/promoted/WINNT/glassfish-installer-v2ur2-b04-windows-ml.jar
4.安装GlassFish
  • 把下载后的文件放到D:\或者是其他目录
  • 运行cmd,进入D:\
  • 执行 java -Xmx256m -jar filename.jar
  • 运行 cd glassfish
  • 运行ant -f setup.xml
  • 增加新的环境变量GLASSFISH_HOME,并再path后增加%GLASSFISH_HOME%\bin
5.应用服务器管理
  • 启动asadmin start-domain domain1
  • 停止asadmin stop-domain domain1
  • 管理登录http://localhost:4848 admin/adminadmin

GlassFish v2资料汇总(不段更新)


GlassFish v2资料汇总
1GlassFish.org官方网站消息,由于中文用户增加,为了提供一个一站式的中文产品和社区,GlassFish中文网站上线:http://cn.glassfish.org
2.GlassFish v2: 明智选择:http://developers.sun.com.cn/Java/GFv2OpenforBusiness.html#whatgf
主要讲述了下面几个方面:
  • 什么是 GlassFish?
  • GlassFish v2 及其商业发行版
  • 高可用性和可伸缩性
  • 企业级性能
  • 集中管理和监控
  • 使用配置文件实现简单一步配置
  • 与 .NET 的互操作性
  • JBI 就绪
  • 高级消息处理
  • 具有吸引力的支持报价
3.在GlassFish Version 2中实现集群:http://developers.sun.com.cn/Java/glassfishcluster.html

主要讲述了下面几个方面:
  • 基本概念
  • 域管理体系结构
  • 集群体系结构
  • 典型的故障转移场景
  • 集群动态变形
  • 组管理服务
  • 内存复制配置
  • 内存复制实现
  • 应用服务器安装
  • 集群配置
  • 域检查
  • 为现有域启用集群支持
  • HTTP负载平衡器插件
4.GlassFish v2 替换 Tomcat 5.x

5.GlassFish系列文章 http://www.javaeye.com/news/2880