Ответ 1
Обычной практикой является настройка этого параметра как 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 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(name="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?