你把你的能重现问题的代码帖出来看看,最好是一段完整的代码。应该是代码写的不对。
statement执行完,相关对象是否有close? 比如结果集之类的。没有引出问题的源码,大神也帮不了你。

解决方案 »

  1.   

    这是简化之后的代码, 问题出在execute之后isClosed返回的是true,但在之前是false, 存储过程就是两个selectbool DBQueryManager::QueryByID(const G2DQuery g2dInfo, D2GQueryResult &d2gInfo)
    {
        bool bRet = false;
        stringstream SQLQuery;
        SQLQuery.str("");
        SQLQuery<<"call _QueryRoleById( "<<g2dInfo.uiId<<" )"<<'\0';
        d2gInfo.uiId = g2dInfo.uiId;
        sql::Connection* pconn = NULL;
        try
        {
            pconn = MysqlConnectionPool::Instance()->GetOneConnection(); //从连接池获得一个实例        if (pconn == NULL)
            {
                d2gInfo.uiResult = Enum_Exception;
                LOG_ERROR("%s, connection is null !", __FUNCTION__);
                return false;
            }
            boost::shared_ptr<sql::Statement> stmt(pconn->createStatement());
            LOG_INFO("%s, createStatement, %d",__FUNCTION__, pconn->isClosed());//false ???
            bool res = stmt->execute(SQLQuery.str()); //执行sql语句
            LOG_INFO("%s, execute, %d",__FUNCTION__, pconn->isClosed()); //true ???
            
            if (!res)//如果没有结果集
            {
                LOG_ERROR("%s,%d error in execute sql cmd ", __FUNCTION__, __LINE__);
                d2gInfo.uiResult = Enum_Exception;
            }
            else //执行查询
            {            
                std::auto_ptr<sql::ResultSet> rset(stmt->getResultSet());
                while (rset->next())
                {
                    //..............
                }
                rset->close();
                if(stmt->getMoreResults())
                {
                   //...............                
                }
                d2gInfo.uiResult = d2gInfo.List.empty()?Enum_None:Enum_Exist;            bRet = true;
            }               stmt->close();
            MysqlConnectionPool::Instance()->ReturnOneConnection(pconn);//将对象返回连接队列    }
        catch(sql::SQLException &e)
        {
            d2gInfo.uiResult = Enum_Exception; 
            MysqlConnectionPool::Instance()->ReturnOneConnection(pconn);//将对象返回连接队列
            LOG_ERROR("查询时出现异常,errno:%d, description: %s",e.getErrorCode(), e.what());
            GenExp("error");
        }        return bRet;
    }
      

  2.   

    看看是不是这行:
    boost::shared_ptr<sql::Statement>    stmt(pconn->createStatement());
    你改用普通的sql::Statement* ,看看是否有类似的问题.
      

  3.   

    试过,没用啊, 原来是用std::auto_ptr的, 应该不是这里的问题吧。 你能否提示下有什么情况会导致execute之后连接会关闭??
      

  4.   

    试过,没用啊, 原来是用std::auto_ptr的, 应该不是这里的问题吧。 你能否提示下有什么情况会导致execute之后连接会关闭??
    你先试试,把数据库重启之后,单程序运行,是否也是这个错?
    另外,你的连接池初始配置最大连接数量是多少?
      

  5.   

    另外,既然你有连接池的实现源码,应该直接debug进去,看看为何connection execute之前是open, 之后为何变为close, 这之间肯定有问题.
      

  6.   

    这个已经调试过, 问题不是出现在连接池, 而是在execute里面, 但调试时没发现什么问题, execute一返回连接就断了
      

  7.   

    试过,没用啊, 原来是用std::auto_ptr的, 应该不是这里的问题吧。 你能否提示下有什么情况会导致execute之后连接会关闭??
    你先试试,把数据库重启之后,单程序运行,是否也是这个错?
    另外,你的连接池初始配置最大连接数量是多少?
    初始配置是默认的100个, 重新启动也试过, 没用
      

  8.   

    综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?
    你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
    (你到底试没试过不用智能指针之后的效果?)
    还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
      

  9.   

    综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?
    你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
    (你到底试没试过不用智能指针之后的效果?)
    还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
    改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。
      

  10.   

    综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?
    你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
    (你到底试没试过不用智能指针之后的效果?)
    还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
    改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。
    我说的库指是那个连接池的实现......execute之后,没有理由connetion状态会被置为close.如果是那样,应该是这个实现的bug了.另外有一个值得怀疑的地方,就是说你代码里头看到的是"close",你用命令行或者监控工具看看,那个物理连接是否还真的存在?
    max_connections, 这个值你配的是多少?其实,最好写一个简单的连接池使用示例, 比如就只调用"select 1",看看你上述逻辑是否能够重现.如果不能,证明是你的sql调用处理逻辑有问题.
      

  11.   

    综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?
    你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
    (你到底试没试过不用智能指针之后的效果?)
    还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
    改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。
    我说的库指是那个连接池的实现......execute之后,没有理由connetion状态会被置为close.如果是那样,应该是这个实现的bug了.另外有一个值得怀疑的地方,就是说你代码里头看到的是"close",你用命令行或者监控工具看看,那个物理连接是否还真的存在?
    max_connections, 这个值你配的是多少?其实,最好写一个简单的连接池使用示例, 比如就只调用"select 1",看看你上述逻辑是否能够重现.如果不能,证明是你的sql调用处理逻辑有问题.
    现在找到问题了, 这是isClosed的源代码
    bool
    MySQL_Connection::isClosed()
    {
    CPP_ENTER_WL(intern->logger, "MySQL_Connection::isClosed");
    if (intern->is_valid) {
    if (!proxy->ping()) {
    return false;
    }
    close();
    }
    return true;
    }在execute之前是ping得通的, 但execute之后就ping不通了, 实在不知道为什么会出现这种情况???
      

  12.   


    你刚才还说不是"库"的问题. ping不通,你有跟进去吗? 看看是不是连接的状态出了问题?
    我还是那句话,可以试着用"select 1"这种最简单的sql调用来测试一下你的连接池的库,看到底能不能用.如果能用,则证明你目前出的错,跟你调用的存储过程之后的处理逻辑有关系.如果依旧不能用,则证明是库的实现部分很可能有问题.
      

  13.   


    你刚才还说不是"库"的问题. ping不通,你有跟进去吗? 看看是不是连接的状态出了问题?
    我还是那句话,可以试着用"select 1"这种最简单的sql调用来测试一下你的连接池的库,看到底能不能用.如果能用,则证明你目前出的错,跟你调用的存储过程之后的处理逻辑有关系.如果依旧不能用,则证明是库的实现部分很可能有问题.
    额..., 试了下还是一样的ping不通
      

  14.   

    只能断定你这个是连接池的实现库部分出了问题. 
    有源码的话, 自己尝试着debug并修改一下.
      

  15.   

    友情提示一下,你有没有试过稍低版本的connector c++, 比如1.0.5
      

  16.   

    现在用的是1.1.3, 难道低版本可以?至少你在使用人家代码(连接池的实现)之前,需要简单的测一下基本功能是否好用吧. 我只是揣测,可能那个实现在低版本的connector上是好用的.试试吧. 我对connector,一直持保留态度. 不如自己封装的稳定.