PSQLException: это соединение было закрыто с использованием HashMap, переданного из уровня DAO - PullRequest
0 голосов
/ 11 июня 2018

У меня плохое предчувствие, мне нужно что-то реорганизовать.По сути, мне нужно взять массив из PostgreSQL на уровне DAO, а затем преобразовать этот массив JDBC в массив String [] или Integer [].

Моя путаница в том, что я не думаю, что яссылаясь на соединение с базой данных или ResultSet, поэтому я понятия не имею, почему я получаю это исключение?:

Исключение

Это исключение выдается ниже, когда я пытаюсь преобразоватьJDBC массив для объекта [].

org.postgresql.util.PSQLException: This connection has been closed.

DAOImpl

public HashMap<String, Object> getUser(Integer id) {
    try {
        conn = DBConnectionFactory.getDatabaseConnection("postgresql");
        ps = conn.prepareStatement(query);
        rs = ps.executeQuery();

        map = generateMapFromResultSet(rs);
    }
    catch(Exception ex) {
        ex.printStackTrace();
    }
    finally {
        try {
            if(conn != null) {
                conn.close();
            }
            if(ps != null) {
                ps.close();
            }
            if(rs != null) {
                rs.close();
            }
        } 
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
...
}

private HashMap<String, Object> generateMapFromResultSet(ResultSet rs) {

    HashMap<String, Object> returnMap = null;
    ResultSetMetaData rsmd = null; 
    Integer columns = null;

    try {
        rsmd = rs.getMetaData();
        columns = rsmd.getColumnCount();

        while(rs.next()) {
            returnMap = new HashMap<String,Object>(columns);

            for(int index = 1; index <= columns; index++) {
                returnMap.put(rsmd.getColumnName(index), rs.getObject(index));
            }
        }
    }
    catch(Exception ex) {
        ex.printStackTrace();
    }

    return returnMap;               
}

ServiceLayer

Это слойон берет HashMap, перебирает HashMap, выполняет немного больше логики, чем я хочу в моем DAO, и генерирует объект User.

private User convertMapToUser(HashMap<String,Object> userMap) throws IllegalArgumentException {

    ...

    Iterator iterator = userMap.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry pair = (Map.Entry)iterator.next();

        String columnName = (String)pair.getKey();

        switch(columnName) {
            case COLUMN1:
                try {
                    Array col1_array = (Array)pair.getValue();
                    new_col1_array = (Integer[])col1_array.getArray(); //ERROR HERE!
                }
                catch(Exception ex) {
                    ex.printStackTrace();
                }

                break;
            case COLUMN2:
                try {
                    Array col2_array = (Array)pair.getValue();
                    new_col2_array = (Integer[])col2_array.getArray(); //ERROR HERE!
                }
                catch(Exception ex) {
                    ex.printStackTrace();
                }

                break;
            default:
                ...
        }

        // avoids a ConcurrentModificationException
        iterator.remove();
    }

    ...
}

1 Ответ

0 голосов
/ 12 июня 2018

Наличие метода getArray в слое DAO.

Object obj = rs.getObject(index);
if (obj instanceof Array)
{
   obj = ((Array) obj).getArray();
}
returnMap.put(rsmd.getColumnName(index), obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...