zoukankan      html  css  js  c++  java
  • 记录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 

    三、感想

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

  • 相关阅读:
    字符串初始化、查找字符+获取字符
    冒泡排序
    JAVA中值类型和引用类型的不同?
    二维数组初始化,属性,遍历,输出各元素总和。
    数组定义属性遍历循环,输出最大数
    for穷举,叠代练习
    HTML--Boby部分之<a>标签
    HTML--Boby内标签之多行文本及下拉框
    HTML--Boby部分Input之重置
    HTML--Boby部分Input之上传文件
  • 原文地址:https://www.cnblogs.com/marshwinter/p/13750580.html
Copyright © 2011-2022 走看看