2015-03-04 4 views
2

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

<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 соединения Pooler после прочтения this

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

С this пример Мне удалось сделать его частично работающим с новым 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 и как его использовать? А что такое конфигурация bean this?

+1

hibernate. * файлы не имеют ничего общего с JPA и не должны использоваться, если вы хотите оставаться портативными. Любой пул соединений может использовать внутренний код реализации JPA (например, вы пытаетесь), или вы можете просто настроить javax.sql.DataSource, который настроен на предоставление пула (а затем его можно использовать с ЛЮБОЙ реализацией JPA) –

+0

Если вы работая с JPA, тогда беспокоиться только о файле persistence.xml для конфигурации. если вы помещаете что-то в файлы спящего режима. * Затем вы настраиваете конкретные параметры Hibernate, которые вы не хотите.Вы будете использовать JNDI для части источника данных, если у вас есть корпоративный сервер (Jboss, weblogic, websphere), вы сможете создать источник данных в консоли администратора сервера (включая конфигурацию пула) и присвоить ему имя JNDI , Вместо того, чтобы настраивать соединения, пулы соединений и т. Д. В файле persistence.xml, вы просто указываете имя jndi в том же файле. – Zeus

+0

Является ли _setting javax.sql.DataSource_ такой же, как _configuring JNDI_? Должен ли я настраивать конкретный файл Catalina на каждом сервере, я развертываю свое веб-приложение в этом случае? – gkiko

ответ

3

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

<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-> контекст .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> 
+0

Кроме того, если вы используете Hibernate 4.3.6+, они теперь предоставляют свой собственный ConnectionProvider для HikariCP. См. Обновление здесь https://github.com/brettwooldridge/HikariCP/wiki/Hibernate4 – brettw

+0

Мне не нравится, что они используют hikari v1.3.5. Может быть, я не должен беспокоиться об этом. – gkiko

+0

О, я не знал, что они были заблокированы для этой версии. Если вы можете, откройте запрос об ошибке для их обновления. – brettw

0

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

How to set up datasource with Spring for HikariCP?

+0

Спасибо, но я не использую весну. Я пытаюсь сделать работу hikari с конфигурацией jpa. – gkiko

+0

Все в порядке. Тогда я думаю, что я не могу вам помочь. – zawhtut