2007-03-27

实测显示Hibernate的batch_size配置没有作用

为了验证 Hibernate 批量数据插入的性能,选择合适的 batchsize ,我做了一个 benchmark 的测试。可是测试的结果非常奇怪。 Jdbc.batch_size 的设置对性能基本没有影响。

注意,本文中所有测试时间单位为毫秒。

第一组测试, batch size 比较

为插入 1000 条订单数据,循环中没有做 flush ,每种 batchsize 重复测 10 次。得到结果如下。

这此数据显示不设 batch size 性能反而最好,但是差别极小。这是什么原因?!

jdbc.batchsize

1

2

3

4

5

6

7

8

9

10

平均值

100

4468

4703

4468

4297

4390

4266

4406

4281

4328

4234

4384

50

4250

4328

4313

4266

4281

4235

4719

4343

4344

4375

4345

30

4484

4859

4313

4047

4204

4359

4422

4469

4344

4266

4377

10

4313

4578

4281

4312

4282

4657

4063

4313

4312

4313

4342

不设置

4219

4235

4187

4235

4297

4297

4343

4313

4250

4312

4269

第二组测试 , flush size 比较

与第一组一样插入 1000 条订单数据, batch size 为 100 。循环中每一定条数做一次 flush 。得到结果如下。

这组测试结果基本正常。 Flush size 赿大,时间赿少。但时间少的原因很可能是清理缓存的次数少,而非批处理之功。

flush size

1

2

3

4

5

6

7

8

9

10

平均

100

4813

4719

4750

4984

4906

4735

5094

4734

5000

4906

4864

50

5687

5703

5422

5438

5578

5516

5578

5391

5547

5500

5536

30

6281

6266

6281

5797

6172

6704

6250

6453

5875

6469

6255

10

7953

8640

8672

9047

8547

8922

8640

7844

8062

8625

8495

第三组测试,继承表插入

前面两组测试,都是单表插入。本组是双表插入:一个基类表,一个子类表,按 Table per Sub Class 进行 O/R Mapping 。 Batch size 为 100 。 Flush size 为  1000, 50, 30, 10 和不做 flush 。

这个结果也是基本正常

flush size

1

2

3

平均

100

5891

5703

5859

5818

50

6672

6625

6766

6688

30

7797

7344

7875

7672

10

9328

9406

9234

9323

不做flush

5250

5203

5172

5208

Technorati : ,

2007-03-21

Powerdesigner12.0最适合打印的显示设置

时序图中生命线的宽度要取二号宽度,否则可能打印不出来,无论颜色是什么。

时序图中消息流的显示,在缺省情况下是方法名,而非我们输入的消息名称。只要取消"Replace by operation name",就可以取消这个功能。注意取消时应同时取消"signature",这样才能把方法参数和方法名都屏蔽掉。

在精细设计时,显示方法名是很贴心的一个功能。但是记住不管你看到的是方法名,还是消息名,两者都应当输入。不输入方法名,说明你设计不到位。不输入消息名。当你在类中不小心改变了方法名或别的什么的时候,时序图中的方法名也就没有了。这时的消息上可就只显示个"message_123"什么的,

Technorati :

2007-03-07

JBoss上的J2EE数据源配置

ejb-jar.xml in ejb/META-INF

<session >
... ...

<resource-ref>
<res-ref-name>XPCDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Application</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

</session>

jboss.xml in ejb/META-INF

<?xml version="1.0"?>
<!DOCTYPE jboss PUBLIC
"-//JBoss//DTD JBOSS 3.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">

<jboss>
<enterprise-beans>
<session>
<ejb-name>CacheDemo1</ejb-name>
<jndi-name>ejb/CacheDemo1</jndi-name>
<local-jndi-name>ejb/CacheDemo1Local</local-jndi-name>
<resource-ref>
<res-ref-name>XPCDataSource</res-ref-name>
<jndi-name>java:/XPCDataSource</jndi-name>
</resource-ref>
</session>
</enterprise-beans>
</jboss>

web.xml in web/WEB-INF

<resource-ref>
<res-ref-name>XPCDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Application</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

jboss-web.xml in web/WEB-INF

<resource-ref>
<res-ref-name>XPCDataSource</res-ref-name>
<jndi-name>java:/XPCDataSource</jndi-name>
</resource-ref>

创建Data Source

Context c = new InitialContext();
Object obj = c.lookup("java:comp/env/XPCDataSource");
DataSource ds = (DataSource)narrow(obj, DataSource.class);
connection = ds.getConnection();

取得Transaction

//context is javax.ejb.SessionContext

//Transaction should be getten from EJB

UserTransaction tx = context.getUserTransaction();

Webspere deployer will change ejb-jar.xml. Never put struts to Webspere/lib/ext

Technorati :