2012-04-26 3 views
0

Я убираю очень плохо сделанный, большой, webapp. Я не могу сделать все сразу, поэтому я беру его на куски. Одна вещь, которую я хотел бы сделать, - это реализовать класс с функциями, которые принимают SQL-запросы, а затем возвращает коллекцию. Мой план заключается в том, что после этого я позабочусь о том, чтобы я мог ходить по магазинам вокруг базы данных, чтобы заменить этот слой, не нарушая остальную часть webapp.CachedRowSet, ResultSetDynaClass или другая коллекция?

Большая проблема с возвратом ResultSet из функции доступа к базе данных стиля шаблона заключается в том, что я не могу закрыть соединение без отключения ResultSet.

Я был рад найти предложения в этом старом stackoverflow post.

Я прочитал статью, цитированную на CachedRowSet, но я обеспокоен тем, что статья заявила, что ее использование может создать проблему с всасыванием большого количества памяти JVM путем наложения большого количества результатов в себя.

Не было бы альтернативы для Apache ResultSetDynaClass или любой другой коллекции с той же проблемой? Результаты должны быть записаны в память так или иначе. Правильно?

Если бы я использовал ChaedRowSet, ResultSetDynaClass или сборку Java для хранения данных ResultSet, потерял бы эти данные после закрытия ResultSet?

Я использовал HashMaps для хранения отдельных записей из общих функций запросов к базе данных.

Как я могу использовать коллекцию java для хранения нескольких записей без того, что код становится громоздким? Предполагая, что я мог бы, было бы оно более ресурсоэффективным или гибким, чем два других варианта?

Заранее благодарим за любую информацию или идеи.

ответ

1

Поскольку это веб-приложение, вы знаете, когда вам нужно закрыть свой набор результатов: в конце запроса. Вы можете зарегистрировать свои результаты/соединения в области запроса и закрыть их все в конце запроса. Так обрабатывает Cold Fusion (работает поверх Java).

Или вы можете сделать так, как Myna делает и возвращает «материализованную» коллекцию по умолчанию или принимает необязательный манипулятор строки, который будет выполнен против исходного набора результатов. Во втором случае вы можете получить прямой доступ к вещам типа BLOB, которые почти всегда требуют специальной обработки и не являются практичными для простого вложения в коллекцию, и вы знаете, когда rowHandler сделан, чтобы вы могли закрыть набор результатов/соединение.

UPDATE:

Вот простой пример крупным, когда-запроса конечного подхода

public class Query { 
    static public ConcurrentHashMap  openResultSets = new java.util.concurrent.ConcurrentHashMap(); 
    public ResultSet runQuery(String sql) throws SQLException{ 
     //set up connection, run query 
     ResultSet rs = statement.executeQuery(); 
     if (Query.openResults.get(Thread.currentThread().getId()) == null){ 
      Query.openResults.put(Thread.currentThread().getId(),new Vector()) 
     } 
     Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId()) 

     openRs.add(rs); 
     return rs; 
    } 
    public void onRequestEnd(String sql) { 
     Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId()); 
     if (openRS != null){ 
      for (ResultSet rs : openRS.values()){ 
       try{ 
        rs.close(); 
       } catch(Exception e){} 
      } 
     } 
     //do any other request end cleanup of connections, etc 
    } 
} 

//in your servlet 
public class Query extends HttpServlet { 

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ 

     ResultSet rs = Query.runQuery("select * from AWESOME"); 
     //do awesome stuff, maybe load other classes that can run runQuery 

     Query.onRequestEnd(); 
    } 
} 

Это не является идеальным, но я не знаю, какие рамки вы используете. Вероятно, имеет смысл сохранить это в вашем объекте HttpServletRequest с помощью setAttribute()/getAttribute(), но для этого требуется передать запрос каждому методу, который его использует. В любом случае вам просто нужно сохранить массив открытых наборов результатов и закрыть их в конце запроса. Использование какой-то структуры делает эту тонну проще.

+0

Все, что вы написали, это на 100% новое для меня, поэтому я не понимаю ни слова, которое вы сказали. Первый подход, который вы упомянули, звучит наиболее желательным. Можете ли вы опубликовать ссылку на пример и описание? – Steve