数据库迁移方案:
方案一:
init:
比如某一天0:00-23:59把老数据迁移至新表(假设需要一天),但是有一个问题:比如在0:00已经迁移到新表的数据,在12:00的时候老表数据update了,则新表中的数据是还未更新的。
job:定时任务,每隔一段时间进行一次老表到新表数据迁移
解决方案:
insert:比较老数据的update_time和中间表的create_time比较,如果没有中间表,则插入,如果有,则update
update:同上
delete:老表数据删除,同事去新表也把数据删除
打标签:
server处理:批处理
user触发:属于打散处理,减小数据库压力和并发压力
方案二:
init:选择一小段时间停止服务器运行,将老表数据全部迁移到新表
实时:(需要修改老接口)
增:老表新增的同时对新表进行新增
删:老表删除的同时对新表数据进行删除
改:老表修改的同时对新表数据进行删除
EasyUI分析和覆盖:
config: { action: { edit: 'checkRefuse.do', remove: 'checkPass.do' }, //自定义事件 event: { edit: function (callback) { var record = Utils.getCheckedRows(); if (Utils.checkSelectOne(record)) { $.messager.confirm('确认', '确认此操作?', function (r) { if (r) { jeecg.progress(); var arr = [], idKey = 'id'; //主键名称 $.each(record, function (i, record) { arr.push('id=' + record[idKey]); }); var data = arr.join("&"); jeecg.deleteForm('checkRefuse.do', data, function (result) { jeecg.closeProgress(); // this.event.refresh; refresh(); //回调函数 if (jQuery.isFunction(callback)) { callback(result); } }); } }); } }, }, dataGrid: {
toolbar: [{id: 'btnadd', text: '新建群', btnType: 'add'}, {id: 'btnedit', text: '更新群', btnType: 'edit'}, {id: 'btnedit', text: '解散群', btnType: 'remove'}, { //自定义按钮,并自定义处理方法 id: 'btnedit', text: '发送消息', btnType: 'edit' , handler: 'send' }]
//获取窗口 var SendWin = {send: $("#send-win")} //定义全局变量 var ids ; //初始化窗口,给窗口添加按钮 var initSendWin = function () { if (SendWin.send && SendWin.send[0]) { //判断页面是否设置buttons,如果没有设置默认按钮 var btns = SendWin.send.attr("buttons"); if (!btns) { //设置 保存,关闭按钮 SendWin.send.dialog({ buttons: [ { text: '发送', handler: save }, { text: '取消', handler: close } ] }); } //Win.edit.find("#btn-submit").click(Events.save); //保存事件 //Win.edit.find("#btn-close").click(Events.close);//关闭窗口 } } //自定义方法 var send = function (callback) { //获取选择行 var records = Utils.getCheckedRows(); if (Utils.checkSelect(records)) { var arr = [], idKey = 'groupId'; //主键名称 $.each(records, function (i, record) { arr.push(record[idKey]); }); ids=arr; //调用方法初始化窗口 initSendWin(); //打开窗口 $("#send-win").dialog('open'); Form.send.resetForm(); //刷新 refresh(); //回调函数 if (jQuery.isFunction(callback)) { callback(); } } }; var Utils = { //获取选择行 getCheckedRows: function () { return $('#data-list').datagrid('getChecked'); }, //校验是否有选择行 checkSelect: function (rows) {//检查grid是否有勾选的行, 有返回 true,没有返回true var records = rows; if (records && records.length > 0) { return true; } jeecg.alert('警告', '未选中记录.', 'warning'); return false; }, //校验是否选择单行 checkSelectOne: function (rows) {//检查grid是否只勾选了一行,是返回 true,否返回true var records = rows; if (!Utils.checkSelect(records)) { return false; } if (records.length == 1) { return true; } jeecg.alert('警告', '只能选择一行记录.', 'warning'); return false; } } var Form = { search: $("#searchForm"), add: $("#addForm"), edit: $("#editForm"), send: $("#sendForm") } var refresh = function (callback) { var param = Form.search.serializeObject(); $('#data-list').datagrid('reload', param); //回调函数 if (jQuery.isFunction(callback)) { callback(); } }; var save=function (callback) { var message = document.getElementById('message').value; var data= "ids="+ids+"&input="+message; //ajax请求 $.ajax({ type: "POST", url: "send.do", data:data, success: function(msg){ } }); //关闭窗口 SendWin.send.dialog('close'); if (jQuery.isFunction(callback)) { callback(data); } }; //关闭按钮事件 var close=function (callback) { $.messager.confirm('确认', '你确认关闭窗口?', function (r) { if (r) { SendWin.send.dialog('close'); //回调函数 if (jQuery.isFunction(callback)) { callback(data); } } }); };检验原则:
一切接收到的数据都是不可信的:
就像坐地铁:进站时需要安检,出站时则不需要
DB查询到的结果,HTTPCLIENT传入的数据,页面传入的数据都需要做校验,前三者都是不可控的;自己程序内部定义的方法传入的参数按理来说也需要校验,但是如果自己控制的好的话时可以不用校验的,这部分是可控的
测试原则:
普通值:正常测试数据,测试程序基本功能
边界值:临界值,测试程序边界
容错值:错误值,测试程序容错性,对错误数据处理