Можно безопасно сделать следующее:
У меня есть библиотека C ++, которая подключается к базе данных SQL в различных точках. Я хотел бы, чтобы во всех этих точках было доступно глобальное соединение. Можно ли это сделать? Есть ли стандартный шаблон для этого. Я думал о сохранении соединения в синглтоне.
Edit:
Предположим, у меня есть следующий интерфейс для подключения.
class Connection {
public:
Connection();
~Connection();
bool isOpen();
void open();
}
Я хотел бы реализовать следующий интерфейс:
class GlobalConnection {
public:
static Connection & getConnection() {
static Connection conn_;
if (!conn_.isOpen())
conn_.open();
return conn_;
}
private:
GlobalConnection() {};
Connection conn_;
};
У меня есть две проблемы с вышеизложенным. Во-первых, getConnection не является потокобезопасным, а во-вторых, я не уверен насчет уничтожения статического ресурса. Другими словами, я гарантирую, что соединение будет закрыто (т.е. будет вызван его деструктор).
Для записи, сам класс соединения предоставляется библиотекой SQLAPI ++ (хотя это не очень актуально).
РЕДАКТИРОВАТЬ 2: После некоторых исследований кажется, что, хотя SQLAPI непосредственно поддерживает пул, его можно использовать для включения пула соединений через средства ODBC через вызов
setOption("SQL_ATTR_CONNECTION_POOLING") = SQL_CP_ONE_PER_DRIVER
В документации сказано, что этот вызов должен быть сделан до того, как будет установлено первое соединение. Каков наилучший способ убедиться в этом в коде с несколькими потенциальными сайтами вызовов для открытия соединения. Что если этого не произойдет? Будет ли выдана ошибка или пул просто не будет включен.
Кроме того, какие инструменты доступны для контроля количества открытых соединений с БД?