Проблема в том, что после отображения ResultSet с <h:dataTable> соединение остается открытым. Если я его закрою, он тоже закроет ResultSet. Я думаю о том, чтобы скопировать данные ResultSet в какую-нибудь комбинацию HashMap/ArrayList. Есть ли хороший способ справиться с этой проблемой?
Как правильно использовать ResultSet с h:dataTable
Ответы (3)
Действительно, вы всегда должны получать и закрывать Connection, Statement и ResultSet в кратчайшей возможной области (желательно уже внутри того же самого блока метода), и вы никогда не должны передавать какой-либо из их вне класса DAO. Вам нужно сопоставить ResultSet с List<Data>, где Data представляет каждую строку таблицы. Вот простой пример того, как сопоставить набор результатов:
List<Data> items = new ArrayList<Data>();
...
while (resultSet.next()) {
Data item = new Data();
item.setColumn1(resultSet.getString("column1"));
item.setColumn2(resultSet.getString("column2"));
items.add(item);
}
...
return items;
Затем вы можете просто использовать его в атрибуте h:dataTable value.
Дополнительные примеры и идеи вы можете найти полезными в одной или обеих следующих статьях:
http://balusc.blogspot.com/2006/06/using-datatables.html
http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html
Удачи.
Пожалуйста, проверьте следующую ссылку: http://www.coderanch.com/t/478265/JSF/java/Displaying-array-data-tables#2585794
Я уверен, что поможет вам решить вашу проблему
Используете ли вы ResultDataSetModel? Если да, обратите внимание, что в javadoc остается Note that the specified ResultSet MUST be scrollable.
Statement stmt=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
Вот полный пример ResultDataSetModel вариант использования.