100分求助:用ADO多线程读写数据库
我现在做一个基于C/S程序的服务器端,对于客户的每个请求,都可能需要对数据库进行读写。
我用ADO操作数据库,对于客户端的每个请求,都开一个线程进行处理。
我现在的做法是:
所有线程共用一个ADOConnection,每个线程内都动态生成一个ADOQuery进行操作
每个线程开头都Coinitialize(nil);,结尾都CoUninitialize;
我现在用6个客户端程序同时进行同一个请求,运行结果不是很好
用Access数据库时,每个线程运行少则几十次,多则几百次就出错,出现异常,时间长了可能出现类似“程序遇到错误需要关闭,给您造的不便请原谅”的严重错误。
用SQL Server的话,效果反而不如Access,运行几次就出现“连接占线导致另一个命令”的错误。
请问这个问题怎么解决?
如果每次数据库操作前都加锁的话是不是效率降低,而且像SQL Server这样的数据库,应该支持多线程读写才对,如果每次数据库操作前都加锁,不就相当于不用SQL Server支持多线程读写的功能了吗?
[解决办法]
UP
[解决办法]
所有线程共用一个ADOConnection
--问题应该是出在这里,你用一个ADOQuery对应一个Connection试试
[解决办法]
你得客户请求只是查询数据吗,有没有其它的操作请求
[解决办法]
你得问题估计就出在写数据库的请求上,多线程如果不采取同步措施,写数据库出错的几率比较大,多个现成同时写一个数据时,就会出问题
[解决办法]
一个ADOConnection应该是对应数据库的一个session,如果你要用多线程就应该是一个线程对应一个session,就是要用单独的ADOConnection去连接DB,这是我的理解你可以试试.动态建立ADOConnection和ADOQuery是一样的,最后free掉就可以了
var cnt1: TADOConnection;
cnt := ADOConnection.create(nil);
cnt.free;
[解决办法]
Mark 学习
多线程不是很熟
[解决办法]
什么项目啊,多大的数据量用得着你这么折腾
[解决办法]
估计是不同步引起的。
[解决办法]