错误信息:validationQuery didn’t return a row
原因:问题在于spring配置文件里面里面有下面一条:
validationQuery是用于验证连接是否成功的查询SQL语句,但是当数据库表中没有数据时,就会出现上述异常。
如果在test表中插入一条记录,就不会出现上述问题了。
该配置不能直接删掉,dbcp是采用了commons-pool做为其连接池管理,testOnBorrow,testOnReturn, testWhileIdle是pool是提供的几种校验机制,通过外部钩子的方式回调dbcp的相关数据库链接(validationQuery)校验。
配置中还有几个很重要的属性,_testOnBorrow、_testOnReturn、_testWhileIdle,分别表示取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证。
主要用来检验拿到的connection是否正常可用。不做校验的话,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际已经时无效的数据库连接了拿到的connection可能是不可用的。
网上很多说DBCP的bug应该都是如此吧,只有把这些属性设为true,再提供_validationQuery语句就可以保证数据库连接始终有效了。