一.最近用C++的mysql connector库时,遇到一些问题,记录如下:
1.需要delete sql::Connection类指针才能断开数据库连接
最开始的问题是,我的软件会频繁连接数据库,但发现数据库的连接数只增不减,于是写了个demo测试,发现问题在只调用了sql::Connection类的close()方法后,数据库的连接没有关闭,还要将sql::Connection类指针delete掉以后,连接才真正的断开,如下图是未加入delete的代码段
#include "stdafx.h"
#include "jdbc/mysql_connection.h"
#include "jdbc/mysql_driver.h"
#include "jdbc/cppconn/statement.h"
#include "jdbc/cppconn/prepared_statement.h"
#include <iostream>
using namespace std;
int main()
{
sql::mysql::MySQL_Driver* m_MySqlDriver = nullptr;
m_MySqlDriver = sql::mysql::get_mysql_driver_instance();
if (m_MySqlDriver == nullptr)
{
cout << "driver is null" << endl;
return false;
}
sql::Connection* m_MySqlConn = m_MySqlDriver->connect("localhost", "oliver_zhang", "******");
if (m_MySqlConn == nullptr)
{
cout << "conn is null" << endl;
return false;
}
cout << "connect suceess" << endl;
//关闭连接
m_MySqlConn->close();
//delete m_MySqlConn; //释放连接对象
cout << "连接关闭" << endl;
getchar();
return 0;
}
上图是没有delete时的连接情况,发现连接并未真正断开,这导致我在程序未关闭的情况下,close()以后再connect会不停的增加连接数.
解决方法是close()后进行delete操作
2.delete sql::mysql::MySQL_Driver类指针导致后续的操作会崩溃
这个问题是我将sql::mysql::MySQL_Driver实例指针释放后,再获取数据库实例,然后使用该实例去连接时,发生崩溃。demo代码如下:
#include "jdbc/mysql_connection.h"
#include "jdbc/mysql_driver.h"
#include "jdbc/cppconn/statement.h"
#include "jdbc/cppconn/prepared_statement.h"
#include <iostream>
using namespace std;
int main()
{
sql::mysql::MySQL_Driver* m_MySqlDriver = nullptr;
m_MySqlDriver = sql::mysql::get_mysql_driver_instance();
if (m_MySqlDriver == nullptr)
{
cout << "driver is null" << endl;
return false;
}
sql::Connection* m_MySqlConn = m_MySqlDriver->connect("localhost", "oliver_zhang", "******");
if (m_MySqlConn == nullptr)
{
cout << "conn is null" << endl;
return false;
}
cout << "connect suceess" << endl;
//关闭连接
m_MySqlConn->close();
delete m_MySqlConn;
cout << "连接关闭" << endl;
delete m_MySqlDriver; //这边如果手动释放数据库驱动实例的指针,后续的操作会崩溃
m_MySqlDriver = nullptr;
try
{
m_MySqlDriver = sql::mysql::get_mysql_driver_instance();
if(m_MySqlDriver == nullptr)
{
cout << "driver is null" << endl;
return false;
}
m_MySqlConn = m_MySqlDriver->connect("localhost", "oliver_zhang", "******");
if (m_MySqlConn == nullptr)
{
cout << "在次连接失败" << endl;
return false;
}
cout << "在次连接成功" << endl;
}
catch (const exception& ex)
{
cout << "异常:" << ex.what() << endl;
return -1;
}
return 0;
}
运行结果如上,发现异常也没能捕获到就直接崩溃了,应该是m_MySqlDriver这个指针已经无效了
经过检查发现,就算delete m_MySqlDriver,我每次调用sql::mysql::get_mysql_driver_instance(),获得的指针都是一样的,猜测内部应该是用单例自己维护着这块内存,外部不能去动这个指针的.
解决方案是将delete m_MySqlDriver;注释掉即可,