0

Spring MVC Web アプリで構成するために表示されるすべての例servlet-context.xmlで、必要なデータソースはすべて、おそらくコンテナーで定義された接続プールを使用して、このファイルで Bean として構成されます。たとえば、 my servlet-context.xmlfor myorg.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 アプリが初期化段階でエラーになり、1 ヤード半の 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) 

... 等々。

2 つの質問があります。

  1. このエラーをトラップして、ユーザーにとってよりわかりやすいものを表示することは可能ですか? init()個人的には、サーブレットがステージを超えられないのではないかと疑っています。
  2. 接続が必要なため、サーブレットコンテキストでデータソースを初期化し、@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. いいえ、これはアプリを起動する前にアプリサーバーで処理する必要があります。アプリが起動する前に、接続プールが正常に初期化されている必要があります。コントローラでそれを行おうとしないでください。

おそらく、接続プールの構成が正しくありません。それが正しいことを確認するために、それを徹底的にこすり洗いすることをお勧めします。プールから解放される前に接続をチェックするなど、いくつかのパラメーターを使用できます。それらを調べてください。

アップデート:

DBAがデータベースを停止することは常に可能です。彼らとの対話を開始して、彼らがあなたにヘッドアップと停止ウィンドウを与えるようにすることをお勧めします。アプリが「メンテナンスのためのダウン」ページ、つまりStackOverflowを表示できるようにします。

于 2012-05-31T11:47:14.093 に答える