信息点查询优化

     Demo版本中:查询2个信息点耗时在1-2分钟左右,考虑了以下策略进行优化,提升查询性能:

1、合并信息点,对于查询规则中从同一个库表条件相同的查询进行合并,调用查询接口,返回结果后进行恢复,为了满足后面的恢复,对于原来的信息点增加了两个字段:attachIndex和attachId,前者表示合并到的查询规则列下标,后者表示合并到的信息点唯一编号。

2、动态构建数据库连接池,备选下面两种方法:

  • 以Hibernate配置文件为模板,应用C3P0数据库连接池,在内存中动态修改数据库相关连接的配置;
  • 使用Java中的动态代理实现数据库连接池,参考[这里 ]。

3、使用DB2的联邦数据库(需要付费插件)或者Oracle的DBLink映射远程数据库到本地,关联查询。

4、优化查询路由(不清楚)。

5、由于多个信息点是无关的,考虑采用多线程,别人的建议是:ThreadPool和WAS提供的TaskManager,后来使用了自己简单设计的一个多线程并发查询,简单说明如下:

  • QueryUnit: 待查询信息点,至少包含属性:name, value和state(INIT, RUNNING, TIMEOUT, EXCEPTION, SUCCESS);
  • BusiHandler: 查询逻辑,包含方法:public void query(QueryUnit qu) throws Exception;
  • ConsumeThread: 取值线程,包括属性:boolean flag, List<QueryUnit> queryUnitList;
  • ProduceThread: 设值线程,包括属性:ConsumeThread ct, QueryUnit qu, long lastQueryTime, long singleThreadTimeout等;
  • ThreadManager: 线程管理器,包括属性:int singleTheadTimeout, int maxThreadCount, int circleCount, List<QueryUnit> quList等, 包括方法:public void boot(); public List<QueryUnit> getData(); List<Info> getSpecifiList(int begin, int size, List<Info> quList)等。

 

     系统经过使用以上优化后查询42个信息点经过合并后为26个信息点(信息点本身的合并潜力很大),设置maxThreadCount=30,第一次查询耗时为5-8秒,以后耗时均在3秒以内。(以上数据均在P4 3.0、2G内存和Tomcat5.5环境下测试)

 

     遗留问题:

  • 采用Hibernate模板方式配置的数据库连接池在发布到WAS6.1时总是报错,提示在hibernate-template.cfg.xml中存在非法字符(晕倒),后来改为全部在内存中设置;
  • 多线程并发查询的设计抽象不足,应用场景改变时需要频频修改,继续改进中……
  • 多线程适用于有多个设值线程的情况。

你可能感兴趣的:(多线程,oracle,Hibernate,db2,配置管理)