Как работать через одно соединение с БД в многопоточном режиме?

Valior

Новичок
Как работать через одно соединение с БД в многопоточном режиме?

Как, я думаю, вы уже знаете для работы с PostgreSQL сначала необходимо установить соединение с базой данных, затем используя данное соединение можно отправлять запросы. До меня уже была написана программа, в которой использовалось несколько потоков, в каждом из которых создавалось такое соединение, записывались данные в базу и соединение закрывалось. Эти потоки были итерационные в результате чего вызывались очень много раз. Но постоянное соединение в каждом из них и разъединение расточительство. В итоге руководитель поручил мне во-первых проверить возможно ли "это" и если возможно, то программу переписать.

Что именно нужно? Переписать программу так чтобы в главном потоке программы мы создавали одно подключение к бд и в последствии передавали его параметры во все потоки, где используя его, заносили данные в базу. Закрывать соединение с базой нужно уже после выполнения всех потоков.

Скажите! Это хотя бы возможно? Потому как мой руководитель сказал, что он слышал о том что эту возможность добавили в версии 8.3, но он не уверен. Вот и дал поручение мне проверить. Я подтверждения его слов в интернете пока так и не нашёл.

Ну и если это возможно, не могли бы вы привести самый простенький пример такого кода !?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Для начала осторожно поинтересуюсь: а как вы в похапэ реализуете потоки?
 

Alexandre

PHPПенсионер
Для начала осторожно поинтересуюсь: а как вы в похапэ реализуете потоки?
наверно он нашел заветное слово PCNTL, но не обратил на замечание...
Потому как мой руководитель сказал, что он слышал о том что эту возможность добавили в версии 8.3, но он не уверен
слышал звон да не знает где он...
меняй руководителя в таком случае.

-~{}~ 07.10.09 10:40:

Но постоянное соединение в каждом из них и разъединение расточительство.
и на сколько это расточительно??? замеры делали?
возможно проблема кроется в другом.
 

phprus

Moderator
Команда форума
Valior
Но постоянное соединение в каждом из них и разъединение расточительство
Если упираешься в это, то используй pgbouncer в качестве прокси между приложением и СУБД. Он будет держать нужное количество коннектов с БД, а твое приложение будет подключаться к нему, таким образом экономя время на инициализацию процесса БД.

Alexandre
и на сколько это расточительно??? замеры делали?
Достаточно сильно если используется что-то, что требует тяжелой инициализации. К примеру это FTS. Разница между первым запросом с использованием полнотекстового поиска и последующими запросами у меня составляла 10-20 раз (на относительно небольшом размере данных, так что время поиска было малым по сравнению с временем парсинга словарей).
 

Alexandre

PHPПенсионер
phprus мало что понял из загадочной аббревиатуры FTS, но причем здесь многопоточность и как она вяжется с пхп.
 

phprus

Moderator
Команда форума
Alexandre
FTS == Full Text Search - встроенный полнотекстовый поиск в Postgresql. Я же вроде написал дальше про полнотекстовый поиск, но судя по всему написал не понятно.

Многопоточность здесь не причем и в PHP ее нет. Я это знаю.
Но автор темы указал, что соединения с БД у него часто закрываются и открываются новые, а соединение с postgresql может быть операцией довольно тяжелой. По этому я и посоветовал ему pgbouncer, как возможный вариант решения частых коротких подключений.

Кстати, я так и не понял, а при чем здесь PHP, с учетом того, что Valior утверждает, что у него УЖЕ есть многопоточная программа, которая использует postgresql, НО он нигде не пишет что она написана на PHP??
 

Alexandre

PHPПенсионер
Кстати, я так и не понял, а при чем здесь PHP, с учетом того, что Valior утверждает, что у него УЖЕ есть многопоточная программа, которая использует postgresql
возможно подумали из названия форума.
 

Valior

Новичок
PHP здесь не причём. Вопрос чисто из области SQL, мол с Postgres это реализовать можно или нет. Программа написанная на Delphi.

phprus
спасибо, попробую продвинуться в этом направлении.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Valior
PHP здесь не причём. Вопрос чисто из области SQL, мол с Postgres это реализовать можно или нет.
Причём здесь, [нецензурно], SQL? Вопрос-то о работе с клиентскими библиотеками.

Товарищ phprus дал правильный совет, на самом деле. Потому что работать в нескольких потоках одновременно с одним соединением точно не получится.
 
Сверху