2015-02-20 32 views
6

staramy się przenieść nasz projekt z hibernacji 3 do hibernacji 4. Wszystko działa poprawnie, ale problem polega na uruchomieniu.Migracja z Hibernate 3 do 4 spowolnienie uruchamiania

Nie używamy JPA, używamy bezpośredniego hibernacji z plikiem xml i plikami mapującymi.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 

     <property name="hibernate.connection.driver_class">com.informix.jdbc.IfxDriver</property> 
     <property name="hibernate.connection.url">jdbc:informix-sqli://xxx:xxx/xxx:INFORMIXSERVER=xxx</property> 
     <property name="hibernate.connection.username">xxx</property> 
     <property name="hibernate.connection.password">xxx</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.InformixDialect</property> 
     <property name="hibernate.format_sql">true</property> 
     <property name="hibernate.show_sql">false</property>   


     <property name="generated.mappingFile">dev.xml</property> 
    </session-factory> 
</hibernate-configuration> 

Obiekt generated.mappingFile jest własnością. Podczas uruchamiania plik zostanie załadowany (dev.xml). Ten plik wygląda następująco:

 <mapping resource="de/cargosoft/edi/cargoservice/entities/aart/Aart_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/abteilung/Abteilung_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/adr/Adr_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/adraesort/Adraesort_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/adrakte/Adrakte_DEV.hbm.xml" /> 
     ... 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/zollanmtxt/Zollanmtxt_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/sstbasis/Sstbasis_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/sststruktur/Sststruktur_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/ssthandler/Ssthandler_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/sstproperty/Sstproperty_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/sstprophandler/Sstprophandler_DEV.hbm.xml" /> 
     <mapping resource="de/cargosoft/edi/cargoservice/entities/sstneustart/Sstneustart_DEV.hbm.xml" /> 

Zredukowaliśmy liczbę mapowań w tym poście. w tej chwili mamy więcej niż 500 odwzorowań.

Z hibernacja 3 zajęło 2 sekundy załadować wszystkie odwzorowania. W przypadku hibernacji 4 z zajmuje to ponad 2 minuty.

Oto plik dziennika z hibernacji 3.2.GA:

 07:36:21,293 INFO [HibernateManager    ] | Verwende Mapping-Collection Datei : /com/cargosoft/csedi/data/mappings_dev.xml 
    07:36:21,347 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/aart/Aart_DEV.hbm.xml 
    07:36:21,443 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/abteilung/Abteilung_DEV.hbm.xml 
    07:36:21,458 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/adr/Adr_DEV.hbm.xml 
    07:36:21,495 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/adraesort/Adraesort_DEV.hbm.xml 
    07:36:21,523 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/adrakte/Adrakte_DEV.hbm.xml 
    ... 
    07:36:23,475 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/zollanmtxt/Zollanmtxt_DEV.hbm.xml 
    07:36:23,477 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/sstbasis/Sstbasis_DEV.hbm.xml 
    07:36:23,479 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/sststruktur/Sststruktur_DEV.hbm.xml 
    07:36:23,481 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/ssthandler/Ssthandler_DEV.hbm.xml 
    07:36:23,482 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/sstproperty/Sstproperty_DEV.hbm.xml 
    07:36:23,484 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/sstprophandler/Sstprophandler_DEV.hbm.xml 
    07:36:23,486 INFO [HibernateManager    ] | Adding this resource to hibernate now   : com/cargosoft/csedi/data/sstneustart/Sstneustart_DEV.hbm.xml 
    07:36:23,488 INFO [HibernateManager    ] | Create new SessionFactory for: jdbc:informix-sqli://... 

Hibernate 4.3.8-końcowa:

 07:38:04,749 INFO [HibernateManager    ] | Verwende Mapping-Collection Datei : /de/cargosoft/edi/cargoservice/entities/mappings_dev.xml 
    07:38:04,824 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/aart/Aart_DEV.hbm.xml 
    07:38:05,249 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/abteilung/Abteilung_DEV.hbm.xml 
    07:38:05,527 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/adr/Adr_DEV.hbm.xml 
    07:38:05,792 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/adraesort/Adraesort_DEV.hbm.xml 
    07:38:06,077 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/adrakte/Adrakte_DEV.hbm.xml 
    ... 
    07:40:14,119 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/zollanmtxt/Zollanmtxt_DEV.hbm.xml 
    07:40:14,499 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/sstbasis/Sstbasis_DEV.hbm.xml 
    07:40:14,746 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/sststruktur/Sststruktur_DEV.hbm.xml 
    07:40:14,972 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/ssthandler/Ssthandler_DEV.hbm.xml 
    07:40:15,211 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/sstproperty/Sstproperty_DEV.hbm.xml 
    07:40:15,434 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/sstprophandler/Sstprophandler_DEV.hbm.xml 
    07:40:15,657 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/sstneustart/Sstneustart_DEV.hbm.xml 
    07:40:15,878 INFO [HibernateManager    ] | Create new SessionFactory for: jdbc:informix-sqli://... 

Metoda który dodaje pliki mapowania wyglądać następująco:

for (Node node : nodes) { 
     Element element = (Element) node; 
     String resource = element.attributeValue("resource"); 
     logger.info("Adding this resource to hibernate now   : " + resource); 
     configuration.addResource(resource); 
} 

Brak czasu na addResource.

Próbowaliśmy także, przesuwając element odwzorowania bezpośrednio do pliku hibernate.cfg.xml, ale proces uruchamiania zajmuje ten sam czas.

Wierzymy, że hibernacja sprawdza coś, czego hibernacja 3 nie ma.

Czy ktoś ma pomysł, aby rozwiązać ten problem? Nie możemy czekać 2 minuty na każdy przebieg testu.

dziękuję i wiele pozdrowienia, Hauke ​​

UPDATE

Zmieniłem poziomu logowania na "DEBUG" i teraz chodzi o to:

Zmieniłem do LogLevel do debugowania i to teraz wychodzi:

11:29:22,781 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/aart/Aart_DEV.hbm.xml 
    11:29:22,782 INFO [Configuration     ] | HHH000221: Reading mappings from resource: de/cargosoft/edi/cargoservice/entities/aart/Aart_DEV.hbm.xml 
    11:29:22,804 DEBUG [DTDEntityResolver    ] | Trying to resolve system-id [http://hibernate.org/dtd/hibernate-mapping-3.0.dtd] 
    11:29:23,149 INFO [HibernateManager    ] | Adding this resource to hibernate now   : de/cargosoft/edi/cargoservice/entities/abteilung/Abteilung_DEV.hbm.xml 
    ... 

Wygląda na to, że DTDEntityResolver ma bout 200ms - 400ms dla każdej jednostki. Razem z 500 podmiotami to się sumuje.

Pytanie brzmi: jak to wyłączyć?

+0

Czy używasz ulepszenia środowiska wykonawczego? Czy próbowałeś ulepszyć czas budowy dzięki "Hibernacja-ulepszenie-maven-plugin" (dodane z 4.2.8)? http://java.dzone.com/articles/hibernate-bytecode-enhancement –

Odpowiedz

6

Musisz zmienić DTD wszystkich plików konfiguracyjnych HBM od:

http://hibernate.org/dtd/hibernate-mapping-3.0.dtd 

do:

http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd 

To jak DTDEntityResolver próbuje zlokalizować DTO:

public class DTDEntityResolver implements EntityResolver, Serializable { 

    private static final String HIBERNATE_NAMESPACE = "http://www.hibernate.org/dtd/"; 
    private static final String OLD_HIBERNATE_NAMESPACE = "http://hibernate.sourceforge.net/"; 
    private static final String USER_NAMESPACE = "classpath://"; 

    public InputSource resolveEntity(String publicId, String systemId) { 
     InputSource source = null; // returning null triggers default behavior 
     if (systemId != null) { 
      LOG.debugf("Trying to resolve system-id [%s]", systemId); 
      if (systemId.startsWith(HIBERNATE_NAMESPACE)) { 
       LOG.debug("Recognized hibernate namespace; attempting to resolve on classpath under org/hibernate/"); 
       source = resolveOnClassPath(publicId, systemId, HIBERNATE_NAMESPACE); 
      } 
      else if (systemId.startsWith(OLD_HIBERNATE_NAMESPACE)) { 
       LOG.recognizedObsoleteHibernateNamespace(OLD_HIBERNATE_NAMESPACE, HIBERNATE_NAMESPACE); 
       LOG.debug("Attempting to resolve on classpath under org/hibernate/"); 
       source = resolveOnClassPath(publicId, systemId, OLD_HIBERNATE_NAMESPACE); 
      } 
      else if (systemId.startsWith(USER_NAMESPACE)) { 
       LOG.debug("Recognized local namespace; attempting to resolve on classpath"); 
       String path = systemId.substring(USER_NAMESPACE.length()); 
       InputStream stream = resolveInLocalNamespace(path); 
       if (stream == null) { 
        LOG.debugf("Unable to locate [%s] on classpath", systemId); 
       } 
       else { 
        LOG.debugf("Located [%s] in classpath", systemId); 
        source = new InputSource(stream); 
        source.setPublicId(publicId); 
        source.setSystemId(systemId); 
       } 
      } 
     } 
     return source; 
    } 

    ... 

} 

Hibernate nie można zlokalizować pliku konfiguracyjnego hibernate-mapping-3.0.dtd w pliku hibernate-core-4.3.8.Final.jar, który przechodzi przez całą ścieżkę klasy i od tego czasu ogromny projekt, który wyjaśnia, dlaczego zaczyna się tak wolno.

1

Kiedyś użyłem sztuczki, aby pominąć sprawdzanie DTD podczas analizowania plików XML, używając poniższego kodu. Twoja sprawa jest bardziej skomplikowana, ponieważ musisz ją podłączyć do parsera konfiguracji Hibernate. Ale może zacząć.

private boolean skipDtd = true; // TODO make configurable 

private EntityResolver dummyDtdResolver = new EntityResolver() 
{ 
    @Override 
    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException 
    { 
     if (skipDtd && systemId.toLowerCase().endsWith(".dtd")) 
      return new InputSource(new StringReader("")); 
     return null; 
    } 
}; 

Kilka sposobów, aby go użyć:

  1. Z DocumentBuilder

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder parser = dbf.newDocumentBuilder(); 
    parser.setEntityResolver(dummyDtdResolver); 
    ... 
    parser.parse(new File(xmlName));   
    
  2. Od XmlReader

    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
    saxParserFactory.setNamespaceAware(true); 
    XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader(); 
    xmlReader.setEntityResolver(dummyDtdResolver); 
    ... 
    new SAXSource(xmlReader, inputSource);