记录HikariCP连接池的一个bug

一、问题背景

再用Hikari连接池做一个利用存储过程获取多结果集的mysql存储过程报错,报告某个列名字找不到,部分代码截图如下

  1 //....Hikari获取connection,执行callablestatement调用存储过程....
  2 while (cs.getMoreResults(1)){
  3   List<Map> replyuserlist = new ArrayList<Map>();
  4   morerescout ++;
  5   if(1 == morerescout){
  6   //评论数组
  7   rs = cs.getResultSet();
  8   // 返回结果集
  9   while (rs.next()) {
 10     Map map = new HashMap();
 11     map.put("uuid", rs.getString("uuid"));
 12     map.put("useruuid", rs.getString("useruuid"));
 13      }
 14 }
 15 

第一个结果集处理都挺正常,后面的结果集处理过程中老报错,表示某个列名没找到

二、问题解决

最后经过艰难的debug过程,发现Hikari代理的ResultSet对象不管获取第几个结果集,最后的结果集元信息,即列名等信息一直没有更新,导致利用列名获取结果的时候报错,解决办法是在获取结果的时候利用列索引而不是列名,即如下所示

  1 //....Hikari获取connection,执行callablestatement调用存储过程....
  2 while (cs.getMoreResults(1)){
  3   List<Map> replyuserlist = new ArrayList<Map>();
  4   morerescout ++;
  5   if(1 == morerescout){
  6   //评论数组
  7   rs = cs.getResultSet();
  8   // 返回结果集
  9   while (rs.next()) {
 10     Map map = new HashMap();
 11     map.put("uuid", rs.getString(1));
 12     map.put("useruuid", rs.getString(2));
 13      }
 14 }
 15 

三、感想

第三方的插件其实也是依赖底层去做的,如果对底层的实现没有那么全面的话,也会出现这样那样的问题,所以基础知识还是挺重要的。

原文地址:https://www.cnblogs.com/marshwinter/p/13750580.html