数据库报错:validationQuery didn't return a row原创
金蝶云社区-吴辉宇
吴辉宇
0人赞赏了该文章 1,657次浏览 未经作者许可,禁止转载编辑于2023年01月09日 09:18:41

问题原因:访问苍穹时,数据库报异常validationQuery didn't return a row,如图:

image.png


问题分析:

报错信息是validationQuery didn't return a row,意思是数据库连接时,验证sql获取不到返回数据。再简单点就是数据库连接成功,但是表里没数据!这里的表是指t_open_3rdapps


解决方法:这种情况,不是单独处理某一张表就可以了。

1. 如果是新创建的数据中心,有可能数据库初始化异常了,建议删库后重新初始化

2. 如果是一个使用中的苍穹报这种错,那要分析最近对数据库做了什么操作,引起的表里没数据。若数据库有备份,从备份中恢复数据。没有备份的话,只能从其他环境复制数据。除外还要检查苍穹其他模块能否正常使用。


深入学习:

大家会想,为什么是t_open_3rdapps这张表,这个是从哪里配置的?从报错的信息来看,异常是DruidAbstractDataSource类中的validateConnection()方法报的错,那么我们搜索这个类,看下这个类的结构,发现有一个validationQuery的成员变量。既然有变量就有set方法。在这个方法打个断点,使用debug启动苍穹。断点信息如下:

image.png


图中,validationQuery的值是“select 1 from t_open_3rdapps”,这个sql是固定的还是可设的呢?在debug窗口,网上一层一层点击上层方法调用,可以在MCDBUtil类的getDataSource方法中,发现传参是固定的。

image.png


苍穹中的异常,报错。都是可以调试的,在遇到问题时,不要着急,首先要知道报错是什么?然后从异常中大致定位报错的代码,最后通过分析得到异常的解决方案。

赞 0