#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"
для использования в следующий раз.