![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| anonymouse |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 18.8.2004 Репутация: нет Всего: 1 |
Ну вообше то с помошью одного коннекта можно сдлеать много statement. Соответственно для каждого запроса нужно делать новый статемент. А данные, оссобенно если они большие, надо хранить в буфере.
--------------------
Много чего интересного... |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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 |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 3 Всего: 36 |
tux, сейчас же посмотрю. Спасибо.
-------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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 в crs. Такой способ еще часто используют для того, чтобы передавать результаты выполнения запроса при удаленных вызовах объектов. |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |