Перехват ошибок для отсутствующего источника данных в веб-приложении Spring MVC / Spring JDBC

Я написал веб-приложение, которое использует библиотеки Spring MVC и Spring JDBC для подключения к БД Oracle. (Я не использую никаких библиотек типов ORM, поскольку создаю хранимые процедуры в Oracle, которые выполняют свою работу, и я вполне доволен этим.) Я использую пул соединений с Oracle, управляемый контейнером Tomcat

Кстати, приложение работает абсолютно нормально!

НО... Я заметил на днях, когда пытался настроить приложение на другом экземпляре Tomcat, о котором я забыл настроить пул соединений, и, очевидно, приложение не может получить объект org.apache.commons.dbcp.BasicDataSource. так что разбился.

Я определяю параметры пула в коте " 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 используется для сопоставления объекта источника данных, предоставленного пулом соединений, с компонентом Spring с идентификатором "dataSource":

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

Вот вопрос: где я могу уловить случай, когда база данных не может быть доступна по какой-либо причине?

Я не хочу, чтобы пользователь видел в своем браузере половину трассировки стека Java, а более приятное сообщение о том, что существует проблема с базой данных и т. Д. Похоже, что мое приложение пытается настроить "источник данных" "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;
   }
}

1 ответ

У меня есть несколько предложений:

  1. Вы пытались определить объект источника данных в Spring, а не в Tomcat? Таким образом, все ваши параметры конфигурации будут храниться в одном месте.

  2. Используете ли вы validationQuery на DBCP для проверки соединений?

  3. Если есть StackTrace, можете ли вы поймать его и показать более дружеское сообщение?

(Также взгляните на BoneCP, который является более быстрой реализацией пула).

Другие вопросы по тегам