一、问题背景
再用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
三、感想
第三方的插件其实也是依赖底层去做的,如果对底层的实现没有那么全面的话,也会出现这样那样的问题,所以基础知识还是挺重要的。