1/7用友股份-LE支持服务业务本部技术方案--《NC57查询引擎预警报错问题》建立日期:2013-10-20修改日期:xxxx-xx-xx文档属性:客户文控编号:LE-DY-JS-2013-01272/7文档控制创建记录适用范围审阅人日期审阅签字所属部门发布范围发布人姓名所属部门发布时间内部员工伙伴客户日期作者所属部门邮件地址版本2013-10-20魏享林技术支持部V1.0版本领域模块备注NC573/7目录NC57查询引擎预警报错问题..................................................................................4一、系统环境............................................................................................................4二、问题描述............................................................................................................4三、检查分析............................................................................................................4四、解决方法............................................................................................................74/7NC57查询引擎预警报错问题一、系统环境NC版本:NC57操作系统:Linux中间件:was垂直集群二、问题描述任何一个配置了查询引擎预警的节点,都无法打开,界面不报错,只是节点界面无法显示出来。三、检查分析1、查看前台日志,发现是UnitRCBO_Client.openMainFrame方法报错报错信息如下5/7从报错信息看,是因为CSITransactionRolledbackException类找不到。这个报错并不是真正的错误原因,出现这个报错是因为后台was扔出了CSITransactionRolledbackException异常,NC代码将此异常传到了前台,而前台类加载器不可能加载到Was的类,导致报类找不到错误。真正出错的原因还要看后台日志。2、查看后台任务,找到出错原因为一个事务中访问了多个数据源在pa日志中,找到如下报错信息,说明问题出在一个事务中访问了多个非XA数据源:3、查看查询引擎预警代码,发现在运行查询引擎时,会生成临时表,生成的临时表信息会作为日志记录在查询引警默认数据源中6/74、查看ierp\bin\queryengine.xml文件,发现默认数据源不是当前帐套数据源检查ierp\bin\queryengine.xml文件,发现默认数据源是IUFO数据源,不是当前帐套对应的数据源。如果将默认数据源设成当前帐套的数据源,则此问题即可解决。但用户环境中建有两个NC帐套,询问顾问这两个帐套是否都需要用到查询引擎预警,顾问反映是都会用到,这样无法通过修改默认数据源来避免该问题。5.将DDCService.logTempTable封装成一个_RequiresNew方法NC中,如果一个EJB方法名后面带_RequiresNew,则该方法会新开一个事务,使用这种方法,能解决大多数的一个事务中访问多个数据源问题。补丁打到用户环境后,发现还是报错。检查后台日志发现报错出在DDCService和PerfHandler初始化时,会有很多的访问查询引擎默认数据源的操作,而且代码调用很复杂,通过_RequiresNew来解决会使代码改得很乱很复杂。6.添进一个ServiceComponent,在该服务组件启动时,会初始化DDCService,避免在运行查询引擎时,再初始化DDCServiceupm文件新增加的两个接口如下:7/7QEStartService实现如下:7.补丁打到用户环境后,发现问题解决补丁打上并部署后,发现多个配置了查询引擎预警的节点都能正常打开,且能弹出查询引擎结果。四、解决方法修改查询引擎代码,避免在一个事务中访问多个数据源。补丁为:nchome.rar,打此补丁需要部署EJB。