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 

    三、感想

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

  • 相关阅读:
    虚拟化与KVM部署
    Jenkins部署及使用
    Tomcat及LAMT架构搭建
    版本控制与Gitlab配置
    Cobbler介绍及搭载
    MYSQL集群配置
    HAProxy——配置与实例
    LVS——配置实例
    Linux——集群
    关于IntellIJ IDEA 2016.2.4新建项目的Java Enterprise没有显示问题
  • 原文地址:https://www.cnblogs.com/marshwinter/p/13750580.html
Copyright © 2011-2022 走看看