Как я должен соединиться с базой данных 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, так есть ли хорошее место для помещения данных о соединении? Или есть ли способ воздержаться от всего это и просто использовать соединение в проводнике источника данных?

19
задан BalusC 4 March 2016 в 14:29
поделиться

2 ответа

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

См. также:

43
ответ дан 30 November 2019 в 02:52
поделиться

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

3
ответ дан 30 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: