我可以在nginx + spawn-fcgi中永远打开MySQL连接吗?

时间:2014-02-13 19:36:26

标签: c++ mysql nginx

我使用nginx + fcgi,所以我们可以通过spawn-cgi运行c ++应用程序。它就像一个守护进程。在那个c ++应用程序中,我们有主循环:

while ( FCGX_Accept_r( &request ) == 0 ) {

    //....FCGX_Accept_r listens for all client requests so we process them here and return HTML output to web browser....

    // Every such request I need to get some data from MySQL db. 
    MYSQL_RES *res;
    MYSQL_ROW row;
    MYSQL *conn = mysql_init( NULL );

    if ( !mysql_real_connect( conn, server.c_str(), user.c_str(), password.c_str(), database.c_str(), 0, NULL, 0 ) ) {
        fprintf( stderr, "%s\n", mysql_error( conn ) );
        //exit( 1 );
    }

    if ( mysql_query( conn, "show tables" ) ) {
        fprintf( stderr, "%s\n", mysql_error( conn ) );
        //exit( 1 );
    }

    res = mysql_use_result( conn );
    while ( ( row = mysql_fetch_row( res ) ) != NULL ) {
        std::cout << row[ 0 ] << "<br>\n";
    }

    mysql_free_result( res );
    mysql_close( conn );

}

我是否需要在每次请求时启动和关闭连接,或者最好在while循环之前打开连接并在while循环之后关闭连接?

1 个答案:

答案 0 :(得分:1)

在请求上打开连接实际上是一个相当不错的主意,因为它将节省每次建立新连接的开销!但是,您需要确保:

  • 如果断开连接(在请求期间或请求之间),您需要重新打开它。

  • 如果您的代码执行的操作会改变连接状态,例如启动事务,则需要确保在请求之间正确重置。