一.最近用C++的mysql connector库时,遇到一些问题,记录如下:
1.需要delete sql::Connection类指针才能断开数据库连接
#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;
}
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这个指针已经无效了