gMIS主要更新201404

gMIS 通用管理信息系统,最近进行了几个主要更新:删除记录后丢失pntc的导航页异常;初始化查询时的重复SQL查询问题;下拉框从表中选择options时的缓存优化等。

1. 删除记录后的list页面丢失pntc,进而导航页异常

使用gMIS部署到一个新项目,频繁需要删除数据,主要异常行为是,在list页面时,如果删除掉一条记录,则当前页面的导航翻页等功能显示正常,但在进一步点击翻页时,翻页信息全部丢失。

经查,涉及到 class/pagenavi.class.php中的

if(strpos($query, “act=list-“) !== false){
$query = preg_replace(“/act=list\-([0-9a-z]*)/”,”act=list”,$_SERVER[‘QUERY_STRING’]);
$this->hmf[‘neednewpntc’] = 1 ; # newly-added
$query = preg_replace(“/&pntc=([0-9]*)/”,””, $query);
}

然后在 jdo.php里,需要进一步的做处理:

if($_REQUEST[‘pntc’] == ” || $_REQUEST[‘pntc’] == ‘0’ || $navi->get(‘neednewpntc’) == 1){
$pagenum = $gtbl->get(‘pagenum’);
$gtbl->set(‘pagenum’, 1);
$hm = $gtbl->getBy(“count(*) as totalcount”, $navi->getCondition($gtbl, $user));

if($hm[0]){
$hm = $hm[1][0];
$navi->set(‘totalcount’,$hm[‘totalcount’]);
}
$gtbl->set(‘pagenum’, $pagenum);

}

其中, $navi->get(‘neednewpntc’) 的判断条件是新增的,原因是在前面的 class/pagenavi.class.php中去掉了相应的参数,这里要重新算出。 由于$navi对象此时持有的环境变量 $pagenum 和 $pagesize 是导航页的主对象 $obj 的,而select count(*) as totalcount 的结果集,只会有一条记录,因此改之前会出现下面这样的查询SQL:

mysql> select count(*) as totalcount from tbl where …… limit 100,20

这样基本有结果集,但limit的太靠后导致读取不到结果,进而丢失了pntc,导航页面也就失常了。

已修正。

2. 初始化查询时重复SQL问题

gMIS里,在inc/webapp.class.php中,如果活跃对象 $obj 进行属性读取时,$obj->get(‘xxxx’);时,系统会先读取运行时环境值,如果没有就触发去持久层读取相应数据,首选的是读取数据库。

function get($field)
{
if(array_key_exists($field,$this->hmf))
{
return $this->hmf[$field];
}
else if($field != ‘id’ && $field != ‘er’) #! Otherwise, this will cause a dead loop with ._setAll.
{
if($this->get(‘er’) != 1){
if($this->_setAll()){
if(isset($this->hmf[$field])){
return $this->hmf[$field];
}
else{
return $this->hmf[$field]=”;
}
}
else{
return ”;
}
}
else{
return ”;
}
}
else{
return ”;
}
}

其中 $this->get(‘er’) 的判断是新增的,如果第一次读取已经知道是空记录,或者无记录,则在当前会话中,不再继续多次查询同一SQL.

类似的,还新增了 isset($this->hmf[$field]) 的判断,这是针对某个运行时变量只在app中,而没有在持久层中,这样的也会导致因为一个变量的不确定值,而产生的多次同一SQL的查询,加入此判断,则可以减省掉这些不必要的开支。

3. 下拉框选择项的动态读取,重复SQL查询的问题

gMIS中提供了动态下拉框的功能,也即一个下拉框的数据选择项,可以动态的从另外一个数据源(表)中读取。这为管理信息系统提供了丰富的功能。

之前的设计中,在gMIS的 class/gtbl.class.php 中,每次都来一个getSelectOption就读取一次数据库,改进后的做法,增加了缓存:

$hmoption = array();
if(isset($this->hmconf[‘selectoption_’.$field])){
$hmoption = $this->hmconf[‘selectoption_’.$field];
}
else{
$oldhmf = $this->hmf;
$this->hmf = array();
$this->setTbl($tbl);
$hm = $this->getBy(“id,$dispfield”, $arr[3]);
if($hm[0]){
$hmoption = $hm[1]; $this->hmconf[‘selectoption_’.$field] = $hmoption;
}
$this->hmf = $oldhmf;
}
foreach($hmoption as $k=>$rec){
$optionlist .= “<option value=\””.$rec[‘id’].”\””;
if($defaultval != null){
if($rec[‘id’] == $defaultval || strpos(“,”.$defaultval.”,”, “,”.$rec[‘id’].”,”) !== false){
$optionlist .= ” selected”;
$selectval = $rec[$arr[2]].(isset($arr[3])?”-“.$rec[$arr[3]]:””).” (“.$rec[‘id’].”)”;
if($needv == 1){
$selectval_mul .= $rec[$arr[2]].(isset($arr[3])?”-“.$rec[$arr[3]]:””).” (“.$rec[‘id’].”),”;
}
}
}
$optionlist .=”>”.$rec[$arr[2]].(isset($arr[3])?”-“.$rec[$arr[3]]:””).” (“.$rec[‘id’].”)</option>\n”;
}

$hmoption缓存到$this->hmconf中是新增的功能,这样在同一个list页面中,每个select字段,只要一次SQL查询数据源即可。

—- —-

写这么多,发现之前的要优化的地方不少,改进无止境。

最新新注册的 -自然域名 -NatureDNS :

-人民网研究院   -度假村联盟   -乐视网   -蘑菇街   -爱卡汽车   -百度百科   -uc浏览器   -wiki   -豆瓣   -1号店

 

此条目发表在-gMIS, 编程技术, 计算机技术分类目录。将固定链接加入收藏夹。

gMIS主要更新201404》有1条回应

  1. wade lau说:

    最新部署在 labs.people.com.cn/dev/dbmgmt/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code