Update Bulk.php

This commit is contained in:
zizhilong
2016-02-11 16:47:51 +08:00
parent d6affd7321
commit 6ee3e78168

View File

@@ -35,7 +35,6 @@ trait Bulk
if (empty($data)) { if (empty($data)) {
$this->error = Lang::get('_DATA_TYPE_INVALID_'); $this->error = Lang::get('_DATA_TYPE_INVALID_');
} }
if($data !== true){ if($data !== true){
//如不是提交操作,则进行数据处理和缓存累加 //如不是提交操作,则进行数据处理和缓存累加
$data = $this->_write_data($data,'insert'); $data = $this->_write_data($data,'insert');
@@ -49,16 +48,11 @@ trait Bulk
//得到默认的提交SQL数据长度,此设定根据数据库配置不同得到的性能结果会有差异 //得到默认的提交SQL数据长度,此设定根据数据库配置不同得到的性能结果会有差异
//这个数字是否应该写死还是定义一个公共配置名称,需要核心组讨论 //这个数字是否应该写死还是定义一个公共配置名称,需要核心组讨论
//发现使用insertAll因为bind生成出来的语句比正常的要长不少.字段名+时间戳+序号,还有优化的余地 //发现使用insertAll因为bind生成出来的语句比正常的要长不少.字段名+时间戳+序号,还有优化的余地
if(isset($options['bulkSize'])){ $bulkSize = isset($options['bulkSize']) ? $options['bulkSize'] : 10000;
$bulkSize = $options['bulkSize'];
}
else{
$bulkSize = 10000;
}
//数据累计到一定量,则执行 //数据累计到一定量,则执行
if($this->bulkAddSize>=10000 || ($data === true && !empty($this->bulkAddCache))){ if($this->bulkAddSize < $bulkSize && ($data !== true || empty($this->bulkAddCache))){
return true;
}
$options = $this->_parseOptions($options); $options = $this->_parseOptions($options);
// 写入数据到数据库 // 写入数据到数据库
$result = $this->db->insertAll($this->bulkAddCache, $options,false); $result = $this->db->insertAll($this->bulkAddCache, $options,false);
@@ -68,9 +62,7 @@ trait Bulk
$this->bulkAddSize = 0; $this->bulkAddSize = 0;
//触发了一个实际插入操作,返回成功或失败 //触发了一个实际插入操作,返回成功或失败
return (false !== $result); return (false !== $result);
}
//插入数据到缓存未导致任何触发 //插入数据到缓存未导致任何触发
return true;
} }
/** /**
* 批量更新操作 * 批量更新操作
@@ -105,7 +97,12 @@ trait Bulk
$this->bulkSaveSize[$field] = 0; $this->bulkSaveSize[$field] = 0;
} }
//如果同一个记录的同一字段被多次更新 //如果同一个记录的同一字段被多次更新
if(isset($this->bulkSaveCache[$field][$data[$pk]])){ if(!isset($this->bulkSaveCache[$field][$data[$pk]])){
//计算新增修改增加的SQL长度
$this->bulkSaveCache[$field][$data[$pk]] = $val;
$this->bulkSaveSize[$field] += strlen($val) + strlen($data[$pk]) * 2+14;
continue;
}
//如果是自增自减操作 //如果是自增自减操作
$operator = '='; $operator = '=';
if(in_array(substr($field,-1,1),['+','-'])){ if(in_array(substr($field,-1,1),['+','-'])){
@@ -120,23 +117,14 @@ trait Bulk
$this->bulkSaveCache[$field][$data[$pk]] += ( $operator =='+' ? $val : - $val ); $this->bulkSaveCache[$field][$data[$pk]] += ( $operator =='+' ? $val : - $val );
} }
} }
else{
$this->bulkSaveCache[$field][$data[$pk]] = $val;
}
//计算新增修改增加的SQL长度
$this->bulkSaveSize[$field] += strlen($val)+strlen($pk)*2+14;
}
}
if(isset($options['bulkSize'])){
$bulkSize = $options['bulkSize'];
}
else{
$bulkSize = 5000;
} }
$bulkSize = isset($options['bulkSize']) ? $options['bulkSize'] : 10000;
//扫描字段长度.看是否有需要先执行的 //扫描字段长度.看是否有需要先执行的
foreach($this->bulkSaveSize as $field=>$size) foreach($this->bulkSaveSize as $field=>$size)
{ {
if($size >= $bulkSize || ($size>0 && $data === true)){ if($size < $bulkSize && ($size== 0 || $data !== true)){
continue;
}
//复制出插入数组 //复制出插入数组
$dataSet = $this->bulkSaveCache[$field]; $dataSet = $this->bulkSaveCache[$field];
unset($this->bulkSaveCache[$field]); unset($this->bulkSaveCache[$field]);
@@ -153,5 +141,4 @@ trait Bulk
$this->db->updateFieldAll($field,$pk,$dataSet,$operator,$options); $this->db->updateFieldAll($field,$pk,$dataSet,$operator,$options);
} }
} }
}
} }