Автор оригинала: Pankaj Kumar.
Добро пожаловать в примерный учебник Tomcat DataSource JNDI. Мы рассмотрели источник данных JDBC в последнем руководстве и узнали, как использовать его в автономном приложении java.
Источник данных Tomcat JNDI
Фактическая выгода источника данных достигается, когда мы используем его в контексте JNDI . Например, пул соединений в веб-приложении, развернутом в контейнере сервлетов. Большинство популярных контейнеров сервлетов обеспечивают встроенную поддержку источника данных с помощью конфигурации ресурсов и контекста JNDI. Это помогает нам создавать и использовать пул соединений с источниками данных всего с несколькими строками конфигурации. Этот учебник предназначен для предоставления примера конфигурации JNDI источника данных Tomcat.
Apache Tomcat предоставляет три способа настройки источника данных в контексте JNDI.
Применение context.xml – Это самый простой способ настройки источника данных, все, что нам нужно, – это context.xml файл в каталоге META-INF. Мы должны определить элемент ресурса в файле контекста, и контейнер позаботится о его загрузке и настройке. Подход прост, но у него есть некоторые недостатки;
- Поскольку файл контекста входит в комплект с файлом WAR, нам необходимо создавать и развертывать новую войну для каждого небольшого изменения конфигурации. Та же проблема возникает, если ваше приложение работает в распределенной среде или его необходимо развернуть в различных средах тестирования, таких как QA, IT, PROD и т.д.
- Источник данных создается контейнером только для использования приложением, поэтому его нельзя использовать глобально. Мы не можем совместно использовать источник данных в нескольких приложениях.
- Если существует глобальный источник данных (server.xml), определенный с тем же именем, источник данных приложения игнорируется.
- Сервер context.xml – Если на сервере несколько приложений и вы хотите поделиться источником данных между ними, мы можем определить это на сервере context.xml файл. Этот файл находится в каталоге
apache-tomcat/conf
. Область применения сервера context.xml файл-это приложение, поэтому, если вы определяете пул подключений к источнику данных из 100 подключений и 20 приложений, то источник данных будет создан для каждого приложения. Это приведет к 2000 подключениям, которые, очевидно, потребят все ресурсы сервера базы данных и снизят производительность приложений. - server.xml и context.xml – Мы можем определить источник данных на глобальном уровне, определив их в server.xml
Глобальные именные ресурсы
элемент. Если мы используем этот подход, то нам нужно определитьСсылку на ресурс
из context.xml файл конкретного сервера или приложения. Это предпочтительный способ, когда вы хотите совместно использовать общий пул ресурсов для нескольких приложений, работающих на сервере. Что касается ссылки на ресурс, то определение ее на уровне xml-файла контекста на уровне сервера или на уровне приложения зависит от ваших требований.
Давайте перейдем к примеру Tomcat DataSource JNDI в веб-приложении java.
Для настройки тестовых данных, пожалуйста, обратитесь к моей последней статье о примере источника данных JDBC .
Пример конфигурации JNDI источника данных Tomcat – server.xml
Добавьте приведенный ниже код в tomcat server.xml файл. Код должен быть добавлен в элемент GlobalNamingResources
. Также убедитесь, что драйвер базы данных присутствует в каталоге библиотеки tomcat, поэтому в этом случае jar mysql jdbc должен присутствовать в библиотеке tomcat.
Здесь мы создаем контекст JNDI с именем jdbc/MyDB
, который является типом источника данных. Мы передаем конфигурации базы данных в URL-адресе, имени пользователя, пароле и атрибуте driverClassName. Свойства пула соединений определены в атрибутах maxActive, maxIdle и minIdle.
Конфигурация ссылки на ресурс JNDI источника данных Tomcat – context.xml
Добавьте приведенный ниже код на сервер context.xml файл.
Обратите внимание, что имя ссылки на ресурс отличается от глобальной ссылки, мы должны использовать это имя в нашей программе java, чтобы получить источник данных.
Пример JNDI источника данных Tomcat
Создайте динамическое веб-приложение с именем Источник данных JDBC Tomcat , а затем создайте сервлет с приведенным ниже кодом.
package com.journaldev.jdbc.datasource; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; @WebServlet("/JDBCDataSourceExample") public class JDBCDataSourceExample extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Context ctx = null; Connection con = null; Statement stmt = null; ResultSet rs = null; try{ ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB"); con = ds.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("select empid, name from Employee"); PrintWriter out = response.getWriter(); response.setContentType("text/html"); out.print("Employee Details
"); out.print("
Employee ID | "); out.print("Employee Name | "); while(rs.next()) { out.print("
---|---|
" + rs.getInt("empid") + " | "); out.print("" + rs.getString("name") + " | "); out.print("
"); //lets print some DB information out.print("
Database Details
"); out.print("Database Product: "+con.getMetaData().getDatabaseProductName()+""); out.print("Database Driver: "+con.getMetaData().getDriverName()); out.print(""); }catch(NamingException e){ e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ try { rs.close(); stmt.close(); con.close(); ctx.close(); } catch (SQLException e) { System.out.println("Exception in closing DB resources"); } catch (NamingException e) { System.out.println("Exception in closing Context"); } } } }
Обратите внимание, что я использую конфигурацию на основе аннотаций сервлета 3, и она будет работать в версиях Tomcat 7 или выше. Если вы используете более низкую версию Tomcat, вам необходимо внести некоторые изменения в код сервлета, удалить аннотацию веб-сервлета и настроить в web.xml файл.
Та часть кода сервлета, которая нас интересует;
ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
Это способ получить ресурсы JNDI, определенные для использования приложением. Мы могли бы написать это и таким образом;
ctx = new InitialContext(); Context initCtx = (Context) ctx.lookup("java:/comp/env"); DataSource ds = (DataSource) initCtx.lookup("jdbc/MyLocalDB");
Я также печатаю некоторую информацию о базе данных, чтобы проверить, к какой базе данных мы подключены.
Теперь, когда вы запустите приложение, вы увидите следующий вывод.
Давайте посмотрим, насколько легко переключить сервер базы данных, потому что мы используем источник данных Tomcat. Все, что вам нужно, – это изменить свойства базы данных. Поэтому, если нам придется переключиться на базу данных Oracle, моя конфигурация ресурсов будет выглядеть следующим образом.
И когда мы перезапустим сервер и запустим приложение, оно подключится к базе данных Oracle и выдаст результат ниже.
Это все для примера руководства по настройке JNDI источника данных Tomcat, вы можете определить ресурс аналогичным образом в context.xml файлы тоже.