Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по дизайну части API, с учётом области видимости 
:(
    Опции темы
simanyay
Дата 8.7.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



У меня есть класс, который исполняет SQL запросы к базе и, в случае необходимости, возвращает ResultSet. Объект Connection я вывел в область видимости класса, а вот объект Statement попробовал заключить в метод. При этом возникла проблема с тем, что возвращенный ResultSet после выхода из метода и, соответственно, закрытия и удаления Statement переходит в состояние isClosed() == true. Следовательно программа работает неверно.

У меня в голове крутятся два пути решения проблемы:
1. Вытащить Statement в область видимости класса и перед каждым новым выполнением запроса закрывать объект и создавать новый. Однако тут могут возникнуть проблемы с тем, что пользователю могут понадобится несколько ResultSet'ов одновременно и, соответственно, после очередного вызова метода runQuery(...) старый ResultSet поставит кеды в угол.

2. Создать свой класс, представляющий структуру данных в таблице, т.е. по сути являющийся аналогом ResultSet, но независимым от других объектов. Тут проблем не вижу, кроме нагромождения API и уменьшением скорости выполнения.

Заранее спасибо.

- сим

P.S. В приложении к посту лежит графическое представление класса MySQLDriver. Специально набросал для поста, поэтому там не весь функционал класса, а лишь те части, которые необходимы для решения данной проблемы.

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  mysqldriver_uml.gif 2,09 Kb


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
anonymouse
Дата 8.7.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 18.8.2004

Репутация: нет
Всего: 1



Ну вообше то с помошью одного коннекта можно сдлеать много statement. Соответственно для каждого запроса нужно делать новый статемент. А данные, оссобенно если они большие, надо хранить в буфере.
--------------------
Много чего интересного...
PM MAIL   Вверх
tux
Дата 8.7.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Если объем данных, возвращаемых в ResultSet, относительно невелик, будет целесообразно использовать библиотеку RowSet от Sun (в SE 5.0 входит в основной API), в частности реализацию интерфейса javax.sql.rowset.CachedRowSet, которая может кэшировать содержимое ResultSet в новом объекте, который не связан ни с каким Statement, таким образом, автоматически решится проблема с его закрытием. Если используется JDK 1.4, то библиотеку качать здесь - http://java.sun.com/products/jdbc/download.html#rowset1_0_1. В архиве есть документация. На всякий случай еще статья об использовании CachedRowSet - http://www.onjava.com/pub/a/onjava/2004/06...chedrowset.html. Понимаю, что вопрос несколько не о том, но тем не менее... Может быть кому-то пригодится.
P.S. Кэшировать можно не только выборки "для чтения", но и обновляемые данные.

Это сообщение отредактировал(а) tux - 8.7.2005, 17:26
PM MAIL Skype GTalk Jabber YIM   Вверх
simanyay
Дата 8.7.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



tux, сейчас же посмотрю. Спасибо.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
simanyay
Дата 8.7.2005, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



Я немного не врубился, но CachedRowSet это же интерфейс? Я в пакете javax.sql.rowset вижу только два класса. Это BaseRowSet и RowSetMetaDataImpl.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
tux
Дата 9.7.2005, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Извиняюсь, насчет документации в архиве это я погорячился. Спецификацию API можно скачать здесь - http://jcp.org/aboutJava/communityprocess/...r114/index.html. В javadoc к javax.sql.rowset.CachedRowSet написано как работать с реализацией интерфейса. Хотя в принципе и в статье написано тоже самое.
CachedRowSet - интерфейс, но в rowset.jar есть его реализация - com.sun.rowset.CachedRowSetImpl. А примерно такой код
Код

ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);

должен привести к нужному результату - кэшированным данным из ResultSet в crs.
Такой способ еще часто используют для того, чтобы передавать результаты выполнения запроса при удаленных вызовах объектов.
PM MAIL Skype GTalk Jabber YIM   Вверх
simanyay
Дата 9.7.2005, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



tux, всё получилось. Спасибо тебе огромное!

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  junit.jpg 48,33 Kb


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.