Использование JNDI значительно медленнее, чем явное подключение в файле persistence.xml (Jetty 9/Hibernate).

На отдельном сервере Jetty 9.4 я развертываю приложение, которое использует JPA в спящем режиме. Я наблюдал следующее странное поведение (может быть, это и не странно, я уверен, что мне просто не хватает какой-то концепции)

Если я явно объявлю свойства подключения к базе данных в XML-файле сохранения приложений, я получу 15-20 мс ответов для службы, которая считывает некоторые фиктивные данные из базы данных. Это похоже на 300 мс для первой попытки, затем срабатывает объединение.

Если я использую источник данных JNDI и ссылаюсь на него в XML-файле постоянства, я получаю 1 секунду начального времени отклика, тогда оно составляет от 300 до 400 мс в той же локальной среде.

У меня вопрос: это нормальное поведение? Всегда ли JNDI такой медленный, или это может быть просто плохая конфигурация? Это медленная реализация причала?

PS Я попытался объявить PoolDataSource в качестве ресурса JNDI, но файл persistence.xml не принимает его.

Заранее спасибо за ответы.

постоянство.xml

    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence    <?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">


<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <New id="mydatasource" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/mydatasource</Arg>
        <Arg>
            <New class="org.postgresql.ds.PGSimpleDataSource">
                <Set name="databaseName">postgres</Set>
                <Set name="serverName">localhost</Set>
                <Set name="portNumber">5433</Set>
                <Set name="user">user</Set>
                <Set name="password">password</Set>
            </New>
        </Arg>
    </New>

</Configure>
0.xsd" version="2.0"> <persistence-unit name="flapweb"> <non-jta-data-source>java:comp/env/jdbc/mydatasource</non-jta-data-source> <properties> <!--property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5433/postgres" /> <property name="javax.persistence.jdbc.user" value="user" /> <property name="javax.persistence.jdbc.password" value="password" /--> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <!-- DB Dialect --> <property name="hibernate.hbm2ddl.auto" value="update" /> <!-- create / create-drop / update --> <property name="hibernate.show_sql" value="true" /> <!-- Show SQL in console --> <property name="hibernate.format_sql" value="true" /> <!-- Show SQL formatted --> <property name="hibernate.c3p0.min_size" value="5" /> <property name="hibernate.c3p0.max_size" value="20" /> <property name="hibernate.c3p0.timeout" value="500" /> <property name="hibernate.c3p0.max_statements" value="50" /> <property name="hibernate.c3p0.idle_test_period" value="2000" /> </properties> </persistence-unit> </persistence>

Декларация JNDI источника данных

    <?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">


<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <New id="mydatasource" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/mydatasource</Arg>
        <Arg>
            <New class="org.postgresql.ds.PGSimpleDataSource">
                <Set name="databaseName">postgres</Set>
                <Set name="serverName">localhost</Set>
                <Set name="portNumber">5433</Set>
                <Set name="user">user</Set>
                <Set name="password">password</Set>
            </New>
        </Arg>
    </New>

</Configure>

person Lajos Szita    schedule 28.02.2018    source источник
comment
это не имеет ничего общего с JNDI. Как выглядит ваша конфигурация источника данных?   -  person Simon Martinelli    schedule 28.02.2018
comment
Я обновил пост. Может быть, мой класс реализации источника данных неверен?   -  person Lajos Szita    schedule 28.02.2018
comment
Что вы имеете в виду, но persistence.xml не принимает его.   -  person Simon Martinelli    schedule 28.02.2018
comment
Он ожидает класс, реализующий javax.sql.DataSource, а org.postgresql.ds.PGConnectionPoolDataSource — нет.   -  person Lajos Szita    schedule 28.02.2018
comment
у вас есть <resource-ref> для вашего jdbc/mydatasource, объявленного в вашем WEB-INF/web.xml?   -  person Joakim Erdfelt    schedule 28.02.2018
comment
@JoakimErdfelt да знаю   -  person Lajos Szita    schedule 28.02.2018
comment
возможно, вы захотите включить этот фрагмент конфигурации в свой вопрос.   -  person Joakim Erdfelt    schedule 28.02.2018
comment
Кажется, я нашел решение, но я все еще тестирую. Согласно этой документации: eclipse.org /jetty/documentation/9.4.x/ Я могу определить класс источника данных с c3po, который объединен в пул и реализует javax.sql.DataSource   -  person Lajos Szita    schedule 28.02.2018
comment
вы также можете найти в документации пример использования org.postgresql.ds.PGConnectionPoolDataSource - eclipse.org/jetty/documentation/9.4.x/   -  person Joakim Erdfelt    schedule 28.02.2018
comment
@JoakimErdfelt Я пробовал это, но, как я уже упоминал, этот класс не реализует javax.sql.DataSource, поэтому persistence.xml его не принимает.   -  person Lajos Szita    schedule 28.02.2018
comment
Попробуйте использовать пул соединений c3p0, как в документе @JoakimErdfelt.   -  person Simon Martinelli    schedule 28.02.2018


Ответы (1)


Хорошо, после многих попыток я нашел решение.

Короткий ответ: я должен использовать источник данных c3po в качестве ресурса JNDI, поэтому полученное соединение всегда будет исходить из пула. Мне также не нужны никакие настройки hibernate.c3p0.*. Пример: https://www.eclipse.org/jetty/documentation/9.4.x/jndi-datasource-examples.html#c3p0-datasource. Банки c3po и postgres должны находиться в пути к классам причала.

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

Я также не мог использовать PGConnectionPoolDataSource, потому что этот класс не реализует javax.sql.DataSource, поэтому на него нельзя ссылаться в сохраняемом xml.

Я надеюсь, что это поможет кому-то в будущем.

person Lajos Szita    schedule 28.02.2018