com.ibm.db2.jcc.am.SqlException: [jcc] [t4] [10120] [10898] [4.19.49] Недопустимая операция: набор результатов закрыт. ERRORCODE = -4470, SQLSTATE = null - PullRequest
0 голосов
/ 02 ноября 2018

В нашем приложении Struts2 Для выборки данных мы получили набор результатов закрыт . мы используем одну структуру для извлечения данных результатов. Мы используем BaseResultSetHandler для получения данных результатов в файле DAO. Я не могу найти причину, по которой набор результатов закрыт. В приведенном ниже коде, пожалуйста, помогите нам

у нас есть абстрактный класс BaseResultSetHandler

public abstract class BaseResultSetHandler {
    protected ResultSet resultSet;
    public abstract Object handleResult() throws SQLException;

    public Object handleResultSet(ResultSet rs) throws SQLException{
        setResultSet(rs);
        Object obj = handleResult();
        return obj;
    }
    public void setResultSet(ResultSet resultSet) {
        this.resultSet = resultSet;
    }
    public ResultSet getResultSet() {
        return resultSet;
    }
    public Integer getInteger(String columnName,ResultSet resultSet) throws SQLException{
        return StringUtility.getInt(resultSet.getInt(columnName));
    }
    public String getString(String columnName,ResultSet resultSet) throws SQLException{
        return StringUtility.getString(resultSet.getString(columnName));
    }
    public String getString(String columnName) throws SQLException{
        return StringUtility.getString(resultSet.getString(columnName));
    }
  }

У нас есть один класс DatabaseManger для обработки операций с базой данных, у нас есть функция для извлечения данных из базы данных

  protected Object executePreparedQuery(String query, List arguments, BaseResultSetHandler BaseResultSetHandler, Connection useThisConnection)
        throws SQLException, InstantiationException, Exception, Throwable
      {
            ResultSet resultSet = null;
        try {
          if (ReferenceCheckUtlity.isNull(useThisConnection)) {
              this.connection = getConnection();
          }else{
              this.connection = useThisConnection;
          }
          this.preparedStatement = this.connection.prepareStatement(query);

          if (arguments != null) {
                Iterator argumentsIterator = arguments.iterator();
                int index = 1;
                while (argumentsIterator.hasNext()) {
                     this.preparedStatement.setObject(index++, argumentsIterator.next());
            }
          }
          resultSet = this.preparedStatement.executeQuery();
          Object localObject2 =   BaseResultSetHandler.handleResultSet(resultSet);

        } finally {
            if(resultSet!=null){
                resultSet.close();
            }
            if(this.statement!=null){
                 this.statement.close();
            }
            if(this.preparedStatement!=null){
                 this.preparedStatement.close();
            }
            if(this.connection!=null){
                this.connection.close();
            }
        }
        return localObject2;
      }

В файле DAO у меня есть метод с общим доступом только 2, здесь есть много методов в файле приблизительно 25+ классов, использующих BaseResultSetHandler

 public String getCheckId(String Id) throws NumberFormatException, SQLException, InstantiationException, Exception, Throwable  {
    ArrayList<Object> argumentList=new ArrayList<Object>();
    argumentList.add(Id);
    int cnt=Integer.parseInt(""+executePreparedQuery(getCheckIdSql(), argumentList, new getCheckIdHandler(), null));
    if(cnt==0){
        return "N";
    }else{
        return "Y";
    }
}
       private String getCheckIdSql() {
    StringBuffer query=new StringBuffer();
    query.append("select count(1) as cnt from EMPLOYEES where ID=? for read only ");
    return query.toString();
}

class getCheckIdHandler extends BaseResultSetHandler {
    @Override
    public Object handleResult() throws SQLException {
        int cnt=0;
        while(resultSet.next()){
            cnt=getInteger("cnt");
        }
        return cnt;
    }
}   
public HashMap<String,String> getMajorData() throws InstantiationException, SQLException, Exception, Throwable{
    LinkedHashMap<String,String> list = new LinkedHashMap<String,String>();
    list=(LinkedHashMap<String, String>) executePreparedQuery(getMajorDataSql(), null, new getMajorDataHandler(), null);
    return list;

}
private String getMajorDataSql() {
    StringBuffer query=new StringBuffer();
    query.append("select RMH_ode,MH_Name from RECMH order by MH_NM for read only");
    return query.toString();
}
class getMajorDataHandler extends BaseResultSetHandler {
    @Override
    public Object handleResult() throws SQLException {
        LinkedHashMap<String,String> list = new LinkedHashMap<String,String>();
        while(resultSet.next()){
            String RMH_CD=resultSet.getString("RMH_CD");
            String MH_NM=resultSet.getString("MH_Name");
            list.put(RMH_CD+"*"+MH_Name, RMH_CD+"-"+MH_Name);
        }
        return list;
    }
}   

И я также должен знать, что он разделяет BaseResultSetHandler resultSet Object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...