Как использовать Configuration.addCacheableFile для конфигурации гибернации

#hibernate

#гибернация

Вопрос:

Как использовать addCacheableFile

Я пытаюсь оптимизировать свою инициализацию гибернации, и я обнаружил, что мы можем использовать addCacheableFile . Однако я не совсем понимаю, как его использовать. Я попытался установить то же самое cfg.xml Я использую, но затем это вызывает Could not deserialize cache file .

 public static void initHibernate() throws Exception {
    
   System.out.println("Initializing Hibernate.....");
   String username = Cryptographer.decrypt(MySettings.getDb_username());
   String password = Cryptographer.decrypt(MySettings.getDb_password());
   String url = Cryptographer.decrypt(MySettings.getDb_url());
    
   cfg = new Configuration()
        .configure("hibernate.cfg.xml")
        .setProperty("hibernate.connection.url", url)
        .setProperty("hibernate.connection.username", username)
        .setProperty("hibernate.connection.password", password)
        .setProperty(username, url);
        
   //Error: Hibernate Could not deserialize cache file:
   //File fileAux = new File("A:\hibernate.cfg.xml");
   //cfg.addCacheableFile(fileAux);
        
   sessions = cfg.buildSessionFactory();
}
 

Дополнительная информация:


 compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '5.4.27.Final'
 

Сопоставление XML-файла: (Я отредактировал личную информацию как ОТРЕДАКТИРОВАННУЮ)

     <?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>
    
            <!-- UPDATE OR NONE -->
            <property name ="hibernate.hbm2ddl.auto">none</property>
    
            <!-- -->
            <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
            <property name="hibernate.connection.url"></property>
            <property name="hibernate.connection.username"></property>
            <property name="hibernate.connection.password"></property>
            
            <!-- -->
            <property name="hibernate.current_session_context_class">thread</property>

            <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
            <property name="hibernate.order_updates">true</property>
    
            <!-- Just set the correct isolation to default(1). Stops logging messages -->
            <property name="hibernate.connection.isolation">1</property>
    
            <!-- Might Improve Performance -->
            <property name="hibernate.jdbc.batch_versioned_data">true</property>
            <property name="hibernate.connection.autoReconnect">true</property>
            <property name="hibernate.connection.autoReconnectForPools">true</property>
    
            <!-- fix time zone -->
            <property name="hibernate.jdbc.time_zone">UTC</property>
    
            <!-- hibernate -->
            <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
            <property name="hibernate.connection.pool_size">3</property>
            <property name="hibernate.show_sql">false</property>
            <property name="hibernate.format_sql">false</property>
            <property name="hibernate.jdbc.batch_size">360</property>
            <property name="hibernate.max_fetch_depth">30</property>
            <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    
            <!-- C3PO -->
            <property name="hibernate.c3p0.max_size">3</property>
            <property name="hibernate.c3p0.min_size">1</property>
            <property name="hibernate.c3p0.timeout">240</property>
            <property name="hibernate.c3p0.max_statements">180</property>
            <property name="hibernate.c3p0.idle_test_period">30</property>
            <property name="hibernate.c3p0.acquire_increment">1</property>
            <property name="hibernate.c3p0.testConnectionOnCheckout">false</property>
            <property name="hibernate.c3p0.testConnectionOnCheckin">true</property>
            <property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property>
    
            <!-- Mapping -->
    
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
            <mapping class="br.REDACTED.models.REDACTED"/>
            <mapping class="br.REDACTED.models.REDACTED"/>
            
        </session-factory>
    </hibernate-configuration>
 

Комментарии:

1. Какую версию гибернации вы используете?

2. группа компиляции: ‘org.hibernate’, имя: ‘hibernate-c3p0’, версия: ‘5.4.27.Final’

Ответ №1:

Configuration.addCacheableFile Предполагается, что вы используете устаревшее сопоставление xml.

Пример.

Предположим, у вас есть объект Employee, сопоставленный с Employee.hbm.xml файлом:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class name="com.sternkn.hibernate.Employee" table="EMPLOYEE">
      <id name="id">
         <generator class="assigned"></generator>
      </id>

      <property name="firstName"></property>
      <property name="lastName"></property>
   </class>
</hibernate-mapping>
 

Итак, чтобы оптимизировать синтаксический анализ этого сопоставления, вы можете инициализировать гибернацию следующим образом:

 Configuration cfg = new Configuration()
  .addResource( "Item.hbm.xml" )
  .addCacheableFile("Employee.hbm.xml.bin")
  // ...
 

Как это объясняется в комментариях к методу addCacheableFile:

Если кэшированный xmlFile ".bin" файл существует и является более новым, чем xmlFile .bin файл, он будет считан напрямую. В противном xmlFile случае считывается, а затем сериализуется xmlFile ".bin" для использования в следующий раз.