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中存在非法字符(晕倒),后来改为全部在内存中设置;
- 多线程并发查询的设计抽象不足,应用场景改变时需要频频修改,继续改进中……
- 多线程适用于有多个设值线程的情况。