【问题标题】:Starting Windows service automatically at Windows startup that is dependent on OracleWindows 启动时自动启动依赖于 Oracle 的 Windows 服务
【发布时间】:2011-05-28 12:00:46
【问题描述】:

我开发了一个 Windows 服务,它必须在 Windows 启动期间自动启动。该服务连接到 Oracle 数据库,因此我通过 sc 命令行实用程序使我的服务依赖于 Oracle 服务: sc config MyService 依赖= OracleServiceXE/OracleXETNSListener

到目前为止一切顺利,依赖关系已成功设置。但是当 Windows 启动时,我的服务无法启动,我收到以下 (Oracle) 错误消息:“ORA-12528: TNS:listener: all appropriate instances are blocking new connections”。

我认为,Oracle 服务是在我的服务启动时启动的,但它们并未“完全初始化”。几秒钟后,我可以毫无问题地从服务控制台启动我的服务。

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

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

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

【问题讨论】:

    标签: c# windows oracle service


    【解决方案1】:

    请记住,服务启动的代码应该尽可能少。换句话说,不要让您的服务启动检查 Oracle 服务器的可用性,或者实际上做任何事情。让您的服务执行以下操作:

    • 记录它已启动的事实
    • 从配置文件/注册表/等加载任何适用的配置
    • 启动一个线程,该线程将尝试每 N 秒正确“启动”服务,并重复 M 次直到它放弃。从您的配置文件/注册表中配置 N 和 M

    让线程“尝试”连接到适用的 Oracle 服务器,如果失败,则休眠 N 秒,并执行此操作 M 次。如果它成功了,它就可以开始做它应该做的“肉”了。

    具有讽刺意味的是,Oracle 服务所做的事情可能与我建议您做的事情相似,这可能会导致您出现问题。通过在启动时将“是的,我已启动”快速返回到 Windows,它允许您的服务随后被加载,即使 Oracle 仍在忙于启动工作。理想情况下,在这种情况下,与其拒绝您的请求,Oracle 应该在准备就绪时将它们排入队列以进行处理。

    【讨论】:

    • 谢谢你的回答。这对我来说听起来很糟糕:(。我的服务必须连接到在配置文件中设置的“任何”类型的数据库(mysql、ms 访问、sqlite ...),因此它可以使用不同的 db-s 运行。我只有在 Oracle 的情况下才会出现这种问题。因此,仅仅因为 Oracle 重新设计我的应用程序对我来说听起来很糟糕。我认为有一个更直接的解决方案。:( 再次感谢!
    • @Keller,您不能确定 any 数据库服务器不会出现这种行为,因此将这种“弹性”放入您的服务。烦人,但不是世界末日!将“业务逻辑”与服务本身的核心分离的另一个好处是可测试性。为未绑定到 Windows 服务的“OnStart”方法的代码编写测试要容易得多 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多