【问题标题】:C++ - Mysql connectorC++ - Mysql 连接器
【发布时间】:2017-08-01 14:59:17
【问题描述】:

我正在使用 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, 所以我不能删除这些指针在每个数据库操作中,因为如果我这样做,下次指针将被删除,我无权访问他并导致分段错误。在这种情况下,有什么解决方案可以防止将来发生内存泄漏?

【问题讨论】:

    标签: c++ mysql pointers


    【解决方案1】:

    对于这种情况,您可以编写一个 connectionManager 类。它可以用来提供api:

    1-创建和维护连接池

    2- getConnection api 从池中获取连接实例,

    3- 释放连接 api,用于将连接实例放回打开的连接池中,

    4- 你应该使用 stl 容器来存储打开的连接等

    【讨论】:

    • 感谢您的回复。我只有数据库连接有这个问题。你不知道其他方法可以帮助我解决这个问题吗?
    • 不,先生,我不知道您的程序有任何其他解决方案。如果您可以编写连接管理器包装器并使用它,那将更有效率。
    猜你喜欢
    • 2015-02-03
    • 2011-12-05
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2023-03-12
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多