ado多个连接并发访问问题

imlmy 2013-07-05 01:56:51
在程序中通过创建了50个线程,每个线程创建一个独立的ado连接,50个线程同时对数据库进行查询的时候,偶尔会出现异常,从异常情况看,是由于查询返回的recordset中数据出错,本来只有3个字段,但实际读取的字段数量却达到200多个,而且字段类型和值都不正确。
50个独立的链接,应该相互之间的查询记录集不会有影响,但是为什么会出现记录集被改掉的情况。而且记录集是在其中某几个记录出错。就是说读到得记录集前一部分记录是正确的,中间有一部分出错,后面又是正确的。是线程同步问题吗,难道不同的连接之间也会互相影响。
...全文
295 11 打赏 收藏 转发到动态 举报
写回复
用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
Middle ADO System 三层ADO的Internet远程数据库访问开发套件 获得最新版本: http//midado.cn 特点: 1、完全兼容Borland ADO Component的控件开发 从TCustomADODataset和TCustomADOConnection类继承,可快速从已完成或者开发中的程序进行升级和扩展 2、完全的三层架构 同时支持原生ADO访问模式和三层的扩展访问模式,开发过程同C/S模式一样,运行时设定Enabled属性,即可从C/S变成三层,随时切换模式。 3、后台自动连线机制 客户端在长时间使用过程中,如果网络异常断线,恢复后可继续使用业务功能,不用重新启动应用程序,更加适合在不稳定的网络环境中使用。 4、自动断线功能 客户端长时间不进行操作,服务端可暂时断开客户端连线,当用户需要继续操作时,通过后台自动连线功能,重新连接网络继续操作,对用户的操作没有任何影响。自动断线功能可充分利用系统资源,减少同时在线用户,同时保障每个用户的连接质量。 5、数据库共享连接多个客户端共享同一个数据库连接对象,可设定每个客户端独占数据库连接对象时间和自动回收时间。 大量减少数据连接数量,减少数据库的负载,极大提高数据库访问速度。根据设定的缓冲时间,可节约80%~95%连接对象资源 6、多数据库目录支持 一个中间层服务程序可同时提供多个数据库目录的服务,提供多个应用系统的多套数据连接并发服务 7、安全的Internet网应用 通过TCP/IP服务程序,提供Internet的外部数据访问功能,通过服务程序,隔离数据库的直接连接,有效保护数据库安全, 高效的数据压缩和加密传输,提高远程的数据访问速度和安全性。 8、服务端状态监控功能 对服务器的连线和负载状态进行实时监控,可查看每个客户端连接的来源和请求情况,包括数据的收发字节数 9、便于安装和维护 客户端不用装任何客户端数据库驱动和设置数据库连接对象,大量不同的客户端环境中进行客户端数据库连接设定,是需要花费不少人力。(例如Oracle) 使用场合: 1、需要安全的通过Internet远程数据库访问应用程序,如连锁加盟、各地办事处、等分布式应用 2、需要隔离数据库访问的高安全应用程序,例如在线实时交易软件、如股票证券、期货、外汇等交易等 3、大量客户端同时访问的应用程序,例如几千个用户同时连线对数据库造成重大负载的应用。 4、受到正版数据库软件用户连接数的限制,需要用少量许可提供更多客户端服务的应用。例如,10个许可提供给50个用户同时使用。
数据集组件,大家也许会首选ADO,然后说BDE太老了,DBX不敢用。其实delphi优秀的数据集组件真不少,除了上诉的数据集组件,还有ZEOSDB、SQL Direct、UniDAC等,要是专业的数据集组件,更是百花盛开,如FIBPLUS、SDAC、ODAC、DOA等等,商业和开源不尽其中!这里只讨论UniDAC和ADO的一些比较。 Delphi能发展到现在,和一些著名的第三方控件厂商大力支持分不开,这其中包括Devart公司(Corelab)公司。Corelab公司做数据集驱动非常出名,就拿ODAC、SDAC和DBX驱动来说,已经远胜其他同行的第三方控件公司。UniDAC是Devart公司最近的力作,将ODAC、SDAC、IBDAC等驱动综合集成在一块。UniDAC无论是做三层还是两层,都远胜于ADO。下面说一些UniDAC的优点: 1、非常完美的支持多数据库的数据集套件。这一点,ADO也支持多数据库,但ADO除了MSSQL驱动之外,其他驱动支持的非常差。就拿Oracle驱动来说,在调用oracle复杂的存储过程参数,总是或多或少有些问题;MSSQL企业管理器如果用了第三方驱动(比如是oracle),在导入导出数据也尚存在问题!更别提不是主流的IB数据库驱动。UniDAC支持Oracle、MSSQL、MYSQL、IB/FB、PostgreSQL。 2、对三层特性支持非常好!也许你也会问,三层也是访问DB,ADO也支持啊?!但三层最好方式是无状态方式,在高并发的处理中,一般不允许本地有数据集缓存。ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比CDS的包大几倍。CDS封包技术很好! 3、一些非常有用的属性或方法。常言道,细微之处见体贴。UniDAC有一些过人的方法或属性。比如,刷新单条记录(RefreshRecord)、多表更新的属性(UpdatingTable)、宏替换参数(Macros)、集成删除/新增/修改/刷新/锁定SQL语句、FetchRows,更让人称道的是引入了UpdateSQL组件。 在处理MSSQL新增后的自增字段,和ADO一样可以直接自动返回自增字段值,这一点,BDE不能做到、DBX不能做到、ZEOSDB不能做到。更令人称奇是,配合TUniUpdateSQL,还能自动返回自增字段值。 TUniUpdateSQL是一个好东西,ADO缺少TUdateSQL运作模式,默认的更新机制是主键字段+已变化的字段做where条件。在一般情况下是没问题,但如果这个表没有主键或where条件中的字段小数位很长导致误餐,就会产生更新找不到记录。TUdateSQL可以保证这点,运作灵活又透明。 4、对oracle支持非常好。别的不说,光是一个oracle连接的Direct Mode,不用安装oracle官方肥硕客户端(网上也有精10M左右简版的客户端),只要客户机支持TCP/IP协议即可。如果用ADO连接Oracle,必须保证先安装oracle客户端,还要配置连接文件,一堆繁琐事情。UniDAC对oracle支持的非常完美,和专业化的DOA差不多!
[转]为什么要选择UniDAC? 说到数据集组件,大家也许会首选ADO,然后说BDE太老了,DBX不敢用。其实delphi优秀的数据集组件真不少,除了上诉的数据集组件,还有ZEOSDB、SQL Direct、UniDAC等,要是专业的数据集组件,更是百花盛开,如FIBPLUS、SDAC、ODAC、DOA等等,商业和开源不尽其中!这里只讨论UniDAC和ADO的一些比较。 Delphi能发展到现在,和一些著名的第三方控件厂商大力支持分不开,这其中包括Devart公司(Corelab)公司。Corelab公司做数据集驱动非常出名,就拿ODAC、SDAC和DBX驱动来说,已经远胜其他同行的第三方控件公司。UniDAC是Devart公司最近的力作,将ODAC、SDAC、IBDAC等驱动综合集成在一块。UniDAC无论是做三层还是两层,都远胜于ADO。下面说一些UniDAC的优点: 1、非常完美的支持多数据库的数据集套件。这一点,ADO也支持多数据库,但ADO除了MSSQL驱动之外,其他驱动支持的非常差。就拿Oracle驱动来说,在调用oracle复杂的存储过程参数,总是或多或少有些问题;MSSQL企业管理器如果用了第三方驱动(比如是oracle),在导入导出数据也尚存在问题!更别提不是主流的IB数据库驱动。UniDAC支持Oracle、MSSQL、MYSQL、IB/FB、PostgreSQL。 2、对三层特性支持非常好!也许你也会问,三层也是访问DB,ADO也支持啊?!但三层最好方式是无状态方式,在高并发的处理中,一般不允许本地有数据集缓存。ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比CDS的包大几倍。CDS封包技术很好! 3、一些非常有用的属性或方法。常言道,细微之处见体贴。UniDAC有一些过人的方法或属性。比如,刷新单条记录(RefreshRecord)、多表更新的属性(UpdatingTable)、宏替换参数(Macros)、集成删除/新增/修改/刷新/锁定SQL语句、FetchRows,更让人称道的是引入了UpdateSQL组件。 在处理MSSQL新增后的自增字段,和ADO一样可以直接自动返回自增字段值,这一点,BDE不能做到、DBX不能做到、ZEOSDB不能做到。更令人称奇是,配合TUniUpdateSQL,还能自动返回自增字段值。 TUniUpdateSQL是一个好东西,ADO缺少TUdateSQL运作模式,默认的更新机制是主键字段+已变化的字段做where条件。在一般情况下是没问题,但如果这个表没有主键或where条件中的字段小数位很长导致误餐,就会产生更新找不到记录。TUdateSQL可以保证这点,运作灵活又透明。 4、对oracle支持非常好。别的不说,光是一个oracle连接的Direct Mode,不用安装oracle官方肥硕客户端(网上也有精10M左右简版的客户端),只要客户机支持TCP/IP协议即可。如果用ADO连接Oracle,必须保证先安装oracle客户端,还要配置连接文件,一堆繁琐事情。UniDAC对oracle支持的非常完美,和专业化的DOA差不多! 当然,最大的缺点是,非常贵,最贵的档次,差不多可以买半套的D2009!

4,011

社区成员

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

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