powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread-safe работа с БД через jdbc
16 сообщений из 16, страница 1 из 1
Thread-safe работа с БД через jdbc
    #34387404
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть большое количество однотипных потоков, которые живут недолго время и выполняют две задачи:
1) Отправляют XML-RPC запрос
2) Данные из ответа на XML-RPC запрос сохраняют в БД (Postgresql 8.1)

Проблему я вижу в следующем.

Все потоки используют один и тот же экземпляр класса Connection для создания Statement и выполнения запроса на insert, какие могут быть последствия? Интересно распишите плиз кто знает.

Пути решения я вижу следующие, но не знаю какой выбрать:
1) Объявить метод который выполняет сохранение как synchronized, это вроде проблему решает но плохо, т.к. остальные потоки будут блокироватся, пока один сохраняет - в моем случае недопустимо
2) Использовать пул коннектов, например proxool, и дать каждому потоку свой экземпляр Connection
3) Организовать очередь. Т.е. поток помещает в результат в очередь и тут же завершается, а далее отдельный трэд потихоньку вытаскивает элементы из очереди и кладет в БД.

Как лучше сделать и почему?
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34387449
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooluser
Как лучше сделать и почему?
3. - Что может быть проще
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34387460
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант 4
первый тред: XML-RPC запрос->ответ в очередь
второй тред: ответ из очереди в бд
и никаких пулов ненадо.
зы
доступ к очереди синхронизировать просто один читатель-один писатель
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34387474
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalexakaВариант 4 читать: Вариант 3 конешно :)
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34387503
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага спасибо за ответы :)

а если не синхронизировать ничего и дать всем потокам один экземпляр Connection какие грабли можно поиметь?
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34387508
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooluser...
Все потоки используют один и тот же экземпляр класса Connection для создания Statement и выполнения запроса на insert, какие могут быть последствия? Интересно распишите плиз кто знает.
...
Весеннее обострение , што ли...
По вопросу что лучше. Протестируйте.
Я не удивлюсь если 3-й вариант не будет лучшим в вашем случае (BTW, что для вас "лучше"? вначале определитесь).
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34387935
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно я все протестирую и проверю...

Мне было интересно мнение народа, вот я и пришел на форум, и ничего страшного в этом не вижу :)
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388354
carper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Организовать очередь. Т.е. поток помещает в результат в очередь и тут же завершается, а далее отдельный трэд потихоньку вытаскивает элементы из очереди и кладет в БД."

Тут не все просто, если я правильно понял то, что Вы предлагаете, то поток, положивший результат в очередь "не имеет права" считать, что результат действительно записан в базу, т.к. еще всякое может случиться.
Это допустимо?

Любой сбой в очереди, при общении с самой базой, может потребовать неоднозначной реакции в зависимости от причин сбоя, важности данных и, главное, насколько сам поток готов к обработке такого сбоя и не зависит ли это от времени сбоя.

Запись пакетов данных, конечно лучше чем одиночная, но и любой сбой в пакете потребует четко продуманной логики дальнейших действий. В общем и целом, устойчивости системе это не добавит.

Я не знаю как обстоят дела с Postgress, но в том же Oracle не так просто получить проблемы с производительностью чтобы это начало сказываться на приложении - вы уверены, что у вас так много потоков и так часты запросы на обновления, что это РЕАЛЬНО приведет к деградации производительности СУБД?

В общем-то вариант я не отвергаю, но при важных данных я бы рассмотрел вариант synchronized метода в отдельной триаде, пишущего на локальный диск (циклическая очередь из двух-трех файлов), т.е. имеем своеобразную самопальную транзакционную систему. Легко масшатабируется возможностью запуска нескольких триад.
К этим файлам цепляется демон, который читает данные из локального файла/ов и пишет в базу пакетами. (Думаю хватит одного).

Вариант не намного отличающийся от пула соединений, но переносит немалую часть нагрузки на клиента, возможно это будет более приемлемо.
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388391
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоп. Если мы не будем использовать пул соединений, то БД всегда будет думать, что к нему обращается только 1 поток, через 1 коннекшен. Значит она не сможет правильно оптимизировать свою работу. Так? Может, она захочет паралельно выполнять запросы, если имеются несколько коннекшинов?
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388400
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может пул и не так сложно организовать например с помощью этого ?
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388408
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carper
...
Я не знаю как обстоят дела с Postgress, но в том же Oracle не так просто получить проблемы с производительностью чтобы это начало сказываться на приложении - вы уверены, что у вас так много потоков и так часты запросы на обновления, что это РЕАЛЬНО приведет к деградации производительности СУБД?

PostgreSQL достаточно продвинутая и должна сама отпахать все эти проблемы, однако. Чоб я добавил, это некий MAX_INSERT параметер. Кажный, кто начинает писать, увеличивает счетчик. Те, кто закончил - уменьшает его. Если счетчик дошел до MAX_INSERT, просто ждем или отваливаем ...
Это самый простой вариант (свалить типа все на базу). С ораклом я так бы и поступил. С Postgre можно тоже попробовать и посмотреть.
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388576
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carper"Организовать очередь. Т.е. поток помещает в результат в очередь и тут же завершается, а далее отдельный трэд потихоньку вытаскивает элементы из очереди и кладет в БД."

Тут не все просто, если я правильно понял то, что Вы предлагаете, то поток, положивший результат в очередь "не имеет права" считать, что результат действительно записан в базу, т.к. еще всякое может случиться.
Это допустимо?

Да, в моем случае это действительно допустимо, т.к. по сути это вспомогательная утилита и потоку действительно достаточно действовать на уровне поместил данные для сохранения в очередь или еще куда и отвалился. Ну и плюс вероятность что случится что то с СУБД или сетью очень мала.

А вообще вы конечно интересный аспект подняли, подумаю на досуге обязательно над этим, единственное что вариант с самопальными файлами на диске мне априори не нравится, все таки работа с данными - дело СУБД.
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388587
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostgreSQL достаточно продвинутая и должна сама отпахать все эти проблемы, однако. Чоб я добавил, это некий MAX_INSERT параметер. Кажный, кто начинает писать, увеличивает счетчик. Те, кто закончил - уменьшает его. Если счетчик дошел до MAX_INSERT, просто ждем или отваливаем ...
Это самый простой вариант (свалить типа все на базу). С ораклом я так бы и поступил. С Postgre можно тоже попробовать и посмотреть.

Как то развлекался в postgresql следующим образом, делал простенькую табличку на 5 полей целых и строковых типов, делал питоновский скрипт который в 40 потоков insert'ил данные в эту табличку, работало это дело по нескольку часов, абсолютно все insert'ы проходил без проблем.

Сейчас написал и подумал...почему то когда делал это тестовый скрипт на питоне абсолютно не задумывался над проблемой thread-safe и прочего. Там помоему был один общий конекшн на всех, и ведь отрабатывало нормально.
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388607
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 carper

Еще раз прочитал ваше сообщение. Вообщем получается что потоку достаточно отдать данные для дальнешей обработки куда то, что с ними дальше происходит его не волнует. А вот уже трэд обслуживающий очередь, в случае ошибок при сохрании данных, должен просто повторять до победного конца (возможно надо все таки лимитировать количество попыток).

Вроде как при таком подходе будет гарантия сохрания данных, ну конечно если JVM не упадет.
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34388736
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые, может тогда и JMS прикрутить?
...
Рейтинг: 0 / 0
Thread-safe работа с БД через jdbc
    #34389268
carper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cooluser2 carper

Еще раз прочитал ваше сообщение. Вообщем получается что потоку достаточно отдать данные для дальнешей обработки куда то, что с ними дальше происходит его не волнует. А вот уже трэд обслуживающий очередь, в случае ошибок при сохрании данных, должен просто повторять до победного конца (возможно надо все таки лимитировать количество попыток).

Вроде как при таком подходе будет гарантия сохрания данных, ну конечно если JVM не упадет.


Увы, гарантию может дать только сама база. :)
Если сохранность данных не столь важна, то, разумеется, можно передавать данные в буфер сервисного потока (можно нескольких, в тяжелых случаях), который единообразным способом пытается их записать.
Я бы дополнительно сделал эти данные адресными, снабдив каждую строку в буфере GUID потока, их туда пославшего.

Скорее всего алгоритм должен предусматривать несколько попыток записи (очень немного иначе теряется всякий смысл использования дополнительного служебного потока - вы в базу напрямую быстрее запишете), с сбросом дефектных данных либо в лог, либо вообще к такой-то матери.

Тут возникает один незатык - мы априори считаем, что производительности самой базы не хватает, чтобы обеспечить прямую запись данных из потоков, если мы используем буфер, то мы можем поднять производительность в основном за счет пакетной записи (я так понимаю, что все потоки пишут в одно и то же место данные одинаковой структуры?).
Так?
Но тогда узким местом становится сам буфер и пакетная запись, т.е. проблема никуда не исчезает, она просто несколько отодвигается, плюс возникает проблема с оперативкой в которой должен лежать сам этот буфер, она ведь тоже не резиновая.

Опять же, я не знаю особенностей Postgresql, но Oracle умеет решать эту проблему - она как раз использует и демоны и запись во временные файлы и их очередь.
Т.е. стоит ли городить огород, чтобы своими силами реализовать то, что уже есть?

Если количество потоков (точнее частота записи) нешуточное, то непрерывно что-то дергать в базе, действительно, варварство, а если нет, то может ну его?

P.S.
В принципе, я бы тут думал не над техническим решением, а над тем почему надо писать в базу столько данных, что она начинает аж захлебываться, причем не очень важно чтобы записались все данные.
Что-то тут не так. Может быть нужны какие-то краткосрочные тренды, для вывода оперативной информации с совсем даже не частой записью некоторых итоговых, усредненных, или как-то еще обсчитанных, данных?
Зачем вам тысячи и миллионы строк, для которых даже не очень важно все ли они записаны?
Что вы с ними дальше-то делать собираетесь?
Очевидно, что просматривать их никто не будет, будут делаться какие-то обобщающие выборки.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread-safe работа с БД через jdbc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]