在ubuntu 20.04上使用MariaDB C++ Connector和gcc编译器。在对一个web服务器应用程序进行负载测试时,发现只要有多个并发连接,服务器就会崩溃。这被缩小到mariadb驱动程序的connect成员。报告的错误通常是以下两个错误之一:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted (core dumped)
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted (core dumped)
由于发布服务器的源代码是不可行的,因此我复制了一个最小的工作示例,它只使用标准库和mariadb/conncpp.hpp
:
# include <mariadb/conncpp.hpp>
# include <iostream>
# include <thread>
# include <string>
sql::Driver* driver = sql::mariadb::get_driver_instance();
sql::SQLString connectionUrl = "jdbc:mariadb://localhost:3306/the_database_name";
sql::Properties properties = {{"user", "the_username"}, {"password", "the_password"}};
int main()
{
// simulate 2 concurrent connections each making 500 requests
std::vector<std::function<void()>> t1cbs;
std::vector<std::function<void()>> t2cbs;
for(int i = 0; i < 500; i++) // if does not fail for you at 500 up the number until it does
{
t1cbs.push_back([&]{
std::unique_ptr<sql::Connection> conn(driver->connect(connectionUrl, properties));
std::cout << "t1:" << conn->getHostname().c_str() << std::endl;
});
// comment out this block to keep the second thread from executing, and you will see
// that no errors occur
t2cbs.push_back([&]{
std::unique_ptr<sql::Connection> conn(driver->connect(connectionUrl, properties));
std::cout << "t2:" << conn->getHostname().c_str() << std::endl;
});
}
std::thread t1([&]{
for(auto& cb : t1cbs)
cb();
});
std::thread t2([&]{
for(auto& cb : t2cbs)
cb();
});
t1.join();
t2.join();
return 0;
}
好奇是否有什么我没有看到的东西,其他人可能会指出?虽然在阅读了文档后,它似乎很直接...唯一的问题可能是在driver->connect
中发生了一些线程不安全的事情?不确定...很困惑...任何想法都非常感谢!
编辑经过进一步研究,我发现了以下示例,其中提到如果您有多个线程,则可能会出现问题......但仍在尝试找出如何规避此问题。
1条答案
按热度按时间bnl4lu3b1#
这是连接器/C++中的错误。要跟踪进度,请检查https://jira.mariadb.org/browse/CONCPP-105