你把你的能重现问题的代码帖出来看看,最好是一段完整的代码。应该是代码写的不对。
statement执行完,相关对象是否有close? 比如结果集之类的。没有引出问题的源码,大神也帮不了你。
statement执行完,相关对象是否有close? 比如结果集之类的。没有引出问题的源码,大神也帮不了你。
解决方案 »
- 5个监测点传输过来的数据是放一个表还是5个表对以后的查询等操作更方便?每个监测点的数据量都很大。谢谢!
- DB集群谁弄过,有偿服务
- 多个select语句做连接问题.......急
- Postgres 8.3 性能问题
- 我在phpmyadmin中修改mysql密码后,应再也无法登录了,如何办呢?
- 公司给的难题
- 大家帮帮忙,这个问题怎么解决
- mysql中文显示问题
- 遇到一个小问题大概是这样的,有没有老司机帮忙解答一下,就要一个sql语句就行了
- access denied for user 'root'@'localhost'(using password:YES)
- 什么原因导致配置了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并修改一下.