Dorado 5 : 13.3.大数据量复制 (T22)

概述

本示例用来展示在dorado在客户端复制大数据量数据的性能。本示例链接如下:

 

准备工作

新建一工程testperfomance3,无需配置数据源和数据库。

开发步骤

添加Dataset和ViewModel实现

步骤1:添加一Common ViewModel,文件名为TestPerformance3。
步骤2:添加该ViewModel的实现,代码如下:

import java.util.Date;
import org.apache.commons.lang.RandomStringUtils;
import com.bstek.dorado.data.Dataset;
import com.bstek.dorado.view.DefaultViewModel;
/**
 * PerformanceViewModel
 */
public class TestPerformance3ViewModel extends DefaultViewModel {
    private final static long ONE_YEAR = 365L * 24L * 60L * 60L * 1000L;
    protected void doLoadData() throws Exception {
        super.doLoadData();
        Dataset dataset1 = getDataset("dataset1");
        long now = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            dataset1.insertRecord();
            dataset1.setString("employee_id", String.valueOf(i + 1));
            dataset1.setString("employee_name",
                    RandomStringUtils.randomAlphabetic(8));
            dataset1.setInt("salary", (int) (Math.random() * 8000) + 2000);
            dataset1.setBoolean("sex", (Math.random() > 0.5));
            dataset1.setBoolean("married", (Math.random() > 0.5));
            dataset1.setDate("birthday", new Date(now
                    - (long) (Math.random() * ONE_YEAR * 50L)));
            dataset1.setString("degree", RandomStringUtils.randomAlphabetic(8));
            dataset1.setString("email", RandomStringUtils.randomAlphabetic(8));
            dataset1.setString("web", RandomStringUtils.randomAlphabetic(8));
            dataset1.setString("cmnt", RandomStringUtils.randomAlphabetic(8));
        }
        dataset1.moveFirst();
    }
}

步骤3:添加一CustomDataset,id设置为dataset1。
为该Dataset添加如下字段:

Name

DataType

employee_id

string

employee_name

string

sex

boolean

married

boolean

birthday

date

salary

double

degree

string

email

string

web

string

cmnt

string

步骤4:添加一CustomDataset,id设置为dataset2。
为该Dataset添加如下字段:

Name

DataType

employee_id

string

employee_name

string

sex

boolean

married

boolean

birthday

date

salary

double

degree

string

email

string

web

string

cmnt

string

 

添加ListDropDown

步骤1:添加一ListDropDown,属性设置如下:

属性

id

dropdownSex

mapValue

true

autoDropDown

true

步骤2:为dropdownSex添加2个DropDownItem,第一个字段name为"男",value为"true",第二个字段name为"女",value为"false"。
步骤3:设置dataset1和dataset2的字段sex的DropDown为dropdownSex。

添加DataTable

步骤1:添加一DataTable,属性设置如下:

属性

confirmCancel

false

confirmDelete

false

dataset

dataset1

height

100%

id

table1

width

100%

步骤2:添加一DataTable,属性设置如下:

属性

confirmCancel

false

confirmDelete

false

dataset

dataset2

height

100%

id

table1

width

100%

 

添加Button

步骤1:添加一Button,属性设置如下:

属性

id

buttonCopy

value

复制1000条记录 (可避免重复添加)

为buttonCopy的onClick事件添加如下代码:

var startTime = new Date();
dataset2.disableControls();
var keyMap = new Object();  // 用于避免记录重复插入的对象,作用类似域哈希表
var record = dataset2.getFirstRecord();
while (record) {
  keyMap[record.getString("employee_id")] = true;
  record = record.getNextRecord();
}
var records = new Array();
var record = dataset1.getFirstRecord();
while (record != null) {
  if (!keyMap[record.getString("employee_id")]) {
    var newRecord = new Record(dataset2);
    newRecord.copyRecord(record);
    records.push(newRecord);
  }
  record = record.getNextRecord();
}
dataset2.enableControls();
dataset2.insertRecords(records);  // 批量添加记录
var endTime = new Date();
alert("复制完成!\n" +
  "已添加了" + records.length + "条记录,\n" +
  "共耗时:" + (endTime.getTime() - startTime.getTime()) / 1000 + "秒。");

步骤2:添加一Button,属性设置如下:

属性

id

buttonDelete

value

删除右侧表格中50%的记录

为buttonDelete的onClick事件添加如下代码:

if (!dataset2.getCurrent()) return;
var startTime = new Date();
var count = 0;
dataset2.disableControls();
try {
  dataset2.moveFirst();
  while (!dataset2.isLast()) {
    dataset2.deleteRecord();
    count ++;
    dataset2.moveNext();
  }
}
finally {
  dataset2.enableControls();
  dataset2.refreshControls();
}
var endTime = new Date();
alert("操作完成!\n" +
  "已删除了" + count + "条记录,\n" +
  "共耗时:" + (endTime.getTime() - startTime.getTime()) / 1000 + "秒。");

创建Jsp页面

生成Jsp页面以后,对布局进行编辑,最后结果如下:

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> 
 <html> 
 <head> 
 <title></title> 
 </head> 
 <body style="margin: 0; overflow: hidden"> 
 <d:View config="TestPerformance3"> 
 <d:Layout type="border"> 
 <d:Pane position="top"> 
 <d:Layout type="Hflow"> 
 <d:Pane> 
 <d:Button id="buttonCopy" /> 
 </d:Pane> 
 <d:Pane> 
 <d:Button id="buttonDelete" /> 
 </d:Pane> 
 </d:Layout> 
 </d:Pane> 
 <d:Pane position="center"> 
 <d:SplitPanel id="splitpanel1" orientation="horizontal" position="50%"> 
 <d:DataTable id="table1" /> 
 <d:Splitter /> 
 <d:DataTable id="table2" /> 
 </d:SplitPanel> 
 </d:Pane> 
 </d:Layout> 
 </d:View> 
 </body> 
 </html>

查看运行效果

启动服务器后,查看运行效果如下:

知识点

本示例旨在展示dorado的高性能,未涉及新的知识点。不过若需要制作虚假数据,RandomStringUtils.randomAlphabetic方法是个不错的选择。