Spring MVC和JDBC数据源

时间:2012-05-31 11:40:03

标签: spring-mvc error-handling datasource

在Spring MVC web-app中配置servlet-context.xml的所有示例中,所需的任何数据源都配置为此文件中的bean,可能使用容器中定义的连接池。例如,在我的servlet-context.xml org.springframework.web.servlet.DispatcherServlet中,我初始化了我的数据源:

<jee:jndi-lookup id="dataSource"
jndi-name="java:comp/env/jdbc/ora1"
expected-type="javax.sql.DataSource"
resource-ref="true" />

如果由于某种原因导致数据库出现故障,那么初始化阶段的Web应用程序错误会将大约一半的Java堆栈跟踪抛入浏览器,如下所示:

javax.servlet.ServletException: Servlet.init() for servlet appServlet threw exception at      
org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1214) at  
org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809) at 
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:615) 

......等等。

我有两个问题:

  1. 是否可以捕获此错误并向用户显示更友好的内容?我个人怀疑这是因为servlet无法超越init()阶段。
  2. 是否有效 NOT 来初始化servlet上下文中的数据源并从@Controller动态执行,因为需要连接?与更常规的方法一样,例如:

    public static DataSource getJndiDataSource() throws NamingException {
        Context initialContext = new InitialContext();
        DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/ora1");
        return ds;
    }
    
  3. 感谢您的回复!

1 个答案:

答案 0 :(得分:0)

  1. 用户永远不应该看到例外情况。您应该配置一个友好的错误页面,告诉用户该站点已关闭并稍后返回。堆栈跟踪应仅出现在您的日志中。您需要详细信息来确定问题所在。
  2. 不,这是在应用程序启动之前应由应用服务器处理的内容。应用程序启动之前,应成功初始化连接池。不要尝试在Controller中执行此操作。
  3. 也许您的连接池配置不正确。我建议彻底擦洗,以确保它是正确的。您可以使用多个参数,例如在从池中释放连接之前检查连接等。查看这些参数。

    更新:

    DBA始终可以关闭数据库。我建议你与他们发起一个对话,这样他们就会给你一个抬头和一个停机窗口。使您的应用程序可以显示“向下维护”页面,即“堆栈溢出”。