Настройка HikariCP + Hibernate + GuicePersist(JPA) во время выполнения

У меня есть настольное приложение java8, использующее GuicePersist, Hibernate и HikariCP для связи с БД Postgres. Мне удалось заставить мое приложение отправлять/получать данные в БД, используя этот META-INF/persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <!-- A JPA Persistence Unit -->
    <persistence-unit name="myJPAunit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>com.123fakestreet.bogus.tomb.impl.postgres.model.movies</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <!-- SQL stuff -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />

            <!-- hikari CP -->
            <property name="hibernate.connection.provider_class" value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider" />
            <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.postgresql.ds.PGSimpleDataSource" />
            <property name="hibernate.hikari.dataSource.url" value="jdbc:postgresql://192.168.100.75:5432/mpDb" />
            <property name="hibernate.hikari.username" value="cowboy" />
            <property name="hibernate.hikari.password" value="bebop" />

            <!-- Disable the second-level cache  -->
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>

            <!-- Default is false for backwards compatibility.  Should be used on all new projects -->
            <property name="hibernate.id.new_generator_mappings" value="true"/>

        </properties>
    </persistence-unit>
</persistence>

Сложная часть — это настройка моего Guice JpaPersistModule во время выполнения. Из того, что я могу сказать, я должен иметь возможность переопределять свойства в моем файле META-INF/persistence.xml, устанавливая свойства в объекте Map, например:

Map<String, String> properties = new HashMap<>();
    properties.put("myJPAunit.hibernate.hikari.dataSource.url", "jdbc:postgresql://192.168.100.75:5432/mpDb");
    properties.put("myJPAunit.hibernate.hikari.dataSource.user", "cowboy");
    properties.put("myJPAunit.hibernate.hikari.dataSource.password", "bebop");

затем jpaModule.properties(properties), а затем передать все это в GuicePersist.

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

Кто-нибудь может помочь? Огромное спасибо.


person Ten_Ten_Steve    schedule 18.06.2015    source источник
comment
Вероятно, самый простой способ — расширить HikariCPConnectionProvider, перегрузите метод configure, добавьте собственные свойства и задайте собственные hibernate.connection.provider_class в persistence.xml.   -  person vanOekel    schedule 18.06.2015


Ответы (1)


Попробуйте удалить имя единицы персистентности из свойств JPA, поэтому вместо:

Map<String, String> properties = new HashMap<>();
properties.put("myJPAunit.hibernate.hikari.dataSource.url", "jdbc:postgresql://192.168.100.75:5432/mpDb");
properties.put( + "myJPAunit.hibernate.hikari.dataSource.user", "cowboy");
properties.put( + "myJPAunit.hibernate.hikari.dataSource.password", "bebop");

у вас должно быть это:

Map<String, String> properties = new HashMap<>();
properties.put("hibernate.hikari.dataSource.url", "jdbc:postgresql://192.168.100.75:5432/mpDb");
properties.put("hibernate.hikari.dataSource.user", "cowboy");
properties.put("hibernate.hikari.dataSource.password", "bebop");
person Vlad Mihalcea    schedule 19.06.2015
comment
Великолепно! Это сработало после небольшой очистки кода. Спасибо. - person Ten_Ten_Steve; 19.06.2015
comment
@Vlad Mihalcea Как добавить MetricsRegistry для Hikari с помощью guice-persist JpaPersistModule? - person Badman; 28.12.2018