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