mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 09:32:06 +00:00
translated comments for mysqlxx Connection adn Pool
This commit is contained in:
parent
cfdbcb7fde
commit
116c889b42
@ -18,9 +18,9 @@ namespace mysqlxx
|
||||
{
|
||||
|
||||
|
||||
/** Для корректной инициализации и деинициализации MySQL библиотеки.
|
||||
* Обеспечивает единственный и thread-safe вызов mysql_library_init().
|
||||
* Использование:
|
||||
/** LibrarySingleton is used for appropriate initialisation and deinitialisation of MySQL library.
|
||||
* Makes single thread-safe call of mysql_library_init().
|
||||
* Usage:
|
||||
* LibrarySingleton::instance();
|
||||
*/
|
||||
class LibrarySingleton : public ext::singleton<LibrarySingleton>
|
||||
@ -32,25 +32,29 @@ private:
|
||||
};
|
||||
|
||||
|
||||
/** Соединение с MySQL.
|
||||
* Использование:
|
||||
* mysqlxx::Connection connection("Test", "127.0.0.1", "root", "qwerty", 3306);
|
||||
/** MySQL connection.
|
||||
* Usage:
|
||||
* mysqlxx::Connection connection("Test", "127.0.0.1", "root", "qwerty", 3306);
|
||||
* std::cout << connection.query("SELECT 'Hello, World!'").store().at(0).at(0).getString() << std::endl;
|
||||
*
|
||||
* Или так, если вы используете конфигурацию из библиотеки Poco:
|
||||
* Or with Poco library configuration:
|
||||
* mysqlxx::Connection connection("mysql_params");
|
||||
*
|
||||
* Внимание! Рекомендуется использовать соединение в том потоке, в котором оно создано.
|
||||
* Если вы используете соединение, созданное в другом потоке, то вы должны перед использованием
|
||||
* вызвать функцию MySQL C API mysql_thread_init(), а после использования - mysql_thread_end().
|
||||
* Or using socket:
|
||||
* mysqlxx::Connection connection("Test", "localhost", "root", "qwerty", 0, "/path/to/socket/file.sock");
|
||||
*
|
||||
* Attention! It's strictly recommended to use connection in thread where it was created.
|
||||
* In order to use connection in other thread, you should call MySQL C API function mysql_thread_init() before and
|
||||
* mysql_thread_end() after working with it.
|
||||
*/
|
||||
class Connection : private boost::noncopyable
|
||||
{
|
||||
public:
|
||||
/// Для отложенной инициализации.
|
||||
/// For delayed initialisation
|
||||
Connection();
|
||||
|
||||
/// Создать соединение.
|
||||
/// Creates connection. Either port either socket should be specified.
|
||||
/// If server is localhost and socket is not empty, than socket is used. Otherwise, server and port is used.
|
||||
Connection(
|
||||
const char * db,
|
||||
const char * server,
|
||||
@ -61,14 +65,13 @@ public:
|
||||
unsigned timeout = MYSQLXX_DEFAULT_TIMEOUT,
|
||||
unsigned rw_timeout = MYSQLXX_DEFAULT_RW_TIMEOUT);
|
||||
|
||||
/** Конструктор-помошник. Создать соединение, считав все параметры из секции config_name конфигурации.
|
||||
* Можно использовать, если вы используете Poco::Util::Application из библиотеки Poco.
|
||||
*/
|
||||
/// Creates connection. Can be used if Poco::Util::Application is using.
|
||||
/// All settings will be got from config_name section of configuration.
|
||||
Connection(const std::string & config_name);
|
||||
|
||||
virtual ~Connection();
|
||||
|
||||
/// Для отложенной инициализации или для того, чтобы подключиться с другими параметрами.
|
||||
/// Provides delayed initialization or reconnection with other settings.
|
||||
virtual void connect(const char * db,
|
||||
const char * server,
|
||||
const char * user,
|
||||
@ -82,11 +85,11 @@ public:
|
||||
{
|
||||
Poco::Util::LayeredConfiguration & cfg = Poco::Util::Application::instance().config();
|
||||
|
||||
std::string db = cfg.getString(config_name + ".db", "");
|
||||
std::string server = cfg.getString(config_name + ".host");
|
||||
std::string user = cfg.getString(config_name + ".user");
|
||||
std::string password = cfg.getString(config_name + ".password");
|
||||
unsigned port = cfg.getInt(config_name + ".port", 0);
|
||||
std::string db = cfg.getString(config_name + ".db", "");
|
||||
std::string server = cfg.getString(config_name + ".host");
|
||||
std::string user = cfg.getString(config_name + ".user");
|
||||
std::string password = cfg.getString(config_name + ".password");
|
||||
unsigned port = cfg.getInt(config_name + ".port", 0);
|
||||
std::string socket = cfg.getString(config_name + ".socket", "");
|
||||
|
||||
unsigned timeout =
|
||||
@ -102,19 +105,19 @@ public:
|
||||
connect(db.c_str(), server.c_str(), user.c_str(), password.c_str(), port, socket.c_str(), timeout, rw_timeout);
|
||||
}
|
||||
|
||||
/// Было ли произведено соединение с MySQL.
|
||||
/// If MySQL connection was established.
|
||||
bool connected() const;
|
||||
|
||||
/// Отсоединиться от MySQL.
|
||||
/// Disconnect from MySQL.
|
||||
void disconnect();
|
||||
|
||||
/// Если соединение утеряно - попытаться восстановить его. true - если после вызова соединение есть.
|
||||
/// Tries to reconnect if connection was lost. Is true if connection is established after call.
|
||||
bool ping();
|
||||
|
||||
/// Создать запрос. Вы можете сразу указать его, передав строку, или заполнить потом.
|
||||
/// Creates query. It can be set with query string or later.
|
||||
Query query(const std::string & str = "");
|
||||
|
||||
/// Получить объект MYSQL из C API.
|
||||
/// Get MySQL C API MYSQL object.
|
||||
MYSQL * getDriver();
|
||||
|
||||
private:
|
||||
|
@ -16,23 +16,22 @@
|
||||
namespace mysqlxx
|
||||
{
|
||||
|
||||
/** Пул соединений с MySQL.
|
||||
* Этот класс имеет мало отношения к mysqlxx и сделан не в стиле библиотеки. (взят из старого кода)
|
||||
* Использование:
|
||||
* mysqlxx::Pool pool("mysql_params");
|
||||
*
|
||||
* void thread()
|
||||
* {
|
||||
* mysqlxx::Pool::Entry connection = pool.Get();
|
||||
* std::string s = connection->query("SELECT 'Hello, world!' AS world").use().fetch()["world"].getString();
|
||||
* }
|
||||
*
|
||||
* TODO: Упростить, используя PoolBase.
|
||||
*/
|
||||
/** MySQL connections pool.
|
||||
* This class is poorly connected with mysqlxx and is made in different style (was taken from old code).
|
||||
* Usage:
|
||||
* mysqlxx::Pool pool("mysql_params");
|
||||
*
|
||||
* void thread()
|
||||
* {
|
||||
* mysqlxx::Pool::Entry connection = pool.Get();
|
||||
* std::string s = connection->query("SELECT 'Hello, world!' AS world").use().fetch()["world"].getString();
|
||||
* }
|
||||
* TODO: simplify with PoolBase.
|
||||
*/
|
||||
class Pool final
|
||||
{
|
||||
protected:
|
||||
/** Информация о соединении. */
|
||||
/// Information about connection.
|
||||
struct Connection
|
||||
{
|
||||
mysqlxx::Connection conn;
|
||||
@ -40,7 +39,7 @@ protected:
|
||||
};
|
||||
|
||||
public:
|
||||
/** Соединение с базой данных. */
|
||||
/// Connection with database.
|
||||
class Entry
|
||||
{
|
||||
public:
|
||||
@ -114,15 +113,15 @@ public:
|
||||
friend class Pool;
|
||||
|
||||
private:
|
||||
/** Указатель на соединение. */
|
||||
/// Pointer to mysqlxx connection.
|
||||
Connection * data = nullptr;
|
||||
/** Указатель на пул, которому мы принадлежим. */
|
||||
/// Pointer to pool we are belonging to.
|
||||
Pool * pool = nullptr;
|
||||
|
||||
/** Переподключается к базе данных в случае необходимости. Если не удалось - подождать и попробовать снова. */
|
||||
/// Connects to database. If connection is failed then waits and repeats again.
|
||||
void forceConnected() const;
|
||||
|
||||
/** Переподключается к базе данных в случае необходимости. Если не удалось - вернуть false. */
|
||||
/// Connects to database. If connection is failed then returns false.
|
||||
bool tryForceConnected() const
|
||||
{
|
||||
return data->conn.ping();
|
||||
@ -142,9 +141,9 @@ public:
|
||||
{}
|
||||
|
||||
/**
|
||||
* @param config_name Имя параметра в конфигурационном файле
|
||||
* @param default_connections_ Количество подключений по-умолчанию
|
||||
* @param max_connections_ Максимальное количество подключений
|
||||
* @param config_name Setting name in configuration file
|
||||
* @param default_connections_ Number of default connections
|
||||
* @param max_connections_ Maximum number of connections
|
||||
*/
|
||||
Pool(const Poco::Util::AbstractConfiguration & cfg, const std::string & config_name,
|
||||
unsigned default_connections_ = MYSQLXX_POOL_DEFAULT_START_CONNECTIONS,
|
||||
@ -152,13 +151,17 @@ public:
|
||||
const char * parent_config_name_ = nullptr);
|
||||
|
||||
/**
|
||||
* @param db_ Имя БД
|
||||
* @param server_ Хост для подключения
|
||||
* @param user_ Имя пользователя
|
||||
* @param password_ Пароль
|
||||
* @param port_ Порт для подключения
|
||||
* @param default_connections_ Количество подключений по-умолчанию
|
||||
* @param max_connections_ Максимальное количество подключений
|
||||
* @param db_ Database name
|
||||
* @param server_ Hostname
|
||||
* @param user_ User name
|
||||
* @param password_ Password
|
||||
* @param socket_ Socket
|
||||
* @param port_ Port
|
||||
* @param default_connections_ Number of default connections
|
||||
* @param max_connections_ Maximum number of connections
|
||||
*
|
||||
* Like with mysqlxx::Connection, either port either socket should be specified.
|
||||
* If server is localhost and socket is not empty, than socket is used. Otherwise, server and port is used.
|
||||
*/
|
||||
Pool(const std::string & db_,
|
||||
const std::string & server_,
|
||||
@ -187,40 +190,39 @@ public:
|
||||
|
||||
~Pool();
|
||||
|
||||
/** Выделяет соединение для работы. */
|
||||
/// Allocates connection.
|
||||
Entry Get();
|
||||
|
||||
/** Выделяет соединение для работы.
|
||||
* Если база недоступна - возвращает пустой объект Entry.
|
||||
* Если пул переполнен - кидает исключение.
|
||||
*/
|
||||
/// Allocates connection.
|
||||
/// If database is not accessible, returns empty Entry object.
|
||||
/// If pool is overflowed, throws exception.
|
||||
Entry tryGet();
|
||||
|
||||
/// Получить описание БД
|
||||
/// Get description of database.
|
||||
std::string getDescription() const
|
||||
{
|
||||
return description;
|
||||
}
|
||||
|
||||
protected:
|
||||
/** Количество соединений с MySQL, создаваемых при запуске. */
|
||||
/// Number of MySQL connections which are created at launch.
|
||||
unsigned default_connections;
|
||||
/** Максимально возможное количество соедиений. */
|
||||
/// Maximum possible number of connections
|
||||
unsigned max_connections;
|
||||
|
||||
private:
|
||||
/** Признак того, что мы инициализированы. */
|
||||
/// Initialization flag.
|
||||
bool initialized{false};
|
||||
/** Список соединений. */
|
||||
/// List of connections.
|
||||
using Connections = std::list<Connection *>;
|
||||
/** Список соединений. */
|
||||
/// List of connections.
|
||||
Connections connections;
|
||||
/** Замок для доступа к списку соединений. */
|
||||
/// Lock for connections list access
|
||||
std::mutex mutex;
|
||||
/** Описание соединения. */
|
||||
/// Description of connection.
|
||||
std::string description;
|
||||
|
||||
/** Параметры подключения. **/
|
||||
/// Connection settings.
|
||||
std::string db;
|
||||
std::string server;
|
||||
std::string user;
|
||||
@ -230,10 +232,10 @@ private:
|
||||
unsigned connect_timeout;
|
||||
unsigned rw_timeout;
|
||||
|
||||
/** Хотя бы один раз было успешное соединение. */
|
||||
/// True if connection was established at least once.
|
||||
bool was_successful{false};
|
||||
|
||||
/** Выполняет инициализацию класса, если мы еще не инициализированы. */
|
||||
/// Initialises class if it wasn't.
|
||||
void initialize();
|
||||
|
||||
/** Create new connection. */
|
||||
|
@ -24,7 +24,7 @@ Connection::Connection()
|
||||
{
|
||||
is_connected = false;
|
||||
|
||||
/// Инициализация библиотеки.
|
||||
/// MySQL library initialization.
|
||||
LibrarySingleton::instance();
|
||||
}
|
||||
|
||||
@ -68,13 +68,13 @@ void Connection::connect(const char* db,
|
||||
if (is_connected)
|
||||
disconnect();
|
||||
|
||||
/// Инициализация библиотеки.
|
||||
/// MySQL library initialization.
|
||||
LibrarySingleton::instance();
|
||||
|
||||
if (!mysql_init(driver.get()))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
||||
/// Установим таймауты
|
||||
/// Set timeouts.
|
||||
if (mysql_options(driver.get(), MYSQL_OPT_CONNECT_TIMEOUT, reinterpret_cast<const char *>(&timeout)))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
||||
@ -84,20 +84,18 @@ void Connection::connect(const char* db,
|
||||
if (mysql_options(driver.get(), MYSQL_OPT_WRITE_TIMEOUT, reinterpret_cast<const char *>(&rw_timeout)))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
||||
/** Включаем возможность использовать запрос LOAD DATA LOCAL INFILE с серверами,
|
||||
* которые были скомпилированы без опции --enable-local-infile.
|
||||
*/
|
||||
/// Enables ability to use query LOAD DATA LOCAL INFILE with servers were compiled without --enable-local-infile option.
|
||||
if (mysql_options(driver.get(), MYSQL_OPT_LOCAL_INFILE, nullptr))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
||||
if (!mysql_real_connect(driver.get(), server, user, password, db, port, *socket ? socket : nullptr, driver->client_flag))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
||||
/// Установим кодировки по умолчанию - UTF-8.
|
||||
/// Sets UTF-8 as default encoding.
|
||||
if (mysql_set_character_set(driver.get(), "UTF8"))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
||||
/// Установим автоматический реконнект
|
||||
/// Enables auto-reconnect.
|
||||
my_bool reconnect = true;
|
||||
if (mysql_options(driver.get(), MYSQL_OPT_RECONNECT, reinterpret_cast<const char *>(&reconnect)))
|
||||
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
|
||||
|
@ -123,7 +123,7 @@ Pool::Entry Pool::tryGet()
|
||||
|
||||
initialize();
|
||||
|
||||
/// Поиск уже установленного, но не использующегося сейчас соединения.
|
||||
/// Searching for connection which was established but wasn't used.
|
||||
for (Connections::iterator it = connections.begin(); it != connections.end(); ++it)
|
||||
{
|
||||
if ((*it)->ref_count == 0)
|
||||
@ -133,11 +133,11 @@ Pool::Entry Pool::tryGet()
|
||||
}
|
||||
}
|
||||
|
||||
/// Если пул переполнен.
|
||||
/// Throws if pool is overflowed.
|
||||
if (connections.size() >= max_connections)
|
||||
throw Poco::Exception("mysqlxx::Pool is full");
|
||||
|
||||
/// Выделение нового соединения.
|
||||
/// Allocates new connection.
|
||||
Connection * conn = allocConnection(true);
|
||||
if (conn)
|
||||
return Entry(conn, this);
|
||||
|
Loading…
Reference in New Issue
Block a user