настраиваемый пул соединений jpa

Я успешно интегрировал спящий режим в свое веб-приложение. Я был доволен своей persistence.xml конфигурацией

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="PU">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.connection.url" value="jdbc:sqlite:/tmp/database.db" />
            <property name="hibernate.connection.driver_class" value="org.sqlite.JDBC" />
        </properties>
    </persistence-unit>
</persistence>

Затем я решил использовать пул соединений HikariCp после прочтения это

Встроенный пул соединений не предназначен для производственных сред.

С помощью этого примера мне удалось частично заставить его работать с новым persistence.xml

<persistence-unit name="PU">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
            <property name="hibernate.hikari.minimumPoolSize" value="20" />
            <!-- <property name="hibernate.hikari.maximumPoolSize" value="100" /> -->
            <property name="hibernate.hikari.idleTimeout" value="30000" />
            <property name="hibernate.hikari.dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
            <property name="hibernate.hikari.dataSource.url" value="jdbc:sqlite:/tmp/database.db" />
            <!-- <property name="hibernate.hikari.dataSource.user" value="" />
            <property name="hibernate.hikari.dataSource.password" value="" /> -->
        </properties>
    </persistence-unit>

Но я получаю сообщение об ошибке, если пытаюсь установить minimumPoolSize, maximumPoolSize, пользователя и пароль. Если их закомментировать, все работает отлично.

org.hibernate.HibernateException: java.lang.RuntimeException: java.beans.IntrospectionException: метод не найден: setMinimumPoolSize

Как настроить jpa для использования спящего режима с пулом hikaricp? Я предпочитаю не разбрасывать в своем коде вещи, специфичные для гибернации, поскольку я хочу сохранить абстрактный уровень ORM. Я нашел много запутанных материалов и получил больше вопросов, чем ответов. Как файлы persistence.xml, hibernate.properties и hibernate.cfg.xml связаны друг с другом? Что такое JNDI и как его использовать? И что такое эта конфигурация компонента?


person gkiko    schedule 04.03.2015    source источник
comment
Файлы hibernate.* не имеют ничего общего с JPA и не должны использоваться, если вы хотите оставаться переносимым. Любой пул соединений может либо использовать внутренний код реализации JPA (как вы пытаетесь), либо вы можете просто настроить javax.sql.DataSource, который настроен для обеспечения пула (и затем его можно использовать с ЛЮБОЙ реализацией JPA)   -  person Neil Stockton    schedule 04.03.2015
comment
Если вы имеете дело с JPA, беспокойтесь только о файле persistence.xml для конфигурации. если вы помещаете что-то в файлы hibernate.*, то вы настраиваете специальные параметры Hibernate, а это не то, что вам нужно. Вы будете использовать JNDI для части источника данных, если у вас есть корпоративный сервер (Jboss, weblogic, websphere), вы сможете создать источник данных в консоли администратора сервера (включая конфигурацию пула) и назначить ему имя JNDI. . Вместо настройки соединений, пулов соединений и т. д. в файле persistence.xml вы просто указываете имя jndi в том же файле.   -  person Zeus    schedule 04.03.2015
comment
Является ли настройка javax.sql.DataSource такой же, как настройка JNDI? Должен ли я в этом случае настраивать определенный файл Catalina на каждом сервере, на котором я развертываю свое веб-приложение?   -  person gkiko    schedule 05.03.2015


Ответы (2)


Извините за оригинальный вопрос. После дополнительных исследований я нашел решение. Это работает persistence.xml. Я думаю, что user и password нельзя установить в sqlite. минимумPoolSize -> минимумIdle

<properties>
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    <property name="hibernate.hbm2ddl.auto" value="validate" />
    <property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
    <property name="hibernate.show_sql" value="false" />
    <property name="hibernate.format_sql" value="true" />
    <property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
    <property name="hibernate.hikari.minimumIdle" value="20" />
    <property name="hibernate.hikari.maximumPoolSize" value="100" />
    <property name="hibernate.hikari.idleTimeout" value="30000" />
    <property name="hibernate.hikari.dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
    <property name="hibernate.hikari.dataSource.url" value="jdbc:sqlite:/tmp/database.db" />
</properties>

Как предложили @neil и @zeus, вот еще одна конфигурация с использованием JNDI.

<properties>
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    <property name="hibernate.hbm2ddl.auto" value="validate" />
    <property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect" />
    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.format_sql" value="true" />
    <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/SQLiteHikari"/>
</properties>

src-> main-> webapp-> META-INF-> context.xml

<Context antiJARLocking="true" path="/nbs">
    <Resource name="jdbc/SQLiteHikari" 
        auth="Container"
        factory="com.zaxxer.hikari.HikariJNDIFactory"
        type="javax.sql.DataSource"
        minimumIdle="20"
        maximumPoolSize="100"
        connectionTimeout="300000"
        dataSourceClassName="org.sqlite.SQLiteDataSource"
        dataSource.url="jdbc:sqlite:/tmp/database.db" />
</Context>
person gkiko    schedule 05.03.2015
comment
Кроме того, если вы используете Hibernate 4.3.6+, они теперь предоставляют свой собственный ConnectionProvider для HikariCP. См. обновление здесь github.com/brettwooldridge/HikariCP/wiki/Hibernate4 - person brettw; 05.03.2015
comment
Мне не нравится, что они используют Hikari v1.3.5. Может, мне не стоит об этом беспокоиться. - person gkiko; 05.03.2015
comment
О, я не знал, что они привязаны к этой версии. Если вы можете, откройте запрос об ошибке, чтобы они обновились. - person brettw; 06.03.2015

Пожалуйста, обратитесь к следующей теме, объясняющей, как настроить Spring bean для HikariCP.

Как настроить источник данных с помощью Spring для HikariCP?

person zawhtut    schedule 05.03.2015
comment
Спасибо, но я не использую Spring. Я пытаюсь заставить hikari работать с конфигурацией jpa. - person gkiko; 05.03.2015
comment
Ничего страшного. Тогда я думаю, что не могу помочь вам в этом объеме. - person zawhtut; 05.03.2015