D
dirk
Unregistered / Unconfirmed
GUEST, unregistred user!
需要查询一个比较大的列表,把这个查询放到一个线程中执行,多个线程之间并没有关系,独自完成各自的查询,当多个线程并行执行时,经常出错,非常不稳定,几乎就是只要有两个线程在执行就出错。
1、各线程中使用的TADOQuery是各线程的私有变量,在线程中创建、释放,各线程只公用一个TADOConnection,在查询过程中,没有其他用户对数据库进行更新操作,没有锁的问题。
2、使用一个OpenSQL过程打开记录集。
3、数据库如果是Oracle,返回的错误是:“对象被打开。”,数据库如果SQLServer,返回错误:“连接占线导致另一个命令”。
4、代码是写在dll中的,TADOConnection是做为参数传过去的,各线程公用。
有人说要CoInitialize,这个没用,实际上,CoInitialize在dll调用时已经用过了,参考了连红星的“大富翁论坛离线浏览器2.1.3.449”源码,发现,把TADOQuery的游标设成服务器端出错的概率要小很多:FQuery.CursorLocation:=clUseServer;,但仍时不时的会出错,只是不像使用客户端游标那样一运行就出错(TADOQuery默认是客户端游标)。
我把相关代码简化,放在小雨哥的网站上,请下载运行一下看看 http://ale.xicp.net/upload/ThreadADOTest.rar ,其中测试了各种情况,TMy1Thread使用的都是默认的设置,数据库是Oracle情况好些,SQLServer2000次之,SQLServer7狂出错。
今天试了在线程中创建TADOConnection,即每个线程用一个TADOConnection,呵呵,TMy1Thread就不出错,开50个线程测试,就是慢多了(ThreadADOTest.rar是几天前上传的,没有这部分代码)。
从出错的提示看,感觉是ADO的并行处理方面的问题,好像这ADO方面能力比较弱,BDE中使用多线程要使用TSesson,但ADO中没有TSesson,怎么办?
谁能帮我解了这个麻烦?
1、各线程中使用的TADOQuery是各线程的私有变量,在线程中创建、释放,各线程只公用一个TADOConnection,在查询过程中,没有其他用户对数据库进行更新操作,没有锁的问题。
2、使用一个OpenSQL过程打开记录集。
3、数据库如果是Oracle,返回的错误是:“对象被打开。”,数据库如果SQLServer,返回错误:“连接占线导致另一个命令”。
4、代码是写在dll中的,TADOConnection是做为参数传过去的,各线程公用。
有人说要CoInitialize,这个没用,实际上,CoInitialize在dll调用时已经用过了,参考了连红星的“大富翁论坛离线浏览器2.1.3.449”源码,发现,把TADOQuery的游标设成服务器端出错的概率要小很多:FQuery.CursorLocation:=clUseServer;,但仍时不时的会出错,只是不像使用客户端游标那样一运行就出错(TADOQuery默认是客户端游标)。
我把相关代码简化,放在小雨哥的网站上,请下载运行一下看看 http://ale.xicp.net/upload/ThreadADOTest.rar ,其中测试了各种情况,TMy1Thread使用的都是默认的设置,数据库是Oracle情况好些,SQLServer2000次之,SQLServer7狂出错。
今天试了在线程中创建TADOConnection,即每个线程用一个TADOConnection,呵呵,TMy1Thread就不出错,开50个线程测试,就是慢多了(ThreadADOTest.rar是几天前上传的,没有这部分代码)。
从出错的提示看,感觉是ADO的并行处理方面的问题,好像这ADO方面能力比较弱,BDE中使用多线程要使用TSesson,但ADO中没有TSesson,怎么办?
谁能帮我解了这个麻烦?