首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

100分用ADO多线程读写数据库

2012-08-29 
100分求助:用ADO多线程读写数据库我现在做一个基于C/S程序的服务器端,对于客户的每个请求,都可能需要对数

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 学习 

多线程不是很熟
[解决办法]
什么项目啊,多大的数据量用得着你这么折腾
[解决办法]
估计是不同步引起的。
[解决办法]

引用楼主 youyingbo 的帖子:
我现在做一个基于C/S程序的服务器端,对于客户的每个请求,都可能需要对数据库进行读写。
我用ADO操作数据库,对于客户端的每个请求,都开一个线程进行处理。

我现在的做法是:
所有线程共用一个ADOConnection,每个线程内都动态生成一个ADOQuery进行操作
每个线程开头都Coinitialize(nil);,结尾都CoUninitialize;

我现在用6个客户端程序同时进行同一个请求,运行结果不是很好
用Access数据库时,每个线程运行少…

[解决办法]
引用楼主 youyingbo 的帖子:
我现在做一个基于C/S程序的服务器端,对于客户的每个请求,都可能需要对数据库进行读写。
我用ADO操作数据库,对于客户端的每个请求,都开一个线程进行处理。

我现在的做法是:
所有线程共用一个ADOConnection,每个线程内都动态生成一个ADOQuery进行操作
每个线程开头都Coinitialize(nil);,结尾都CoUninitialize;

我现在用6个客户端程序同时进行同一个请求,运行结果不是很好
用Access数据库时,每个线程运行少…

[解决办法]
建立多个ADOConnection构成连接池;并保持连接;
对数据库操作;可以竞争ADOConnection资源;如果没有竞争到资源,将等待其他线程处理完;
不要在多线程中同时使用一个ADOConnection;
要在不同的线程中使用不同的ADOConnection;
--------------------------------------------
使用临界区保护你的公共数据;


[解决办法]
学习一下,连接池如何构成呢?

热点排行