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

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

.Между прочим, приложение работает совершенно нормально!

НО ... На днях я заметил, что когда я пытался настроить приложение на другом экземпляре 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 используется для сопоставленияобъект источника данных, предоставленный пулом соединений с bean-компонентом Spring с идентификатором «dataSource»:

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

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

Не знаюне хочу, чтобы пользователь видел в своем браузере полторы сотни трассировки стека Java, а более приятное сообщение о том, что существует проблема с базой данных и т. д. Похоже, что мое приложение пытается настроить bean-компонент dataSource (в "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 Ответ

0 голосов
/ 02 апреля 2012

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

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

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

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

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

...