我本来说封装的一个ADO类,有兴趣的可以去看看,使用还是非常方便,ADO类开发了一个多线程的网络服务程序a.exe,因为听说ADO不是线程安全的,所以认为多线程不能共享连接。
现在的运行方式是处理一个客户请求开启一个线程,每个线程都会打开一个数据库连接,(线程运行结束的时候,就会关闭连接)。开始运行较为稳定,运行一两天之后,打开连接就失败了,ADO类重起服务程序之后,就可以连接成功。另外,该服务程序a.exe需要查询、插入、更新数据库中的表,同时另一个程序b.exe需要更新同样的表,web服务器也要通过ASP查询、插入这些表。问题如下:
1)导致连接失败的原因是什么呢?ADO类打开的连接太多?(最多的时候a.exe有六个线程同时运行,但是他们会频繁的打开、关闭连接)。听别人说“连接池”可以解决打开连接太多的带来的问题,哪位高手解释一下“连接池”如何实现?
2)b.exe在更新表中的记录的时候,出现错误,大意如下:”0x80004005错误,spid 65作为事务死锁的牺牲品,被禁止了,请重新运行事务”,是不是进程间访问数据库互斥操作导致的?如何解决呢?a.exe和b.exe采用不同的数据库用户登录,也不行。事务死锁会不会导致连接失败呢? #t#
3)DB Connection 和 Session有何不同?二者的关系是什么呢?如何共享Connection呢?如何ADO类实现?
我已经查阅了很多资料,一直没能解决问题,请各位高手指点几句。 因为我是新手初来查到,分数有限,等有分了,再加分。 导致连接失败的原因应该是死锁,这时很多进程都在等待其他的进程释放连接,如果死锁,肯定导致连接失败 。
连接最好不要放到Session和Application中去,这样在访问人数多的时候容易死锁,ADO类不是线程共享的,如果ADO类放到Session和Application中,连接一直不能被释放,而总的连接数是固定的,其他的程序就一直等待连接的释放,从而导致请求的队列越来越长。
建立一个进程共享区,ADO类当用户请求连接并在查询完成要释放连接时,不关闭此连接,而是把这个连接放到共享区中。下一个用户请求查询时,先从共享区找有无可用连接,如果有,使用该连接查询,如无,则新建一个,使用完毕后同样放入共享区。
这样带来的问题:
1、共享区里的连接要做保护,以免不同进程同时使用一个连接;
2、要限制共享区连接的数目,以免资源耗尽;
3、要写一个查询可用连接的算法。