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;
}
}
これはStackOverflowに属しています(再投稿しないでください - 十分な人がここでそれを閉じようと投票した場合、自動化されます)。 –
私が運転しているポイントは、この状況でエラーをスローしているSpringコンテナだと思います。私が書いたコードではなく、初期化しようとしています。 – Geeb
私は、ここで何か「デカップリング」が必要だと感じています。私のMVCアプリケーションを動作させるには、データソースオブジェクトが初期化されるときに依存します。私は、システムのモデル部分(モデル、ビュー、コントローラ)が存在することを可能にするのがデータソースオブジェクトの存在であると考えます。 しかし、モデルの初期化がなければ、システムは壊れていて、コントローラを使ってビューを素晴らしいエラーメッセージに変更することはできません。 私は、アプリケーションの初期化が利用可能なデータソースに依存してはならず、データソースオブジェクトがコントローラによって要求されるべきであるという疑いがあります。 – Geeb