[英]C++ - Mysql connector
我正在使用c ++ mysql連接器在mysql數據庫中進行操作。
我的c ++程序是一個實時應用程序(rest api),始終在雲中運行,始終在等待用戶請求。
當我為第一種類型啟動程序時,我會自動創建與數據庫的連接(我從配置文件中加載連接器的字段)。 例:
conDataBase = new ConDatabase;
if (!conDataBase->Init()) return false;
conDataBase是所有類均可訪問的全局指針。 Init()
函數:
bool conDatabase::Init()
{
GetParameterStr("DATABASE", "HOST", "", hostname, 255);
db_hostname = hostname;
GetParameterStr("DATABASE", "USER", "", user, 255);
db_user = user;
GetParameterStr("DATABASE", "PASSWORD", "", password, 255);
db_password = password;
GetParameterStr("DATABASE", "SCHEMA", "", schema, 255);
db_schema = schema;
printf("DATABASE: Connecting to %s \n",db_hostname.c_str());
printf("DATABASE: Connecting at %s with user %s \n",db_schema.c_str(), db_user.c_str());
try
{
driver = get_driver_instance();
con = driver->connect(db_hostname.c_str(), db_user.c_str(), db_password.c_str());
con->setSchema(db_schema.c_str());
stmt = con->createStatement();
printf("DATABASE: Connected to database... OK \n");
return true;
}
catch (sql::SQLException &e)
{
std::cout << "# ERR: SQLException in " << __FILE__;
std::cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << std::endl;
std::cout << "# ERR: " << e.what();
std::cout << " (MySQL error code: " << e.getErrorCode();
std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
return false;
}
}
因此,當我收到一個請求,例如在userInfo請求類中列出userInfo時,我像這樣調用數據庫類的全局指針:
conDataBase->GetUserInfo(// the parameters);
在GetUserInfo()
內部,我像這樣構建查詢:
res = stmt->executeQuery(query);
它的工作原理,但我真正的疑問是:是否有必要從mysqlconnector中刪除指針( res, pstmt, con, etc
)? 我擔心將來會發生內存泄漏。 我只是在程序退出時才刪除指針,但這是實時程序的原因,因此不能期望他完成操作。 如果我在每個查詢中刪除指針,則在下一次出現分段錯誤時插入等(如mysqlconnector
示例一樣),因為在我第一次運行程序時,我會創建數據庫指針con, res, etc,
因此我無法刪除這些指針指針在每個數據庫操作中,因為如果執行此操作,則下次刪除指針時,我將無法訪問他,從而導致分段錯誤。 在這種情況下,如何防止將來發生內存泄漏?
在這種情況下,您可以編寫connectionManager類。 它可以用來為以下對象提供api:
1-創建和維護連接池 ,
2-getConnection api從池中獲取連接實例,
3-一個釋放連接API,用於將連接實例放回打開的連接池中,
4-您應該使用stl容器存儲打開的連接等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.