|
即使安装在Oracle数据库上,testlink仍无法充分利用数据库的性能。做了个实验,从QC的数据库中转换了9万个案例(包括目录结构、设计步骤)到TL的库,发现没法使用。主要的问题是TL设计时没有考虑性能问题,大量使用IN(id, id, id...)的形式做查询。
为此需要对TL做一些改动。因为仅适用于Oracle库,所以不适合提交到TL项目,就自己用吧。
到目前为止的改动:
1、首页上有一个判断是否有Testcase的函数,是取所有TestCaseID,然后判断列表长度是否大于0(-_-!);修改这个sql,直接查tcversion有无记录即可;再进一步,完全可以把这个判断去掉。
2、改造 IN (list)。思路是把它改为子查询。
具体实现有些费劲,因为子查询中的select语句参数中也不能支持大文本数据。但(insert + 绑定变量)可以。 于是在数据库建立global temporary table,是仅有一个ID字段的表,设置成on commit preserve rows;在testlink的database.inc.php新增一个wrap_list函数,内容是:先删除临时表;再用存储过程把逗号分隔的list参数分解成id,插入临时表,然后返回一个子查询语句“select id from temp_id_table”。这样,testlink的 in ({$idList})就可以改写成 in ({$this->db->wrap_list($idList)})。
另外,testlink的database类不支持绑定参数,稍微改造一下就可以了。
这两步做好以后,浏览和编写案例基本上就没问题了;但搜索案例仍有问题。继续改搜索:
1、搜索代码中有个逻辑,如果没填caseID,就在sql中加一个 and id in (项目中所有caseid)。这个地方唯一的作用就是把搜索限制在指定的项目中。我的思路是在案例上增加项目信息,就可以筛选了。具体做法有点取巧:在nodes_hierarchy的tcversion节点的name字段记录projectID(反正这个字段没有被TL使用)。为此需要修改create testcase version的方法(有两处)。
2、搜索时会查两遍,第一遍查count(*),第二遍才查具体信息。这个没有必要,改为只查一遍(加limit)。 |
|