您的位置:首页技术文章
文章详情页

特定配置下Oracle日志批量提交的最优数量

【字号: 日期:2023-11-23 19:00:17浏览:5作者:猪猪
 一、测试背景

项目中的记录日志有时会采用批量提交的方法,它的好处是减少了获取数据连接的次数,从而减少了网络交互的次数,提高了系统性能。为了将系统性能提高到最好,找到特定配置下oracle批量提交的最优数量,进行了这个测试。

二、测试环境与配置(数据库服务器配置)

操作系统:aix 5.3

数据库版本:oracle 10g

Java版本:1.5

Web应用服务器:weblogic

三、测试设计

1. 如何进行批量提交

可能有人对我上面提到的批量提交的实现方式不清楚,在此详细介绍一下,用到的是preparedStatement的addBatch()和 executeBatch()方法。addBatch()方法将一组参数添加到preparedStatement 对象的批处理命令中,通过调用方法 executeBatch 可以批量执行此列表中的命令。

程序如下例: 

public static void test(){......preparedStatement ps = nulltry {conn = DataSourceManager.instance().getConnection();ps = conn.prepareStatement('insert into log(col1,col2)values(?,?)');for (int i = 0 i < commitCount; i++) {ps.setString(1, 'hello');ps.setString(2, '123');ps.addBatch();}ps.executeBatch();......}

  2.设计思路

测试要得到的就是程序中一次批量提交的日志最优条数,也就是commitCount的值。

拿到这个测试项目时,我的思路是:设定批量提交日志参数commitCount的值,在一段可计算的时间time 内提交日志数count,得到每秒提交的日志条数v(v=提交的日志数count/时间time)。逐渐增加批量日志参数commitCount,得到不同的v,对比数据,取最大的v所对应的commitCount,即为批量提交的最优数量。

3. 程序设计

思路比较容易确定,剩下就是程序的设计了。设计程序的原则是可操作性要高,主要问题是思路中提到的各个参数的设置和获取。在经验丰富的前辈的指点下,对程序进行了设计,在此不再赘述具体代码,只将程序设计思路简单介绍一下:

a.commitCount的设置

在测试页面设置输入框,将此值作为参数输入。

b.time的获取

在提交日志之前和之后分别取系统时间,作差即得提交日志所用时间time

c.count的设置

为忽略批量提交日志每次获取数据连接所用的时间,设置提交次数views,并在程序中将获取数据连接的代码写在提交所有日志前(注意:写在批量提交程序中每个批量提交都会建立数据连接,从而使得到的time误差较大)。这样提交一次日志只获取一次数据连接。所以提交次数越大,得到的time就越接近提交日志所用的时间,可忽略获取连接所用时间。

所以在页面设置'提交次数'输入框views,程序中设计一个循环来模拟多次批量提交日志,并计算count=commitCount*views

程序计算v=count/time 的值,显示到页面。

另外注意:插入数据时,数据表原有数据条数对插入数据的速度也会有影响。为保证每次插入日志时数据表环境一致,在每次插入日志之后要删除本次插入的日志。

四、测试执行情况和测试结果

程序写好部署后,万事俱备,可以进行测试了(注意:最好找网络稳定的时间进行测试,得出的测试结果误差较小)。

在页面输入“批量提交日志参数”commitCount和“提交次数”views,并记录返回到页面的v值。

“提交次数”设为50,人为设定“批量提交日志参数”commitCount,从100开始,一次增加20,到200,发现v的值一直增大,之后将 commitCount分别以100、200等幅度向上增加,直到5000。发现commitCount=500时,v值最大。

为排除网络原因,每组数据测试两次。具体测试数据形成了折线图,如下图:

特定配置下Oracle日志批量提交的最优数量

所以在以上描述的特定测试环境下,oracle 日志批量提交的最优数量是500 条。

以上就是测试的全过程,或许有人有更好的测试方法,以期共享。

标签: Oracle 数据库