使用 JPA 休眠,连接时间非常慢
Hibernate with JPA, connection time very slow
我有一个项目,我想在其中使用 Hibernate 进行数据库访问。在应用程序中,使用了 JPA api。
persistence.xml文件是这个
<persistence
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="hibernate.test"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.ejb.cfgfile" value="/hibernate/hibernate.cfg.xml"/>
</properties>
</persistence-unit>
</persistence>
hibernate.cfg.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@//server:1521/DBNAME</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- <property name="hibernate.hbm2ddl.auto">verify</property> -->
<property name="hibernate.default_catalog">SYS_SOMETHING</property>
<property name="hibernate.default_schema">SYS_SOMETHING</property>
</session-factory>
</hibernate-configuration>
这个设置有问题,entityManagerFactory = Persistence.createEntityManagerFactory("hibernate.test");
通话大约需要 25 秒才能完成。
如果我将配置直接移动到 persistence.xml 文件,连接将在 1 秒内完成。
Oracle 和 MySQL 数据库都会出现此错误。
我可以在日志文件中看到延迟,这段时间没有发生其他事情
525 [pool-2-thread-1] INFO org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
21668 [pool-2-thread-1] DEBUG org.hibernate.service.internal.JaxbProcessor - cfg.xml document did not define namespaces; wrapping in custom event reader to introduce namespace information
完整日志:http://pastebin.com/4NjPpFPe
如果不使用cfg.xml,这个延迟只有200ms左右。
在此期间,进程内存没有变化,cpu 使用率为 0%,根据 sysinternals Process Monitor,有 0 次交互。
我想保留此设置,因为 hibernate.cfg.xml 也用于逆向工程和休眠工具。
使用的工具:
java8
休眠-4.3.8
ojdbc7
jpa-2.1
感谢您提前提出任何建议。
更新:
找到解决方案,现在我很开心!
休眠框架(或 xml 解析器,我不确定)会等待 http 请求。
要解决此问题,请替换
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
和
<!DOCTYPE hibernate-configuration SYSTEM "-//Hibernate/Hibernate Configuration DTD 3.0//EN">
此问题可能与 属性 有关,它规定 Hibernate 的内部行为以在首次尝试创建连接时处理 JDBC 元数据。
尝试添加这个 属性
"hibernate.temp.use_jdbc_metadata_defaults"
给你的hibernate.cfg.xml。这帮助我解决了 PostgreSQL 环境中的类似问题,将 "lame" 启动恢复到 "life"。默认情况下(即未明确定义)此 属性 设置为 true
,这会导致通过 JDBC 完全加载数据库的所有元数据(这在某些情况下可能很慢。 ..).
hibernate.cfg.xml 文件应按如下方式使用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@//server:1521/DBNAME</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- <property name="hibernate.hbm2ddl.auto">verify</property> -->
<property name="hibernate.default_catalog">SYS_SOMETHING</property>
<property name="hibernate.default_schema">SYS_SOMETHING</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
</session-factory>
</hibernate-configuration>
找到解决方案,现在我很开心!
休眠框架(或 xml 解析器,我不确定)会等待 http 请求。
要解决此问题,请替换
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
和
<!DOCTYPE hibernate-configuration SYSTEM "hibernate-configuration-3.0.dtd">
编辑:替换了 "with" 行,这将在发布模式和逆向工程中使用正确的 dtd 文件(如果不指定实际文件则无法使用 reveng)。
或者您可以直接从 JAR 文件加载 dtd:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"classpath://org/hibernate/hibernate-mapping-3.0.dtd">
我有一个项目,我想在其中使用 Hibernate 进行数据库访问。在应用程序中,使用了 JPA api。
persistence.xml文件是这个
<persistence
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="hibernate.test"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.ejb.cfgfile" value="/hibernate/hibernate.cfg.xml"/>
</properties>
</persistence-unit>
</persistence>
hibernate.cfg.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@//server:1521/DBNAME</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- <property name="hibernate.hbm2ddl.auto">verify</property> -->
<property name="hibernate.default_catalog">SYS_SOMETHING</property>
<property name="hibernate.default_schema">SYS_SOMETHING</property>
</session-factory>
</hibernate-configuration>
这个设置有问题,entityManagerFactory = Persistence.createEntityManagerFactory("hibernate.test");
通话大约需要 25 秒才能完成。
如果我将配置直接移动到 persistence.xml 文件,连接将在 1 秒内完成。 Oracle 和 MySQL 数据库都会出现此错误。
我可以在日志文件中看到延迟,这段时间没有发生其他事情
525 [pool-2-thread-1] INFO org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
21668 [pool-2-thread-1] DEBUG org.hibernate.service.internal.JaxbProcessor - cfg.xml document did not define namespaces; wrapping in custom event reader to introduce namespace information
完整日志:http://pastebin.com/4NjPpFPe
如果不使用cfg.xml,这个延迟只有200ms左右。
在此期间,进程内存没有变化,cpu 使用率为 0%,根据 sysinternals Process Monitor,有 0 次交互。
我想保留此设置,因为 hibernate.cfg.xml 也用于逆向工程和休眠工具。
使用的工具: java8 休眠-4.3.8 ojdbc7 jpa-2.1
感谢您提前提出任何建议。
更新:
找到解决方案,现在我很开心!
休眠框架(或 xml 解析器,我不确定)会等待 http 请求。
要解决此问题,请替换
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
和
<!DOCTYPE hibernate-configuration SYSTEM "-//Hibernate/Hibernate Configuration DTD 3.0//EN">
此问题可能与 属性 有关,它规定 Hibernate 的内部行为以在首次尝试创建连接时处理 JDBC 元数据。
尝试添加这个 属性
"hibernate.temp.use_jdbc_metadata_defaults"
给你的hibernate.cfg.xml。这帮助我解决了 PostgreSQL 环境中的类似问题,将 "lame" 启动恢复到 "life"。默认情况下(即未明确定义)此 属性 设置为 true
,这会导致通过 JDBC 完全加载数据库的所有元数据(这在某些情况下可能很慢。 ..).
hibernate.cfg.xml 文件应按如下方式使用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@//server:1521/DBNAME</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- <property name="hibernate.hbm2ddl.auto">verify</property> -->
<property name="hibernate.default_catalog">SYS_SOMETHING</property>
<property name="hibernate.default_schema">SYS_SOMETHING</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
</session-factory>
</hibernate-configuration>
找到解决方案,现在我很开心!
休眠框架(或 xml 解析器,我不确定)会等待 http 请求。
要解决此问题,请替换
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
和
<!DOCTYPE hibernate-configuration SYSTEM "hibernate-configuration-3.0.dtd">
编辑:替换了 "with" 行,这将在发布模式和逆向工程中使用正确的 dtd 文件(如果不指定实际文件则无法使用 reveng)。
或者您可以直接从 JAR 文件加载 dtd:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"classpath://org/hibernate/hibernate-mapping-3.0.dtd">