Интеграция JNDI DataSource Tomcat и Spring: подключение MySQL
Быстрый ответ
Для использования JNDI DataSource, предоставляемого Tomcat, в вашем Spring приложении, вам следует составить описание бина DataSource
в файле applicationContext.xml
. Тег jee
в Spring значительно упрощает процедуру конфигурации:
XML конфигурация:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/MyDataSource"
expected-type="javax.sql.DataSource"/>
Значение jndi-name
должно соответствовать наименованию, заданному в настройках Tomcat.
При использовании аннотаций в конфигурации, определите бин в классе с применением аннотации @Configuration
:
@Bean
public DataSource dataSource() throws NamingException {
return (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDataSource");
}
Затем произведите инъекцию myDataSource
в компоненты Spring для работы с источником данных, управляемым Tomcat.
Конфигурация DataSource: более глубокий взгляд
Настройка свойств DataSource
Настройка производительности DataSource играет важнейшую роль. Укажите параметры DataSource
в файле server.xml
Tomcat, чтобы обеспечить оптимальную работу вашего приложения. Пример конфигурации:
Tomcat server.xml:
<Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="20" validationQuery="SELECT 1" .../>
Для корректной работы следует добавить указанные настройки в файл context.xml
.
Обработка исключений NamingException
Во время эксплуатации JNDI могут произойти ошибки типа NamingException
. Важно обработать их правильно. Логируйте исключения для последующего анализа:
try {
dataSource = (DataSource) new InitialContext().lookup(jndiName);
} catch (NamingException e) {
logger.error("Произошла ошибка при попытке найти JNDI DataSource. Возникла проблема при 'поиске ключей' :)", e);
throw e;
}
Визуализация
Представьте себе Spring приложение (🏙️) и JNDI DataSource
, предоставляемый Tomcat (🚰):
Tomcat’s DataSource 🚰 -- Предоставляет первичный ресурс: соединение с базой данных.
@Bean
public DataSource dataSource() throws NamingException {
return (DataSource) new InitialContext().lookup("java:comp/env/jdbc/YourDB");
}
// Связывает ваше приложение 🏙️ с общедоступным водопроводом 🚰
Spring приложению необходимо лишь подключиться к этой инфраструктуре:
// 🏙️ (Spring)
💧 = @Resource(name = "jdbc/YourDB")
private DataSource dataSource;
// Подключает водопровод к водораспределительной системе города
Процесс ясный и наглядный, не правда ли? 🚰➡️🏙️
Уточнение JNDI названий
Важно указывать jndi-name
точно в вашей Spring конфигурации – оно должно совпадать с наименованием в файле context.xml
Tomcat.
Осваивание конфигураций
Применяйте разнообразные способы конфигурации, исходя из условий развертывания:
- Централизуйте конфигурацию DataSource с применением тега
Resource
вMETA-INF/Context.xml
. - Ознакомьтесь с документацией Tomcat 8 и Spring 4, чтобы освоить более продвинутые методы настройки JNDI и DataSource.
Упрощенная конфигурация с Spring
Упрощайте настройку JNDI в Spring, используя JndiTemplate
в JavaConfig. Это позволит быстро создавать бин DataSource
при помощи JNDI.
@Bean
public JndiTemplate jndiTemplate() {
return new JndiTemplate();
}
@Bean
public DataSource dataSource(JndiTemplate jndiTemplate) throws NamingException {
// Для объяснения, что такое JNDI: это своего рода глобального адресного справочника для вашего приложения!
return jndiTemplate.lookup("java:comp/env/jdbc/MyDataSource", DataSource.class);
}
Полезные материалы
- Apache Tomcat 9 (9.0.85) – JNDI Datasource How-To — Официальное руководство Tomcat по настройке JNDI DataSource.
- Начало работы | Доступ к данным с JPA — Углубленное руководство по использованию JPA при осуществлении доступа к данным в Spring.
- Урок: Обзор JNDI (Учебные пособия Java™ > Java Naming and Directory Interface) — Обучающий материал Oracle со сводными данными и примерами работы с JNDI.
- Spring Framework 6.1.3 API – JndiObjectFactoryBean — Подробное описание
JndiObjectFactoryBean
в Spring. - Расчет PageRank для разреженных ориентированных графов с большим процентом неработающих ссылок — Обсуждение на Stack Overflow по вопросам использования JNDI DataSource в Spring.