工程需要一个使用udp的程序,通信部分循环接收数据包,当接收到数据包后,开启一个线程将接收到的数据插入数据库中。该子线程向数据库插入完后就自动关闭数据库连接,并释放资源,最后使用exitthread函数关闭线程。问题是:我查程序暂用资源,发现该程序占用内存一直在升高并且数据库占用内存也在升高,这应该是数据没有释放连接或关闭资源的问题,但是我在处理时确实关闭连接并释放资源,请问各位高手这是怎么回事?
while(1)
{
recv();//接收数据包
createthread(insertdb).//创建线程向数据库插入接收的数据包
}
insertdb()
{
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
pConn->Open();
pConn->Execute();//执行插入操作
pConn->Close();//关闭连接
pConn.Release();//释放连接
CoUninitialize();
while(1)
{
recv();//接收数据包
createthread(insertdb).//创建线程向数据库插入接收的数据包
}
insertdb()
{
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
pConn->Open();
pConn->Execute();//执行插入操作
pConn->Close();//关闭连接
pConn.Release();//释放连接
CoUninitialize();
另外。pConn.Release()建议不要使用,智能指针类可以自己释放。不需要显示释放,当然前提是使用正常的return退出1。内存占用,数据库操作是会增加内存占用,因为ADO会使用链接池内部管理,所以会增长到一定的时候,就不会再有明显的增长
2。如果是持续增长,有可能是产生的写数据库线程太多,而之前的线程没有处理完,所以要看是否会有线程数量的高低波动。
3。建议你设置产生线程最高数量,不然内存不好控制确定,线程进入的时候,计数器加一,线程退出的时候,可以把计数器减一。注意临界区保护计数器
4。也可以事先生成若干数量的线程。而不是频繁创建线程。在线程内部Wait事件。而在recv线程SetEvent,这样就能省不少资源。注意要使用自动重置的事件对象
内存就是不释放. 不过确实是后面涨的不厉害,但是问题在于它最后不会退回开始的内存使用量