0

Spring MVC ライブラリと Spring JDBC を使用して Oracle DB に接続する Web アプリを作成しました。(私は自分の仕事をするストアド プロシージャを Oracle で作成するため、ORM タイプ ライブラリは使用しません。これには非常に満足しています。) Tomcat コンテナによって管理される Oracle への接続プールを使用します。

ちなみに、このアプリは通常、まったく問題なく動作します。

しかし...先日、別のTomcatインスタンスでアプリをセットアップしようとしたときに、接続プールの構成を忘れていて、明らかにアプリが org.apache.commons.dbcp.BasicDataSource オブジェクトを取得できないことに気付きました、それでクラッシュしました。

Tomcat の「context.conf」でプール パラメータを定義します。

私の「web.xml」には次のものがあります。

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/Spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <!-- Map *everything* to appServlet -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

<resource-ref>
    <description>Oracle Datasource example</description>
    <res-ref-name>jdbc/ora1</res-ref-name>
    <res-type>org.apache.commons.dbcp.BasicDataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

そして、Spring " servlet-context.xml " があり、JNDI を使用して、接続プールによって提供されたデータ ソース オブジェクトを "dataSource" の ID を持つ Spring Bean にマップします。

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ora1"
    resource-ref="true" />

質問は次のとおりです。なんらかの理由でデータベースにアクセスできない場合は、どこでトラップしますか?

ユーザーがブラウザーで 1 ヤード半の Java スタック トレースを表示するのではなく、データベースに問題があることなどを知らせるより適切なメッセージをユーザーに表示させたくありません。私のアプリは "dataSource " Bean ("servlet-context.xml" 内) は、コードがテストされる前に、実際にプールから dataSource オブジェクトを提供できますか?!

アプリが起動するこれらの段階で何が起こっているのかを正確に理解していない可能性があります...

アドバイスをありがとう!

更新: 修正済み! Spring に MVC を構成させますが、コントローラーを介してデータ ソースを取得します。

ファイルからjndi-lookup行を取り出し、以下に別のクラスを追加しました。servlet-context.xmlデータベースに接続したいときにコントローラーから getJndiDataSource メソッドを呼び出し、データ ソースが必要で、データ ソース オブジェクトの取得と使用ですべてのエラーをトラップしました。

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.sql.DataSource;

public class DataSrcConfig {

   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. Tomcat ではなく Spring でデータソース オブジェクトを定義しようとしましたか? そうすれば、すべての構成パラメーターを 1 か所にまとめることができます。

  2. DBCP でvalidationQueryを使用して接続をテストしていますか?

  3. StackTrace がある場合、それをキャッチして、よりわかりやすいメッセージを表示できますか?

(また、より高速なプール実装であるBoneCPも参照してください)。

于 2012-04-02T14:04:24.223 に答える