大家好,我想请求大家帮忙一个问题。我用QT平台,开发了一个有关数据库的程序。用的方式就是网上看到的基本的数据库操作。我先写了一个实验程序,是没有问题的,保存了一百万条数据,都是正常运行的。然后把我测试过的代码,放入我的新程序中,就出现了一个问题。
我在Widget类中,加了一个回调函数。如果收到硬件发给我的中断,先触发回调函数,回调函数是静态非成员函数。回调函数被触发之后,会发送事件给Widget类中的一个成员函数。Widget类中的这个成员函数,具体作用就是把得到的数据进行保存。保存数据的代码就是我前面实验过的数据库的代码。整个程序是可以正常运行的,但是会出现一个巨大的问题,就是程序一直在申请很多句柄。随着保存的数据量越大,句柄量越来越多,到最后,整个系统的句柄都被用完了,系统没办法进行任何操作。我在任务管理器中看了,内存没有消耗,CPU也没有,就是句柄在疯狂的增加。程序跑在Win7的系统上,操作系统直接提示,系统资源耗尽,什么都点不了,最后只能重启电脑。
数据库操作部分的大概逻辑如下
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("VMIC_DataBase.db");
database.transaction();
for (int i = 0; i < NUM; i++)
{
QString qsStr;
qsStr.sprintf("insert into member values(%d, '%s')", nDatabaseID, cRecBufAssem[i]);
bool success = query.exec(qsStr);
}
if(!QSqlDatabase::database().commit())
{
qDebug() << QSqlDatabase::database().lastError(); //提交
if(!QSqlDatabase::database().rollback())
{
qDebug() << QSqlDatabase::database().lastError(); //回滚
}
}
经过我的排查,其中消耗句柄的应该就在这里:
QString qsStr;
qsStr.sprintf("insert into member values(%d, '%s')", nDatabaseID, cRecBufAssem[i]);
bool success = query.exec(qsStr);
我想问一下大家,为什么会出现这种情况,我之前的实验程序,也有这个语句,怎么就没有消耗句柄呢。这个问题要怎么解决,如何不申请或者说能够释放掉句柄呢。
谢谢大家,在线等。