我们有一个大程序,使用由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套接字有问题... 目前我正在研究自动重启程序机制作为一种解决方法。
答案 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检查例程。