mysql-connector-c++ 执行execute之后连接会关闭 你把你的能重现问题的代码帖出来看看,最好是一段完整的代码。应该是代码写的不对。statement执行完,相关对象是否有close? 比如结果集之类的。没有引出问题的源码,大神也帮不了你。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是简化之后的代码, 问题出在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;} 看看是不是这行:boost::shared_ptr<sql::Statement> stmt(pconn->createStatement());你改用普通的sql::Statement* ,看看是否有类似的问题. 试过,没用啊, 原来是用std::auto_ptr的, 应该不是这里的问题吧。 你能否提示下有什么情况会导致execute之后连接会关闭?? 试过,没用啊, 原来是用std::auto_ptr的, 应该不是这里的问题吧。 你能否提示下有什么情况会导致execute之后连接会关闭??你先试试,把数据库重启之后,单程序运行,是否也是这个错?另外,你的连接池初始配置最大连接数量是多少? 另外,既然你有连接池的实现源码,应该直接debug进去,看看为何connection execute之前是open, 之后为何变为close, 这之间肯定有问题. 这个已经调试过, 问题不是出现在连接池, 而是在execute里面, 但调试时没发现什么问题, execute一返回连接就断了 试过,没用啊, 原来是用std::auto_ptr的, 应该不是这里的问题吧。 你能否提示下有什么情况会导致execute之后连接会关闭??你先试试,把数据库重启之后,单程序运行,是否也是这个错?另外,你的连接池初始配置最大连接数量是多少?初始配置是默认的100个, 重新启动也试过, 没用 综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.(你到底试没试过不用智能指针之后的效果?)还有,你看看你数据库启来之后,数据库本身的最大连接数是多少? 综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.(你到底试没试过不用智能指针之后的效果?)还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。 综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.(你到底试没试过不用智能指针之后的效果?)还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。我说的库指是那个连接池的实现......execute之后,没有理由connetion状态会被置为close.如果是那样,应该是这个实现的bug了.另外有一个值得怀疑的地方,就是说你代码里头看到的是"close",你用命令行或者监控工具看看,那个物理连接是否还真的存在?max_connections, 这个值你配的是多少?其实,最好写一个简单的连接池使用示例, 比如就只调用"select 1",看看你上述逻辑是否能够重现.如果不能,证明是你的sql调用处理逻辑有问题. 综合你上边两个回帖, execute之前好用,返回之后,就"自动close"?你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.(你到底试没试过不用智能指针之后的效果?)还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。我说的库指是那个连接池的实现......execute之后,没有理由connetion状态会被置为close.如果是那样,应该是这个实现的bug了.另外有一个值得怀疑的地方,就是说你代码里头看到的是"close",你用命令行或者监控工具看看,那个物理连接是否还真的存在?max_connections, 这个值你配的是多少?其实,最好写一个简单的连接池使用示例, 比如就只调用"select 1",看看你上述逻辑是否能够重现.如果不能,证明是你的sql调用处理逻辑有问题.现在找到问题了, 这是isClosed的源代码boolMySQL_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不通了, 实在不知道为什么会出现这种情况??? 你刚才还说不是"库"的问题. ping不通,你有跟进去吗? 看看是不是连接的状态出了问题?我还是那句话,可以试着用"select 1"这种最简单的sql调用来测试一下你的连接池的库,看到底能不能用.如果能用,则证明你目前出的错,跟你调用的存储过程之后的处理逻辑有关系.如果依旧不能用,则证明是库的实现部分很可能有问题. 你刚才还说不是"库"的问题. ping不通,你有跟进去吗? 看看是不是连接的状态出了问题?我还是那句话,可以试着用"select 1"这种最简单的sql调用来测试一下你的连接池的库,看到底能不能用.如果能用,则证明你目前出的错,跟你调用的存储过程之后的处理逻辑有关系.如果依旧不能用,则证明是库的实现部分很可能有问题.额..., 试了下还是一样的ping不通 只能断定你这个是连接池的实现库部分出了问题. 有源码的话, 自己尝试着debug并修改一下. 友情提示一下,你有没有试过稍低版本的connector c++, 比如1.0.5 现在用的是1.1.3, 难道低版本可以?至少你在使用人家代码(连接池的实现)之前,需要简单的测一下基本功能是否好用吧. 我只是揣测,可能那个实现在低版本的connector上是好用的.试试吧. 我对connector,一直持保留态度. 不如自己封装的稳定. mysql dmp导入到mysql中 怎样注入 效率更高的sql语句 在Mysql中,为什么sum具有count的功能? 【万分着急】MySQL默认安装latin1,然后我插入希腊字母β的时候变成了乱码,如何解决 MySQL user表中的Host值为::1,::1是神马意思啊? 数据库的学习流程,从初级到神级!!MySQL 登录远程的phpPgAdmin导出PostgreSQL中某个数据库的问题 请教一个比较繁琐的数据库查询的问题 如何让外面的机器无法访问我的机器上的mysql 什么原因导致配置了binlog,但binlog文件不增加 select count(*) from table
{
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;
}
boost::shared_ptr<sql::Statement> stmt(pconn->createStatement());
你改用普通的sql::Statement* ,看看是否有类似的问题.
你先试试,把数据库重启之后,单程序运行,是否也是这个错?
另外,你的连接池初始配置最大连接数量是多少?
你先试试,把数据库重启之后,单程序运行,是否也是这个错?
另外,你的连接池初始配置最大连接数量是多少?
初始配置是默认的100个, 重新启动也试过, 没用
你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
(你到底试没试过不用智能指针之后的效果?)
还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
(你到底试没试过不用智能指针之后的效果?)
还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。
你试过没有,把你的连接池初始配置100个改为10个(重启之后). 如果还是同样的现象, 说不定跟你用的库有关系.
(你到底试没试过不用智能指针之后的效果?)
还有,你看看你数据库启来之后,数据库本身的最大连接数是多少?
改大小也试过, 这个库在Linux下结果也一样的, 应该不是库的问题。 你说的本身最大连接不知道是什么意思, 不就是max_connections么? 不用智能指针的也用过。
我说的库指是那个连接池的实现......execute之后,没有理由connetion状态会被置为close.如果是那样,应该是这个实现的bug了.另外有一个值得怀疑的地方,就是说你代码里头看到的是"close",你用命令行或者监控工具看看,那个物理连接是否还真的存在?
max_connections, 这个值你配的是多少?其实,最好写一个简单的连接池使用示例, 比如就只调用"select 1",看看你上述逻辑是否能够重现.如果不能,证明是你的sql调用处理逻辑有问题.
你试过没有,把你的连接池初始配置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不通了, 实在不知道为什么会出现这种情况???
你刚才还说不是"库"的问题. ping不通,你有跟进去吗? 看看是不是连接的状态出了问题?
我还是那句话,可以试着用"select 1"这种最简单的sql调用来测试一下你的连接池的库,看到底能不能用.如果能用,则证明你目前出的错,跟你调用的存储过程之后的处理逻辑有关系.如果依旧不能用,则证明是库的实现部分很可能有问题.
你刚才还说不是"库"的问题. ping不通,你有跟进去吗? 看看是不是连接的状态出了问题?
我还是那句话,可以试着用"select 1"这种最简单的sql调用来测试一下你的连接池的库,看到底能不能用.如果能用,则证明你目前出的错,跟你调用的存储过程之后的处理逻辑有关系.如果依旧不能用,则证明是库的实现部分很可能有问题.
额..., 试了下还是一样的ping不通
有源码的话, 自己尝试着debug并修改一下.