|
|
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
Добрый день, я реализовал заполнение таблицы JTable используя структуру ResultSet --> String[][]--> extends JTable. Таблица корректно заполняется, но я столкнулся с рядом вопросов по поддержки актуализации JTable: 1) Как я понимаю, при изменении ячеек таблицы пользователем, я должен менять сам List (саму структуру Java), а затем, например по требованию пользователя и/или по таймеру, передавать ее методу который составит запрос и передаст на сервер. Правильно ли поступать таким способом, или JDBC предоставляет более эффективные способы обновления таблицы? 2) Как продолжение предыдущего вопроса: А, что собственно дальше? Каким образом формировать SQL запрос? Думаю, очищать всю таблицу в БД, и затем создавать новую из данных JTable не очень хорошо. UPDATE использовать тоже не понятно как: ведь изменениям могут быть подвергнуты не только значения, но и сама структура (напр. добавлены новые записи, применена сортировка и т.д.). Думаю, только UPDATE не решит проблему. 3) Так же не понятно как быть, если таблицы была изменена: При изменении таблицы в БД, необходимо изменять данные в JTable. Т.е. нужно запускать какой-то фоновой процесс, который будет следить за изменениями удаленной таблицы, и в случае присутствия таковых - изменять TableModel. Причем, возможна ситуация, когда JTable не "буферизовала" свои изменения, и они затерлись новыми с бд. Как-то выглядит слишком сложно, не изобретаю ли я велосипед? Спасибо. P.S читал официальные маны, например этот http://docs.oracle.com/javase/tutorial/jdbc/basics/jdbcswing.html , но так и не разобрался, как там реализовано обновление таблицы, точнее не нашел описание некоторых методов.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2013, 19:08:33 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
LinuxAwake, Крайне не лишним будет ознакомиться с т.н. проблемой потерянных изменений. Например, тут . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 08:08:35 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
LinuxAwakeДобрый день, я реализовал заполнение таблицы JTable используя структуру ResultSet --> String[][]--> extends JTable. Таблица корректно заполняется, но я столкнулся с рядом вопросов по поддержки актуализации JTable: Можно и без String[][] напрямую читать из ResultSet. LinuxAwake1) Как я понимаю, при изменении ячеек таблицы пользователем, я должен менять сам List (саму структуру Java), а затем, например по требованию пользователя и/или по таймеру, передавать ее методу который составит запрос и передаст на сервер. Правильно ли поступать таким способом, или JDBC предоставляет более эффективные способы обновления таблицы? Вроде только что был массив. Уже List. Читаем JavaDoc к классу ResultSet. Обращаем внимание на константы. Например TYPE_SCROLL_SENSITIVE LinuxAwake2) Как продолжение предыдущего вопроса: А, что собственно дальше? Каким образом формировать SQL запрос? 100500 вариантов. Можно динамически собирать из ResultSet.getMetadata() либо из метаданных конкретной таблицы через Connection. Можно посмотреть методы ResultSet.update*() LinuxAwakeДумаю, очищать всю таблицу в БД, и затем создавать новую из данных JTable не очень хорошо. "Плохо" и "хорошо" это не технические термины. LinuxAwakeUPDATE использовать тоже не понятно как: ведь изменениям могут быть подвергнуты не только значения, но и сама структура (напр. добавлены новые записи, применена сортировка и т.д.). Думаю, только UPDATE не решит проблему. ResultSet имеет методы и для добавления записей. При чем тут сортировка - не очень понятно. LinuxAwake3) Так же не понятно как быть, если таблицы была изменена: Какая из двух таблиц и как изменена? LinuxAwakeПри изменении таблицы в БД, необходимо изменять данные в JTable. ОК. В чем проблема? LinuxAwakeТ.е. нужно запускать какой-то фоновой процесс, который будет следить за изменениями удаленной таблицы, и в случае присутствия таковых - изменять TableModel. А можно TableModel реализовать так, чтобы она всегда читала актуальные данные из базы. LinuxAwakeПричем, возможна ситуация, когда JTable не "буферизовала" свои изменения, и они затерлись новыми с бд. Не понял. LinuxAwakeP.S читал официальные маны, например этот http://docs.oracle.com/javase/tutorial/jdbc/basics/jdbcswing.html , но так и не разобрался, как там реализовано обновление таблицы, точнее не нашел описание некоторых методов.. Смотри. Добрую половину ответов можно было найти в JavaDoc к классу ResultSet. Ну и вообще JDBC tutorial целиком стоило бы прочитать. Много вопросов отпало бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 10:16:42 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczLinuxAwakeПри изменении таблицы в БД, необходимо изменять данные в JTable. ОК. В чем проблема? . Да проблема в том, что я не понимаю как отследить момент изменения удаленной таблицы.. Допустим, я получаю данные из ResSet и передаю в модель таблицы, у которой есть поля String[] colName и String[][] colData. при добавлении вызываю метод обновления таблицы, и таблица отображает данные из модели. Допустим, в модели есть сеттер который обновляет эти массивы, при обновлении JTabble пользователем, и для того, что бы обновить удаленную таблицу, нужно будет составить запрос из данных этих массивов. Но как я отслежу изменения удаленной таблицы? Другими словами, я понимаю что процесс синхровизации будет происходить относительно данных в коллекции, но я не понимаю как заставить удаленную таблицу при изменении изменять эту коллекцию. BlazkowiczА можно TableModel реализовать так, чтобы она всегда читала актуальные данные из базы Хм, насколько я понимаю, то простейшие изменения в JTable повлекут соединения с бд, что сильно скажется на производительности. Или я заблуждаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:53:59 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczLinuxAwakeПричем, возможна ситуация, когда JTable не "буферизовала" свои изменения, и они затерлись новыми с бд. Не понял. . Идея была таковой, пусть синхровизация коллекции и удаленной базы будет проводиться по запросу пользователя. Тогда, существует вероятность, что при изменении удаленной таблицы, изменения пользователя в JTable, которые он еще не отправил в базу, затруться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:59:23 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczLinuxAwake2) Как продолжение предыдущего вопроса: А, что собственно дальше? Каким образом формировать SQL запрос? 100500 вариантов. Можно динамически собирать из ResultSet.getMetadata() либо из метаданных конкретной таблицы через Connection. Можно посмотреть методы ResultSet.update*() . Вы, кстати, неправильно вопрос поняли. Каким образом выполнить запрос я уже знаю, я не понимаю как сформировать запрос,обновляющий только измененную часть JTable, при этом подразумевается что в измененной части могут быть и новые строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 16:03:29 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
LinuxAwakeДа проблема в том, что я не понимаю как отследить момент изменения удаленной таблицы.. А не нужно "следить". Пользователю, в большинстве случаев, всё равно поменялась ли строка в базе, пока он не захочет посмотреть на эту строку. Поэтому для начала вам будет достаточно того что данные будут вычитываться из ResultSet. LinuxAwakeДопустим, я получаю данные из ResSet и передаю в модель таблицы, у которой есть поля String[] colName и String[][] colData. при добавлении вызываю метод обновления таблицы, и таблица отображает данные из модели. Допустим, если мы выкинем String[][] colData, то получим чтение актуальных данных из базы, а не из массива (при условии правильного типа ResultSet) LinuxAwakeДопустим, в модели есть сеттер который обновляет эти массивы, при обновлении JTabble пользователем, и для того, что бы обновить удаленную таблицу, нужно будет составить запрос из данных этих массивов. Можно и без непосредственно запроса, а через JDBC API. Я уже указал выше как. LinuxAwakeНо как я отслежу изменения удаленной таблицы? На сколько удаленной? Если у вас база данных находится далеко за пределами LAN, то непосредственная работа через JDBC вообще не лучший выход. LinuxAwakeДругими словами, я понимаю что процесс синхровизации будет происходить относительно данных в коллекции, но я не понимаю как заставить удаленную таблицу при изменении изменять эту коллекцию. Массив и коллекция это не одно и тоже. Почему вам принципиально из базы обновить "коллекцию", а не из GUI перечитать наиболее актуальные данные? Стоит так же подумать, а для чего эта актуальность-то? Юзер видит данные на какой-то момент плюс те изменения, что он делает. Если другой юзер делает изменения в базе, то первому, в большинстве случаев, всё равно увидит ли он сейчас, или через минуту. Поэтому такие нюасны уже вытекают из требований, которые, для своего проекта, вы знаете, а мы нет. LinuxAwakeХм, насколько я понимаю, то простейшие изменения в JTable повлекут соединения с бд, что сильно скажется на производительности. Или я заблуждаюсь? Всё зависит от того как сделаете. В простейшей 2-tier системе с БД в локальной сети, можно спокойно использовать скролируемый обновляемый курсор. И через него перечитывать и обновлять данные. Если БД наглухо удаленная, ту лучше делать 3-tier систему с постраничным считыванием. Но тут уже актуализация даннных - соврешенно отдельный вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 16:11:16 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВсё зависит от того как сделаете. В простейшей 2-tier системе с БД в локальной сети, можно спокойно использовать скролируемый обновляемый курсор. И через него перечитывать и обновлять данные. Если БД наглухо удаленная, ту лучше делать 3-tier систему с постраничным считыванием. Но тут уже актуализация даннных - соврешенно отдельный вопрос. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 16:47:30 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
LinuxAwakeИдея была таковой, пусть синхровизация коллекции и удаленной базы будет проводиться по запросу пользователя. Тогда, существует вероятность, что при изменении удаленной таблицы, изменения пользователя в JTable, которые он еще не отправил в базу, затруться Для того чтобы этого избежать, нужно вводить блокировки, как в базе, так и на уровне UI. Опять же, исходить нужно из требований к проекту. Реализовать можно и отложенное обновление. Только реализацию уже будет другая. Всё зависит от требований. То что вы приниматесь за подход А, только потому что не знаете как решить проблемы подхода Б, не значит что какой-то из этих подходов не возможен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 17:00:07 |
|
||
|
Вопросы синхровизации JTable с бд.
|
|||
|---|---|---|---|
|
#18+
LinuxAwakeВы, кстати, неправильно вопрос поняли. Как спросили, так и поняли. LinuxAwakeКаким образом выполнить запрос я уже знаю, я не понимаю как сформировать запрос Я же говорю. 100500 способов. Можно дергать методы ResultSet, можно написать свой query билдер. Можно взять готовый. LinuxAwake,обновляющий только измененную часть JTable, Здесь мы подразумеваем что мы не используем ResultSet API по какой-то загадочной причине и не коммитим изменения сразу, а чего-то ждем, отмечая записи dirty флагом. LinuxAwakeпри этом подразумевается что в измененной части могут быть и новые строки. Вот этого я вообще не понимаю. Такая мега проблема что о ней несколько раз нужно писать? if(новая строка) doInsert() else doUpdate(); - мега сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 17:03:54 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38353237&tid=2128887]: |
0ms |
get settings: |
16ms |
get forum list: |
20ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 286ms |
| total: | 447ms |

| 0 / 0 |
