У нас есть Java-приложение, которое прослушивает сокеты и записывает проанализированную информацию в базу данных MySql. Мы используем hibernate в качестве слоя ORM. Весь процесс персистентности обрабатывается специальным потоком. Объекты вставляются и обновляются группами по 20, максимальная скорость вставки составляет 30 вставок / с, а максимальная частота обновления составляет 30 обновлений / с на 6-ядерном Linux-устройстве с 24 ГБ ОЗУ. Размер БД на данный момент составляет около 16 ГБ. Приложение зависает после бесперебойной работы в течение 40 минут, за исключением следующего:
org.hibernate.util.JDBCExceptionReporter - SQL Error: 1205, SQLState: 41000
Lock wait timeout exceeded; try restarting transaction
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute update query
Даже если существует блокировка строки, этот поток никогда не должен останавливаться и, если возможно, принудительно снять блокировку строки, как я могу гарантировать такое поведение? Любая помощь будет оценена. Ниже вы можете найти нашу конфигурацию гибернации:
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://**************:3306/*********?useUnicode=yes;characterEncoding=UTF-8;rewriteBatchedStatements=true;includeThreadNamesAsStatementComment=true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.connection.autocommit" value="false"/>
<property name="hibernate.connection.useUnicode" value="true"/>
<property name="hibernate.connection.characterEncoding" value="UTF-8"/>
<property name="hibernate.connection.show_sql" value="true"/>
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
<property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull"/>
<property name="hibernate.c3p0.max_size" value="100"/>
<property name="hibernate.c3p0.min_size" value="0"/>
<property name="hibernate.c3p0.acquire_increment" value="1"/>
<property name="hibernate.c3p0.idle_test_period" value="300"/>
<property name="hibernate.c3p0.max_statements" value="0"/>
<property name="hibernate.c3p0.timeout" value="100"/>
<property name="hibernate.c3p0.autoCommitOnClose" value="false"/>
<!-- JDBC connection pool (use the built-in) -->
<!--Hibernate Batch Process Best Practices -->
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.jdbc.batch_size" value="15" />
</properties>