2015-02-20 15 views
6

chúng tôi đang cố gắng di chuyển dự án của chúng tôi từ ngủ đông 3 đến ngủ đông 4. Mọi thứ đều hoạt động tốt, nhưng vấn đề là khởi động.Di chuyển từ Hibernate 3 đến 4 làm chậm khởi động

Chúng tôi không sử dụng JPA, chúng tôi sử dụng trực tiếp ngủ đông với tệp xml và tệp ánh xạ.

<?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> 

Khách sạn generated.mappingFile là một đặc tính riêng. Khi khởi động tệp sẽ được tải (dev.xml). Tệp này trông giống như sau:

 <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" /> 

Chúng tôi đã giảm số lượng ánh xạ trong bài đăng này. chúng tôi có nhiều hơn sau đó 500 ánh xạ trong thời điểm này.

Với hibernate 3 phải mất 2 giây để tải tất cả ánh xạ. Với hibernate 4 phải mất hơn 2 phút.

Dưới đây là file log từ ngủ đông 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://... 

Với Hibernate 4.3.8 Final:

 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://... 

Phương pháp mà thêm các tập tin bản đồ giống như thế này:

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); 
} 

Thiếu thời gian là addResource.

Chúng tôi cũng đã thử bằng cách di chuyển phần tử ánh xạ trực tiếp đến tệp hibernate.cfg.xml nhưng phải mất cùng một thời gian để khởi động.

Chúng tôi tin rằng hibernate đang xác thực điều gì đó mà hibernate 3 không làm.

Có ai muốn khắc phục sự cố này không? Chúng tôi không thể đợi 2 phút cho mỗi lần chạy thử.

Cảm ơn rất nhiều và rất nhiều lời chúc mừng, Hauke ​​

CẬP NHẬT

Tôi đã thay đổi LogLevel để "DEBUG" và bây giờ nó đi kèm này:

tôi đã thay đổi để LogLevel để gỡ lỗi và điều này sẽ ra mắt ngay bây giờ:

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 
    ... 

Vì vậy, dường như DTDEntityResolver mất bout 200ms - 400 m cho mỗi thực thể. Với 500 thực thể, điều này sẽ tổng hợp.

Vì vậy, câu hỏi đặt ra là làm thế nào để vô hiệu hóa điều đó?

+0

Bạn có đang sử dụng tăng cường thời gian chạy không? Bạn đã thử xây dựng thời gian nâng cao với "hibernate-enhanced-maven-plugin" (được thêm vào với 4.2.8)? http://java.dzone.com/articles/hibernate-bytecode-enhancement –

Trả lời

6

Bạn cần phải thay đổi DTD của tất cả các file cấu hình HBM của bạn từ:

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

tới:

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

Đây là cách DTDEntityResolver cố gắng để xác định vị trí 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 không thể định vị tệp cấu hình hibernate-mapping-3.0.dtd trong hibernate-core-4.3.8.Final.jar và vì vậy nó sẽ được xử lý lại thông qua tất cả đường dẫn lớp của bạn và vì bạn có một dự án lớn, giải thích lý do tại sao nó bắt đầu quá chậm.

1

Tôi đã từng sử dụng một mẹo để bỏ qua xác thực DTD khi phân tích các tệp XML, sử dụng mã bên dưới. Trường hợp của bạn phức tạp hơn khi bạn cần cắm nó vào trình phân tích cú pháp cấu hình Hibernate. Nhưng nó có thể giúp bạn bắt đầu.

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; 
    } 
}; 

Một số cách để sử dụng nó:

  1. Từ một DocumentBuilder

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder parser = dbf.newDocumentBuilder(); 
    parser.setEntityResolver(dummyDtdResolver); 
    ... 
    parser.parse(new File(xmlName));   
    
  2. Từ một XmlReader

    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
    saxParserFactory.setNamespaceAware(true); 
    XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader(); 
    xmlReader.setEntityResolver(dummyDtdResolver); 
    ... 
    new SAXSource(xmlReader, inputSource); 
    
Các vấn đề liên quan