优化业务代码和数据库分开部署导致的窗口打开缓慢问题(IDempiere)

产生原因  

        当前执行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个页签)耗时

修改之后,打开生产工单还是

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值