У меня есть внешний сервер 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, так есть ли хорошее место для помещения данных о соединении? Или есть ли способ воздержаться от всего это и просто использовать соединение в проводнике источника данных?
Обычной практикой является настройка этого как DataSource
в контейнере сервлетов. Это предоставит вам возможности пула соединений, что значительно повысит производительность. Также распространенной практикой является вынесение необработанных настроек в какой-либо конфигурационный файл, который помещается в classpath.
В случае использования Tomcat в качестве servletcontainer, вам необходимо настроить источник данных в соответствии с его 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
из какого-нибудь конфигурационного файла (Properties file?).
В качестве альтернативы, внедрите DataSource
через @Resource
аннотацию внутрь управляемого контейнером артефакта, такого как @WebServlet
класс сервлета:
@Resource(name="jdbc/db")
private DataSource dataSource;
На этом все. Просто разверните ваше веб-приложение с вышеуказанными изменениями и запустите его. Не забудьте поместить JDBC драйвер базы данных в Tomcat/lib
или добавить его путь к свойству shared.loader
в Tomcat/conf/catalina.properties
, потому что ответственность за загрузку JDBC драйвера теперь перенесена с веб-приложения на сервер. Для получения дополнительных подсказок и других базовых примеров JDBC/JNDI вы можете найти эту статью.
Вы можете установить источник данных на любом сервере приложений, на который вы развертываете свой WAR, и получить ссылку на него с помощью JNDI. Или вы можете упаковать WAR в EAR и определить источник данных в файле data-sources.xml EAR (и получить ссылку на него с помощью JNDI).