Как подключиться к базе данных / источнику данных 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 также могут оказаться полезными для этой статьи.

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

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

Другие вопросы по тегам