0

在您看到的用于servlet-context.xml在 Spring MVC Web 应用程序中配置的所有示例中,所需的任何数据源都在此文件中配置为 bean,可能使用容器中定义的连接池。例如,在我servlet-context.xml的 for my中,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. 在 servlet 上下文中初始化数据源并在需要连接时从 @Controller 动态执行是否有效?与更传统的方法一样,例如:

    public static DataSource getJndiDataSource() throws NamingException {
        Context initialContext = new InitialContext();
        DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/ora1");
        return ds;
    }
    

感谢您的任何回复!

4

1 回答 1

0
  1. 用户永远不应该看到异常,期间。您应该配置一个友好的错误页面,告诉用户该站点已关闭并稍后再回来。堆栈跟踪应该只出现在您的日志中。您需要详细信息才能找出问题所在。
  2. 不,这应该由应用服务器在您的应用启动之前处理。连接池应该在您的应用启动之前成功初始化。不要尝试在 Controller 中执行此操作。

也许您的连接池配置不正确。我建议彻底擦洗以确保它是正确的。您可以使用几个参数,例如在从池中释放连接之前检查连接等。查看这些参数。

更新:

DBA 总是有可能关闭数据库。我建议您与他们进行对话,以便他们为您提供提醒和中断窗口。使您的应用可以显示“停机维护”页面,例如 Stack Overflow。

于 2012-05-31T11:47:14.093 回答