2011-05-28 137 views
7

我开发了Windows服务,必须在Windows启动过程中自动启动。此服务连接到Oracle数据库,因此我通过sc命令行实用程序使我的服务依赖于Oracle服务: sc config MyService depends = OracleServiceXE/OracleXETNSListener在Windows启动时自动启动Windows服务,这取决于Oracle

到目前为止,依赖性已成功设置。但是,当Windows启动时,我的服务无法启动,我收到以下(Oracle)错误消息:“ORA-12528:TNS:侦听器:所有适当的实例阻塞新连接”。

正如我所想,Oracle服务是在我的服务启动时启动的,但它们没有“完全初始化”。几秒钟后,我可以从服务控制台开始我的服务,没有任何问题。

那么,如何在Windows启动时自动启动依赖于Oracle数据库连接的服务?

我的服务是在VS 2010环境中使用.Net 4平台上的C#开发的。

请注意。帮助我,这对我来说是一项非常重要的任务!

回答

10

请记住,服务启动的代码应尽可能少。换句话说,不要让你的服务启动检查Oracle服务器的可用性,或者确实做任何事情。让服务做到以下几点:

  • 登录,它的启动
  • 负载从配置文件/注册表/等任何适用的配置其实
  • 自旋向上的线程将尝试和“启动”服务正确地每N秒钟,并将重复M次,直到它放弃。从配置文件/注册表中配置N和M

让线程“尝试”连接到适用的Oracle服务器,如果失败,请进入睡眠N秒,然后执行此操作M次。如果成功了,它就可以开始做它应该达到的“肉”。具有讽刺意味的是,这可能是Oracle服务做了类似于我所建议的那样的事情,这会导致你的问题。通过返回“是的,我已经开始”,它在启动时很快回到Windows,它允许您的服务被加载,即使Oracle仍在忙着做东西。理想情况下,在这种情况下,Oracle应该排队处理它们,而不是拒绝您的请求。

+0

Thx你的答案。这对我来说听起来很糟糕:(我的服务必须连接到配置文件(mysql,ms access,sqlite ...)中设置的任何类型的数据库,因此它可以使用不同的db-s来运行。只有在Oracle的情况下才会出现这种问题,所以对于我来说,重新设计我的应用程序听起来非常糟糕,仅仅是因为Oracle,我认为还有一个更直接的解决方案:(Thx again! – Tom 2011-05-28 12:50:26

+1

@Keller,you can不要确定*任何*数据库服务器都不会出现这种行为,因此将这种“弹性”放入服务中并不会造成什么伤害。令人讨厌但不是世界末日!您从分离中获得的另一个优势从服务核心本身开始,您的“业务逻辑”就是可测试性;为没有绑定到Windows服务的“OnStart”方法的代码编写测试更容易=) – Rob 2011-05-28 13:43:01