Как подключиться к базе данных / источнику данных JDBC в приложении на основе сервлета?
У меня есть внешний сервер MySQL, который настроен и работает нормально. Я создал соединение с базой данных в Eclipse и могу просматривать базу данных на вкладке Data Source Explorer.
Теперь у меня есть сервлет, которому нужен доступ к этой базе данных. Как мне это сделать? Есть ли способ сослаться на это соединение с базой данных, созданное в проводнике источников данных, или мне нужно все определять дважды?
Кроме того, каков наилучший способ открыть соединение? У меня есть 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, так что есть ли хорошее место для размещения данных соединения? Или есть способ отказаться от всего этого и просто использовать соединение в проводнике источников данных?
2 ответа
Обычной практикой является настройка этого как DataSource
в рассматриваемом контейнере сервлетов. Он предоставит вам средства для объединения подключений, которые значительно улучшат производительность. Также обычной практикой является вывод необработанных настроек в некоторый файл конфигурации, который помещается в путь к классам.
Если вы используете Tomcat в качестве сервлет-контейнера, вам нужно настроить источник данных в соответствии с его документацией JNDI. Вы увидите, что есть несколько способов. Самый простой способ - это создать /META-INF/context.xml
в веб-содержании вашего динамического веб-проекта (чтобы быть ясно, /META-INF
находится на том же уровне, что и /WEB-INF
веб-приложения) и заполните его чем-то вроде:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/db" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
url="jdbc:mysql://hostname.com/db"
driverClassName="com.mysql.jdbc.Driver"
username="user" password="pass"
/>
</Context>
Это примерно означает, что сервер Tomcat должен создать источник данных с именем JNDI jdbc/db
с максимум 100 активными соединениями, максимум 30 простаивающими соединениями и максимальным временем ожидания 10000 миллисекунд до того, как соединение должно быть возвращено из вашего приложения (фактически: закрыто вашим приложением, поэтому ваше приложение имеет 10 секунд между установлением соединения) и закрытие соединения). Остаток настроек должен быть вам знаком и достаточно понятен; это настройки JDBC.
Наконец, в вашем веб-проекте отредактируйте файл /WEB-INF/web.xml
добавить следующую запись:
<resource-env-ref>
<resource-env-ref-name>jdbc/db</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
Это примерно означает, что веб-приложение должно использовать предоставленный сервером источник данных с именем 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()
звонки по database.getConnection()
, Вы можете при необходимости получить значение jdbc/db
из некоторого файла конфигурации ( файл свойств?).
В качестве альтернативы, введите DataSource
через @Resource
аннотация внутри контейнера управляемого артефакта, такого как @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).