[odb-users] safe usage odb connection pool in multi threaded environment (odb 2.4.0)

Пустовалов Дмитрий pustovalovdmit at gmail.com
Fri Apr 28 04:23:13 EDT 2017


Hi!

I want to figure out a proper way to manage database connection pool
assuming I want to use connection in different threads.

As far as I understand I should do it like this:

static constexpr auto max_connections = 20;

// 1) create connection pool

auto pool = std::make_unique<odb::mysql::connection_pool_factory>(max_connections);

// 2) bind it to database passing connection pool to odb::database constructor

auto db = std::make_unique<odb::mysql::database>(user, password,
db_name, host, 0, nullptr, "utf8", 0, std::move(pool));

// 3) get available connection_ptr from pool

auto conn = db->connection();

// 4) use connection_ptr (possibly on other thread)

std::thread t([&conn]()

{

    auto& db = conn1->database();

    odb::transaction t{conn1->begin()};

    db.load<persistent_foo>(1);

    t.commit();

});


Is there a right way to accomplish my goal?


I have few doubts in correctness and safety of code in lambda passed to thread:


1) When I pass transaction_impl (result of odb::connection::begin) to
odb::transaction constructor does queries work on that connection not
on some default odb::database connection

2) If I work directly with odb::connection assigned to connection pool
does all queries work on one single default (first created?)
connection from this pool.

3) Is it safe to use odb::database object concurrently without mutex
protection if I get reference to it from connection (from
odb::connection::database function). I mean I need odb::database
interface in different threads, plain query interface of
odb::conenction is not enough.


Thanks in advance!


More information about the odb-users mailing list