DataSource в Tomcat context.xml не найден [дубликат]

Поскольку этот поток немного разветвился в общем обсуждении текущих реализаций с плавающей запятой, я бы добавил, что есть проекты по исправлению их проблем.

Взгляните на https: // posithub.org/, который демонстрирует тип номера, называемый posit (и его предшественник unum), который обещает предложить лучшую точность с меньшим количеством бит. Если мое понимание верное, оно также фиксирует проблемы в вопросе. Весьма интересный проект, человек, стоящий за ним, является математиком Dr. Джон Густафсон . Все это с открытым исходным кодом, с множеством реализаций в C / C ++, Python, Julia и C # ( https://hastlayer.com/arithmetics ).

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

2 ответа

Обычная практика состоит в том, чтобы сконфигурировать это как DataSource в контейнере сервлетов . Он предоставит вам средства объединения пулов, которые значительно улучшат производительность. Также обычной практикой является экстернализация исходных настроек в каком-либо файле конфигурации, который был помещен в путь к классам.

Если вы используете Tomcat в качестве servletcontainer, вам необходимо настроить источник данных в соответствии с его документацией JNDI . Вы увидите, что есть несколько способов. Самый простой способ - создать /META-INF/context.xml в webcontent вашего динамического веб-проекта (ясно, что /META-INF находится на том же уровне, что и /WEB-INF webapp) и заполнить его чем-то вроде:

<?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 вы можете найти эту статью .

См. Также:

40
ответ дан Community 23 August 2018 в 15:41
поделиться

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

3
ответ дан Voytek Jarnot 23 August 2018 в 15:41
поделиться
Другие вопросы по тегам:

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