2012-04-02 20 views
0

Spring MVCライブラリとSpring JDBCを使用してOracle DBに接続するWebアプリケーションを作成しました。 (私は私のものを行うOracle上でストアドプロシージャを作成するので、私はORM型ライブラリを使用しません。私はそれに満足しています) Tomcatコンテナによって管理されるOracleへの接続プールを使用します。Spring MVC/Spring JDBC Webアプリケーションで欠落しているデータソースのエラートラップ

途中で絶対に正常に動作します!

BUT ... 先日、私は接続プールの設定を忘れてしまった別のTomcatインスタンスでアプリケーションをセットアップしようとしたときに気付きました。明らかに、アプリケーションはorg.apache.commonsを保持できませんでした.dbcp.BasicDataSourceオブジェクトはクラッシュしました。

<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> 

そして、私は春を持っている "サーブレット:

は、私は、Tomcat "context.conf" 私の "のweb.xml" で

私が持っている中で、プールのparamsを定義します-context.xml "ここで、JNDIを使用して、接続プールによって提供されるデータソースオブジェクトをID「dataSource」のSpring Beanにマップします。

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

ここに質問があります:どのような理由でデータベースにアクセスできない場合はどこでトラップしますか?

ブラウザにJavaスタックトレースのyard-and-a-halfを表示させたくないのですが、データベースの問題などがあることを伝えるより良いメッセージです。 私のアプリ任意のコードが実際にプールからdataSourceオブジェクトを提供できるかどうかをテストする前に、 "dataSource" bean( "servlet-context.xml"内)を設定しようとしていますか?

は、たぶん私は完全に...アップ発射アプリのこれらの段階で何が起こっているのかを正確にどんなアドバイスを

感謝を理解していませんよ!

更新日:固定! SpringがMVCの設定を行いますが、コントローラ経由でデータソースを取得します。

servlet-context.xmlファイルからjndi-lookup行を取り出し、別のクラスを追加しました。 私は、データベースに接続したいときに、コントローラから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; 
    } 
} 
+0

これはStackOverflowに属しています(再投稿しないでください - 十分な人がここでそれを閉じようと投票した場合、自動化されます)。 –

+0

私が運転しているポイントは、この状況でエラーをスローしているSpringコンテナだと思います。私が書いたコードではなく、初期化しようとしています。 – Geeb

+0

私は、ここで何か「デカップリング」が必要だと感じています。私のMVCアプリケーションを動作させるには、データソースオブジェクトが初期化されるときに依存します。私は、システムのモデル部分(モデル、ビュー、コントローラ)が存在することを可能にするのがデータソースオブジェクトの存在であると考えます。 しかし、モデルの初期化がなければ、システムは壊れていて、コントローラを使ってビューを素晴らしいエラーメッセージに変更することはできません。 私は、アプリケーションの初期化が利用可能なデータソースに依存してはならず、データソースオブジェクトがコントローラによって要求されるべきであるという疑いがあります。 – Geeb

答えて

0

私はいくつかの提案を持っている:

  1. あなたは春ではなく、Tomcatの中でデータソースオブジェクトを定義しようとしたことがありますか?そうすれば、すべての設定パラメータを1か所にまとめることができます。

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

  3. StackTraceがある場合は、それを捕まえて友好的なメッセージを表示できますか?

(さらに高速なプール実装であるBoneCPを参照してください)。

+0

(1)いいえ、cxnプールは他のアプリで使用されていますので、Tomcatに管理させるのが一番良いと思いましたか? (2)いいえ - 私はこれをチェックする必要があります、ありがとう。 (3)これは実際に私の質問です - どのように私はこのエラーをトラップするのですか? – Geeb

+0

上記のあなたのコメントを見て、Springが初期化中に例外をスローしている場合、Webアプリケーションが起動します。その後、ユーザーがサイトを使用する前に接続パラメータを修正できますか? – Luciano

+0

はい...通常の状況下では問題はありませんが、データベースがダウンすると(私はDBを制御しません)、私は正常に失敗するようにしたいと思います。 Tomcatで 'context.conf'を設定することを忘れていたのに、この乱雑なスタックトレースがブラウザにエコーされたことに気がついたのは、接続プールがデータソースオブジェクトを自分のアプリに渡すことができなかった理由の1つに過ぎません。これは私のコントロールの中で解決するための失敗の理由です。しかし、DBが利用できないかもしれない多くの理由があります。 – Geeb

関連する問題