2014-06-30 65 views
1
  1. 如果我将DataSource作为OSGI中的服务公开,应该如何处理数据库连接失败?我应该配置一个DataSource服务的拦截器,它将捕获数据库连接失败异常并取消注册DataSource服务?或者OSGI容器会为我处理异常?
  2. 我应该如何配置消费服务,以便它能够在DataSource服务不可用的情况下生存下来,并允许用户再次重新尝试该事务?

回答

0

您应该像处理不使用OSGi时一样处理意外的异常。

您应该使用连接池并将其注册为OSGi服务。它会为你处理连接失败。即使在使用该连接期间出现异常,您也必须始终关闭连接。 (在java 6之前的finally块中,以及在java 7之后使用try-with-resources块)。连接池通过实现DataSource接口来提供它们的功能。

有很多连接池。你可以为他们谷歌。

我实现了两个基于commons-dbcp的OSGi组件。一个用于汇集常规数据源,另一个用于汇集XADataSources。该组件选取原始DataSource/XADataSource OSGi服务,而不是注册新的池化数据源OSGi服务。

您可以在这里找到该模块的源:https://github.com/everit-org/commons-dbcp-component

它可在Maven的中央位置:http://search.maven.org/#artifactdetails%7Corg.everit.osgi%7Corg.everit.osgi.jdbc.commons.dbcp%7C2.0.1%7Cbundle

下降罐子到您的OSGi容器后,你会看到的配置可能性WebConsole配置页面上的组件(如果您有webconsole)。

+0

>>它会为你处理连接失败<<您是否在说OSGI容器将捕获数据库连接失败异常并取消注册DataSource服务? – isobretatel

+0

否。池数据源将按照您的配置进行操作。例如:它可以在提供任何连接之前运行检查SQL,并在数据库不可用时等待超时。即使数据库不可用,DataSource服务仍保持注册状态。 –