访问苍穹时数据库报错"validationQuery didn't return a row",原因是验证SQL(从t_open_3rdapps表查询)未返回数据,即表可能为空。解决方法视情况而定:新数据中心建议删库重初始化;使用中的数据中心应检查数据库操作,恢复或复制数据,并检查其他模块功能。调试时可通过DruidAbstractDataSource的validateConnection()方法,定位到固定的validationQuery值"select 1 from t_open_3rdapps",逐步分析解决。
问题原因:访问苍穹时,数据库报异常validationQuery didn't return a row,如图:
问题分析:
报错信息是validationQuery didn't return a row,意思是数据库连接时,验证sql获取不到返回数据。再简单点就是数据库连接成功,但是表里没数据!这里的表是指t_open_3rdapps
解决方法:这种情况,不是单独处理某一张表就可以了。
1. 如果是新创建的数据中心,有可能数据库初始化异常了,建议删库后重新初始化
2. 如果是一个使用中的苍穹报这种错,那要分析最近对数据库做了什么操作,引起的表里没数据。若数据库有备份,从备份中恢复数据。没有备份的话,只能从其他环境复制数据。除外还要检查苍穹其他模块能否正常使用。
深入学习:
大家会想,为什么是t_open_3rdapps这张表,这个是从哪里配置的?从报错的信息来看,异常是DruidAbstractDataSource类中的validateConnection()方法报的错,那么我们搜索这个类,看下这个类的结构,发现有一个validationQuery的成员变量。既然有变量就有set方法。在这个方法打个断点,使用debug启动苍穹。断点信息如下:
图中,validationQuery的值是“select 1 from t_open_3rdapps”,这个sql是固定的还是可设的呢?在debug窗口,网上一层一层点击上层方法调用,可以在MCDBUtil类的getDataSource方法中,发现传参是固定的。
苍穹中的异常,报错。都是可以调试的,在遇到问题时,不要着急,首先要知道报错是什么?然后从异常中大致定位报错的代码,最后通过分析得到异常的解决方案。