Перехват ошибок для отсутствующего источника данных в веб-приложении 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 ответ
У меня есть несколько предложений:
Вы пытались определить объект источника данных в Spring, а не в Tomcat? Таким образом, все ваши параметры конфигурации будут храниться в одном месте.
Используете ли вы validationQuery на DBCP для проверки соединений?
Если есть StackTrace, можете ли вы поймать его и показать более дружеское сообщение?
(Также взгляните на BoneCP, который является более быстрой реализацией пула).