Как подключиться к базе данных JDBC / источнику данных в приложении на основе сервлета?

У меня есть внешний MySQL-сервер, который настроен и работает нормально. Я создал соединение с базой данных в Eclipse и может просматривать базу данных на вкладке «Источник данных».

Теперь у меня есть сервлет, которому необходимо получить доступ к этой базе данных. Как мне это сделать? Есть ли способ ссылаться на это соединение с базой данных, созданное в проводнике источника данных, или мне нужно определить все дважды?

Также, как лучше всего открыть соединение? У меня есть файл mysql-connector-java-5.1.11-bin.jar , и я нашел два метода, которые работают:

 MysqlDataSource d = new MysqlDataSource(); d.setUser("user"); d.setPassword("pass"); d.setServerName("hostname.com"); d.setDatabaseName("db"); Connection c = d.getConnection(); 

а также

 Connection c = DriverManager.getConnection("jdbc:mysql://hostname.com/db","user","pass"); 

Ни один из них не является оптимальным, потому что, прежде всего, они используют жестко закодированные строки для всего. Это проект веб-приложений Java EE, так что есть хорошее место для размещения данных соединения? Или есть способ отказаться от всего этого и просто использовать соединение в проводнике источника данных?

Общей практикой является настройка этого как источника данных в соответствующем контейнере сервлетов . Он предоставит вам средства объединения пулов, которые значительно улучшат производительность. Также распространенной практикой является экстернализация исходных настроек в каком-либо файле конфигурации, который был помещен в путь к classам.

Если вы используете Tomcat как servletcontainer, вам нужно настроить источник данных в соответствии с его документацией JNDI . Вы увидите, что есть несколько способов. Самый простой способ – создать /META-INF/context.xml в webcontent вашего динамического веб-проекта (чтобы быть ясным, /META-INF находится на том же уровне, что и /WEB-INF для webapp) и заполнить его с чем-то вроде:

     

Это примерно означает, что сервер Tomcat должен создать источник данных с именем JNDI jdbc/db с максимум 100 активными соединениями, максимум 30 незанятых соединений и максимальным временем ожидания 10000 миллисекунд, прежде чем соединение должно быть возвращено из вашего приложения (на самом деле : закрыто вашим приложением, поэтому ваше приложение имеет 10 секунд времени между приобретением соединения и закрытием соединения). Остальные настройки должны быть знакомы и достаточно объяснять вам; это настройки JDBC.

Наконец, в своем веб-проекте отредактируйте файл /WEB-INF/web.xml чтобы добавить следующую запись:

  jdbc/db javax.sql.DataSource  

Это примерно означает, что веб-приложение должно использовать предоставленный сервером источник данных с именем jdbc/db .

Затем измените свой диспетчер подключений на что-то вроде этого:

 private DataSource dataSource; public Database(String jndiname) { try { dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + jndiname); } catch (NamingException e) { // Handle error that it's not configured in JNDI. throw new IllegalStateException(jndiname + " is missing in JNDI!", e); } } public Connection getConnection() { return dataSource.getConnection(); } 

.. и заменить все Class.forName(driver) new Database("jdbc/db") и заменить все DriverManager.getConnection() по DriverManager.getConnection() database.getConnection() . Вы можете при необходимости получить значение jdbc/db из некоторого файла конфигурации ( файл свойств? ).

В качестве альтернативы, введите DataSource через аннотацию @Resource внутри артефакта, управляемого контейнером, например, @WebServlet сервлета @WebServlet :

 @Resource("jdbc/db") private DataSource dataSource; 

Это должно быть так. Просто разверните веб-приложение с указанными выше изменениями и запустите его. Не забудьте поместить драйвер JDBC базы данных в Tomcat/lib или добавить его путь к свойству shared.loader Tomcat/conf/catalina.properties , поскольку ответственность за загрузку драйвера JDBC теперь переносится с веб-приложения на сервер. Для получения дополнительных советов и других основных примеров JDBC / JNDI вы можете найти эту статью полезной.

Смотрите также:

  • Как установить драйвер JDBC в веб-проект Eclipse без обращения к java.lang.ClassNotFoundexception
  • Где я должен разместить драйвер JDBC для пула соединений Tomcat?
  • Можно ли использовать статический экземпляр java.sql.Connection в многопоточной системе?
  • Показать JDBC ResultSet в HTML на странице JSP с использованием шаблонов MVC и DAO
  • Как получить и отобразить изображения из базы данных на странице JSP?

Вы можете настроить источник данных на любом сервере приложений, на котором развертывается WAR, и получить ссылку на него с помощью JNDI. Или вы можете упаковать свою WAR в EAR и определить источник данных в файле data-sources.xml EAR (и получить ссылку на него с помощью JNDI).

  • Spring Boot - как настроить порт
  • SSLHandshakeException: нет альтернативных имен объектов
  • Фоновая тема для приложения сервлетов Tomcat
  • Tomcat начал работать в Eclipse, но не смог подключиться к http: // localhost: 8085 /
  • Максимальный допустимый размер HttpRequest в tomcat?
  • Подключение удаленного экземпляра tomcat JMX с помощью jConsole
  • Как получить сообщение на странице пользовательской ошибки (Tomcat)?
  • Статус HTTP 404 - запрашиваемый ресурс (/ имя_проекта /) недоступен
  • Отображение определенного сервлета в качестве сервлета по умолчанию в Tomcat
  • Tomcat VS Jetty
  • JSP для создания таблицы Excel (XLS) для загрузки
  • Interesting Posts

    Java: Исключения в качестве streamа управления?

    Прокрутка JTable до указанного указателя строки

    Что такое хороший уникальный идентификатор ПК?

    Тип указателя ‘this’

    Выберите каждый элемент N в CSS

    Массовая копия DataTable в MySQL (аналогично System.Data.SqlClient.SqlBulkCopy)

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

    Преобразование NSDate в NSString

    Как конкретно свойство «Специфическая версия» ссылки на сборку работает в Visual Studio?

    У VBA есть структура словаря?

    Сравнение двух массивов и получения значений, которые не являются общими

    Лучший способ хранения даты / времени в mongodb

    Как получить идентификатор fragmentа (значение после hashа #) из URL-адреса?

    Проблема с обнаружением изменений. Почему это изменяется, когда это одна и та же ссылка на объект с On Push

    Перемещение меньшего жесткого диска для разделения на более крупном жестком диске

    Давайте будем гением компьютера.