我已经成功将hibernate模式集成到了我的Web应用程序中。我对自己的persistence.xml配置感到满意
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以将hibernate与hikaricp池一起使用?我不想在代码中分散hibernate专用的内容,因为我想保持ORM层抽象。我发现了很多令人困惑的资料,并且提出的问题多于请求者。persistence.xml,hibernate.properties和hibernate.cfg.xml如何相互关联?什么是JNDI以及如何使用它?什么是这个 bean的配置?
抱歉,原来的问题。经过更多的研究,我找到了解决方案。这正在工作persistence.xml。我认为user并且password不能在sqlite中设置。 minimumPoolSize- > minimumIdle
user
password
<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>