0

我们有一个大程序,使用BDE + oracle,由delphi开发,我们使用3个线程进行DB操作,它们使用分离的TSession。(1个守护线程,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个数据库操作,1个Indy9 ftp客户端...)

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

4

2 回答 2

0

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

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

于 2009-07-07T13:46:43.943 回答
0

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

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

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

于 2009-07-06T18:41:55.030 回答