多线程下数据库错误(120分)

  • 主题发起人 主题发起人 Magic
  • 开始时间 开始时间
M

Magic

Unregistered / Unconfirmed
GUEST, unregistred user!
程序24小时工作,共用了12个线程。每天总会报几个错误,不管怎样拦截(try),总会弹出错误窗口。错误信息大致如下:
1.Access violation at address 00000000. Read of address 00000000。
2.Access violation at address EDB4E2BF. Read of address EDB4E2BF
3.List index out of bounds (14)
 
我的服务也是多线程的! 开五个线程.一直没完没了的开.没有出现过任何指针
错误! 主要是作好线程同步就好了! 没有什么的. 你这样提问相信也不会得到答案的
你还得自己修改代码吧
 
主要是通过ADO与ORACLE数据库打交道,报错也就体现在数据库操作上。
没有规律,也不特别频繁。所以才问问,那位写过数据库多线程的给体个建议。
 
遇到过[:D]
 
如果在多个线程中引用同一个数据对象(如tadoquery)同时在操作时没有使用同步,那出问题就正常了。
 
TADOConnection使用同一个,其他的都是动态创建,如:
adoQueAcct := TADOQuery.Create(dmMain);
估计这个问题挺难的,目前关于线程与数据库的书也很少,都只能摸索了。希望相互帮帮。
 
如果这样,那问题就不是TADOConnection,TADOQuery之间,但如果逻辑没有问题,那应该就是同步的问题,就如你所说,在一个系统中查找同步问题是较繁琐的,需要经验、技术、耐心。
 
没同步TADOConnection肯定会出问题,如果某一时刻多个线程同时使用TADOConnection连接数据库进行操作会产生不可预计的结果,线程中一定要慎用全局对象,用也要做好同步,这种问题在后期可是很难发现,建议为每个线程创建一个TADOConnection,避免同步!
 
行,我来为每个线程创建一个TADOConnection试试。另外给我说说同步:怎么同步,同步注意哪些问题,谢谢。
 
用临界区,互斥量都可以,网上查下有很多这方面的资料
 
刚才看了一下ado的vcl源代码,由于Adoconnection的注册机制发现其不是一个线程安全的至少在注册及注销过程是这样的。又看了一下opencursor方法,发现其在执行数据操作的时候如果使用的是connectionstring那是每个adodataset控件使用一个连接对象(在服务端就对应一个连接进程),而使用connection方式连接是使用关联的adoconnection的_connnection对象,看到这里问题就明了了,如果adoconnection的_connection对象是线程安全的那么使用connection方式连接就是最好最理想的,现在关键的问题是微软在实现_connection对象的时候是否是线程安全的,我还不知道至少msdn上我没有查到,希望知道的朋友给解释一下。另外说一句,如果你的线程数量较多,不如20多个那最好不要使用每个线程一个adoconnection或adodataset.connectionstring的方式连接数据库,道理就是你方便了,服务器可倒霉了,需要为你维护20多个连接进程,这样几个客户端上去了,你的服务器就当掉了。
 
Oracle不知道
SQL Server用过,每个线程一个ADOconnection确实加重服务器的负荷,但好想没有什么更好的办法~
 
如果你不许使用多连接,推荐你使用连接池的方式,虽然代码或多一些,但各个方面都兼顾了。
 
后退
顶部