2015-04-16 4 views
3

У меня есть проект, где я бы хотел использовать Hibernate для доступа к базе данных. В приложении используется JPA api.Hibernate с JPA, время соединения очень медленное

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

Эта задержка составляет лишь около 200 мс, если cfg.xml не используется ,

За это время память процесса не изменяется, использование процессора составляет 0%, а в соответствии с sysinternals Process Monitor - 0 взаимодействий.

Я хотел бы сохранить эту настройку, потому что hibernate.cfg.xml также используется для инструментов обратной инженерии и спящего режима.

Инструменты, используемые: java8 гибернации-4.3.8 ojdbc7 JPA-2,1

Благодарим Вас за любые предложения заранее.

Update:

Найдено решение, теперь я счастливый человек!

Рамка hibernate (или синтаксический анализатор 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"> 
+0

Задержка - это только один раз, когда начинается сервер? –

+0

Каждый раз, когда приложение запускается, когда создается EntityManagerFactory. Администраторы EntityManager и запросы и т. Д. Все быстро. –

+0

при запуске проекта и запуске сервера. сколько времени это займет? что я хочу сказать, что для запуска сервера, такого как Jboss или tomcat, или любого другого сервера, на котором вы работаете, это нормально, что требуется 25 секунд! – Fakher

ответ

2

Найдено решение, теперь я счастливый человек!

Рамка hibernate (или синтаксический анализатор 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"> 

Edit: Заменено «с» линией, это будет использовать правильный файл ОТДА в режиме выпуска и в обратном проектировании тоже (невозможно было использовать reveng без указания фактического файла).

+0

рад, это сработало в вашем случае. Тем не менее, это всего лишь своего рода обходной путь, поскольку вы пропускаете внутреннюю проверку XML-схемы. ИМХО это не настоящее решение, может быть, вы должны представить отчет об ошибке в Hibernate вопрос трекера? – MWiesner

+0

, пожалуйста, считайте, что этот ответ не отмечен как решение, так как это обходное решение «только» – MWiesner

+0

@MWiesner обновил мой ответ, он должен его проверить. Eclipse также это признает. Кажется, что hibernate пытается получить доступ к dtd в Интернете, но он находится за прокси-сервером. Если я пропущу это, будет использоваться dtd в пакете. –

1

Эта проблема может быть связана со свойством, которое регулирует внутреннее поведение Hibernate для обработки метаданных JDBC на первой попытке создать соединение.

Попробуйте добавить это свойство

"hibernate.temp.use_jdbc_metadata_defaults" 

к вашему hibernate.cfg.xml. Это помогло мне в подобной проблеме в среде PostgreSQL вернуть «хромой» запуск в «жизнь». По умолчанию (т. Е. Не определено явно) это свойство имеет значение 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> 
+0

К сожалению, это не оказывает (заметного) эффекта на скорость. –

+0

@ BiróKrisztián Я согласен. Любое решение еще? – momomo

Смежные вопросы