Управление глобальным подключением к БД в C ++ - PullRequest
1 голос
/ 16 марта 2012

Можно безопасно сделать следующее:

У меня есть библиотека 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 

В документации сказано, что этот вызов должен быть сделан до того, как будет установлено первое соединение. Каков наилучший способ убедиться в этом в коде с несколькими потенциальными сайтами вызовов для открытия соединения. Что если этого не произойдет? Будет ли выдана ошибка или пул просто не будет включен.
Кроме того, какие инструменты доступны для контроля количества открытых соединений с БД?

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

большинство клиентских библиотек поддерживают пул соединений .так что открывайте новое соединение, просто выберите существующее соединение из пула.

0 голосов
/ 16 марта 2012

Синглтон может решить эту проблему на любом языке ОО. В C / C ++ вы также можете использовать статическую переменную (в случае, если вы не используете стиль кодирования чистого OO).

...