产生原因
当前执行GridTable.addField方法时,里面会对列进行权限判定,如果列没有权限则不进行添加,进行权限判定的时候,如果列的缓存中没有该列的实例化对象,会对MColumn实例化,该实例化会进行数据库的访问,经测试发现,单次执行速度大约在5~10ms,如果单表字段个数是50个,那么此页签获取字段的耗时约为250~500ms.这么来看,加载速度还可以接受,但这只是针对一个页签来说,如果当前窗口创建了10个页签,那么所有页签加载字段的耗时约为 2500~5000ms,这还只是字段的加载耗时,并不包含UI创建的耗时,明显已超时客户的容忍极限。
处理思路
1、在加载页签字段之前,提前执行一次数据库查询,将页签对应的MColumn对象放入缓存中,供权限判断的时候使用
修改实例
1、在GirdTab.loadFields()添加红框代码
MColumn.loadColumnData(getAD_Table_ID(),Env.getCtx());
2、在MColumn中实现loadColumnData方法
/**
*
* @param AD_Table_ID
* @param ctx
*/
public static void loadColumnData(int AD_Table_ID, Properties ctx) {//判空
// TODO Auto-generated method stub'
long start = System.currentTimeMillis();
String querySQL = " select * from ad_column where ad_table_id = ?";
PreparedStatement st = null;
ResultSet rs = null;
try {
st = DB.prepareStatement(querySQL, null);
st.setInt(1, AD_Table_ID);
rs = st.executeQuery();
while(rs.next()) {
MColumn column = new MColumn(ctx, rs, null);
int id = column.getAD_Column_ID();
if (id > 0 && !s_cache.containsKey(id))
{
s_cache.put (id, column, e -> new MColumn(Env.getCtx(), e));
}
}
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
} finally {
DB.close(rs, st);
rs = null;
st = null;
}
long end = System.currentTimeMillis();
System.out.println("加载列数据:"+(end-start));
}
注:方法名自己随便定义
修改效果
修改之前,打开生产工单(19个页签)耗时
修改之后,打开生产工单还是