Как подключиться к базе данных / источнику данных JDBC в приложении на основе сервлета? - PullRequest
18 голосов
/ 19 февраля 2010

У меня есть внешний сервер 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 ]

42 голосов
/ 20 февраля 2010

Обычная практика заключается в настройке этого параметра как 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 вы можете найти этой статьей также полезной.

См. Также:

3 голосов
/ 20 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...