Comments 20
http://stackoverflow.com/questions/12528199/libpqxx-connection-pool
Он вроде даже когда-то был в этой библиотеке:
http://bazaar.launchpad.net/~jtv/libpqxx/connection-pool/view/head:/src/connection_pool.cxx
Can I have two or more simultaneous transactions?http://pqxx.org/development/libpqxx/wiki/FaqFeatures
Not within the same connection. Even if you use nested transactions (see the subtransaction class), a connection is always dealing with just one transaction at a time. Of course you can create a new transaction on the same connection once the previous one has completed.
If you want to have multiple concurrent transactions, let them work on different connections. An easy way to do this is to set up a connection pool: create a bunch of lazyconnection objects, all initialized with the same connection string. Connections of this type will set themselves up only when they are actually used, so there is no big cost to creating more than you're going to use.
Документация была гораздо хуже. С libpq работать одно удовольствие, там весьма простой Си с очень хорошими примерами.
На STL думаю проще было бы pool организовать
А я его на чём реализовал? Что здесь не из STL?
std::mutex m_mutex;
std::condition_variable m_condition;
std::queue<std::shared_ptr<PGConnection>> m_pool;
Мне нужен был 9.5 c UPSERT, и на тот момент libpqxx не имел этой возможности.А сейчас он там разве есть?
Мне pqxx когда-то понравился, что он С++ и работал просто реактивно, по примерам разобрался как работает. Опять же lazy_connection.
Чем pgbouncer или pgpool не подошел?
Мне казалось, что pgpool и иже — это штуки, ставящиеся возле сервера БД (между сервером и многими клиентами) и не решающие проблем, решаемых в статье (дорогое установление соединения от клиента к удалённому серверу).
В общем, мне кажется, лучше всегда иметь собственный пул соединений в приложении.
Сразу говорю я не программер, админ
На первый взгляд:
— надо объединять в пул не все сессии, а какое-то количество, по превышении порога открывать второй коннекшин
— надо иметь механизм мониторинга коннектов, нужна какая-то статистика подключений
— надо выставлять лимит в количество подключений — обязательно, иначе постгрес можно легко уложить какой-нибудь один лок
Это все есть в пгбаунсере и еще много чего другого
— надо объединять в пул не все сессии, а какое-то количество, по превышении порога открывать второй коннекшинНе обязательно, если помнишь, что все действия нужно выполнить в одном логическом блоке. Для какого-нибудь RESTful сервиса будет прекрасно работать.
— надо иметь механизм мониторинга коннектов, нужна какая-то статистика подключенийЭто надо. Реализовать несложно добавив несколько строчек к вышеуказанному коду, и добавив настройки для удобства.
— надо выставлять лимит в количество подключений — обязательно, иначе постгрес можно легко уложить какой-нибудь один лок
Тем более пгбаунсер очень нетяжелая штука, если у него еще конфиги были не в виндовозных .ini-файлах, а в привычных .conf-ах — вообще бы было чудесно
да много чего можно сделать — просто стоит ли на это тратить время, если есть готовый продукт. Вы же не писали библиотеку обращения к постгресу — а взяли готовую, почему не взять готовое приложение.Да потому, что на уровне приложения он не сработает. В многопоточном приложении необходимы раздельные объекты connection и pgBouncer здесь не поможет. Он может разве, что оптимизировать количество процессов postgres — физических подключений. Только libpq об этом ничего знать не будет.
Ну вот не понимаю зачем изобретать велосипед
Во всех наших проектах мы стараемся делать как можно проще и обычно одно приложение ходит в базу под одним и тем же пользователем, так что все подключения в пуле по факту одинаковые. И когда какой-то поток хочет поработать с базой, он просит в пуле любой свободный коннект или ждёт до 5 секунд, пока таковой освободится, делает, что ему надо с базой и возвращает соединение в пул. Количество соединений в пуле ограничивается эмпирически (в зависимости от того, сколько в процентах времени в среднем код проводит, работая с базой, а сколько — с чем-то другим), но в простых случаях просто ставится равным количеству потоков.
Для этого (и для безопасности) pgBouncer создает пулы per user.
Выложите, пожалуйста, код на GitHub / BitBucket / GitLab.com — гораздо проще и смотреть и компилировать.
PostgreSQL libpq connection pool