ado多个连接并发访问问题

imlmy 2013-07-05 01:56:51
在程序中通过创建了50个线程,每个线程创建一个独立的ado连接,50个线程同时对数据库进行查询的时候,偶尔会出现异常,从异常情况看,是由于查询返回的recordset中数据出错,本来只有3个字段,但实际读取的字段数量却达到200多个,而且字段类型和值都不正确。
50个独立的链接,应该相互之间的查询记录集不会有影响,但是为什么会出现记录集被改掉的情况。而且记录集是在其中某几个记录出错。就是说读到得记录集前一部分记录是正确的,中间有一部分出错,后面又是正确的。是线程同步问题吗,难道不同的连接之间也会互相影响。
...全文
318 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
imlmy 2013-07-08
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
[quote=引用 8 楼 g6785654 的回复:] 肯定不能同时都调用一个连接啊,那样肯定出错的,下面人写的代码么,没及时沟通到位么?
使用VB只服务器部件只建立一个连接,单线程(因VB使用多线程不稳定),几十个用户同时并发,都没有什么问题[/quote] 就是说用vb建立一个进程,这个进程里面有1个线程用来访问数据库,同时几十个进程一起运行是吧。这种情况是没问题的。因为数据库服务器本身对并发已经做了处理,我出现的问题是多个线程同时调用一个ado的connection资源进行查询,是ado的并发问题。
worldy 2013-07-05
  • 打赏
  • 举报
回复
引用 8 楼 g6785654 的回复:
肯定不能同时都调用一个连接啊,那样肯定出错的,下面人写的代码么,没及时沟通到位么?
使用VB只服务器部件只建立一个连接,单线程(因VB使用多线程不稳定),几十个用户同时并发,都没有什么问题
imlmy 2013-07-05
  • 打赏
  • 举报
回复
引用 8 楼 g6785654 的回复:
肯定不能同时都调用一个连接啊,那样肯定出错的,下面人写的代码么,没及时沟通到位么?
我把ado封装了一下给别人用,他对这个不熟。之前他问我数据库同步问题,我以为是说数据库服务器本身的同步,我就说这个数据库已经做了管理。他可能以为就不用管这些链接的并发使用。
Ginie 2013-07-05
  • 打赏
  • 举报
回复
肯定不能同时都调用一个连接啊,那样肯定出错的,下面人写的代码么,没及时沟通到位么?
imlmy 2013-07-05
  • 打赏
  • 举报
回复
引用 5 楼 g6785654 的回复:
你定义了多少个记录集对象?一个线程对应一个么?如果你50个线程要想记录集不被改掉,那你得定义50个记录集了
又搞错了,他没有对查询加锁,有可能一个查询还在执行的时候,又调用这个connection执行另一个查询。我让他把connection在执行查询的时候加个锁,执行完后再释放锁。希望是这个原因导致的。沟通不到位啊
imlmy 2013-07-05
  • 打赏
  • 举报
回复
引用 5 楼 g6785654 的回复:
你定义了多少个记录集对象?一个线程对应一个么?如果你50个线程要想记录集不被改掉,那你得定义50个记录集了
每个线程都有一个记录集。其实就类似有一个50个链接的连接池。当线程需要查询的时候,会调用一个空闲的链接来进行查询,每次查询都会创建一个新的记录集。不过我说的空闲链接是指当前已经执行完sql语句返回了记录集,但是记录集还在读取,没有被释放。这时候又用这个链接查询和创建一个新的记录集。
Ginie 2013-07-05
  • 打赏
  • 举报
回复
你定义了多少个记录集对象?一个线程对应一个么?如果你50个线程要想记录集不被改掉,那你得定义50个记录集了
imlmy 2013-07-05
  • 打赏
  • 举报
回复
引用 3 楼 g6785654 的回复:
同时开一个connection查找数据集肯定会出问题的呀
不会同时使用connection查询,但是会出现第一个查询完成后记录集还未关闭,另一个就调用这个connection进行查询,并返回另一个记录集。
Ginie 2013-07-05
  • 打赏
  • 举报
回复
同时开一个connection查找数据集肯定会出问题的呀
imlmy 2013-07-05
  • 打赏
  • 举报
回复
引用 1 楼 g6785654 的回复:
用连接池呀,多线程操作ADO最好使用连接池,或者你每个线程用一个_ConnectionPtr
我上面说错了,当请求很多的时候,会出现多个线程用同一个connection查询,这样返回的Recordset会有同步问题吗
Ginie 2013-07-05
  • 打赏
  • 举报
回复
用连接池呀,多线程操作ADO最好使用连接池,或者你每个线程用一个_ConnectionPtr

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧