BDE多线程错误:遇到ora-12560时,无法重启TDatabase

时间:2009-07-06 02:12:29

标签: oracle delphi bde ora-12560

我们有一个大程序,使用由delphi开发的BDE + oracle, 我们使用3个线程来执行数据库操作,它们使用分离的TSession。 (1个deamon线程,1个数据收集线程,1个检查线程)

我们使用这种结构:

  

TQuery - > TDatabase - > TSession

我们使用此方法进行查询:

try
  qu.close;  //TQuery
  qu.sql.clear;
  qu.sql.add('select foo from db_foos');
  qu.open;
except
  on e:Exception do
  begin
    db.close; // db is TDatabase, We use this to auto restart connection when network fail.
    error(e.message);
  end;
end;
问题是,当我们的程序运行超过24小时时, ora-12560出现,我们的程序无法重新启动连接,并在执行查询时继续报告此错误。

我们已经审核了代码,整整一周调试过,仍然无法解决, 你们遇到同样的问题吗?

编辑:

我们有这个测试用例:

3个程序,每个程序运行一个线程(1秒钟睡眠),并且在0.5-1个小时之间,它们都同时失败。 (3个DB操作,1个Indy9 ftp客户端......)

所以我认为BDE或Windows套接字有问题... 目前我正在研究自动重启程序机制作为一种解决方法。

2 个答案:

答案 0 :(得分:0)

显然,这是一个常见问题,Oracle客户端会忘记它应该连接的位置。也许其中一个会有所帮助:

http://www.cryer.co.uk/brian/oracle/ORA12560.htm

http://www.dba-oracle.com/t_ora_12560_tns_protocol_adapter_error.htm

答案 1 :(得分:0)

有一个单独的基于计时器的例程来保持数据库始终处于打开状态 - 这就是我们根据上述评论所做的事情。 IE当数据库断开连接时,立即重新打开它,不要依赖查询为你自动打开它。使用计时器定期检查数据库是否仍然(真的)打开。这样我们就不会使用单独的线程来避免跨线程问题,但在我们的例子中,每个客户端都有一个连接。每台客户端PC都会收集数据,工厂中有许多客户端PC。

在您的情况下,您可能需要在每个线程中都有DB检查例程。