Сервис : у нас есть сервис, который получает Request
, и он просто сохраняет его в базе данных. Ниже приведен файл hbm для того же.
<hibernate-mapping package="com.project.dao">
<class name="Request" table="requests">
<id name="requestId" type="long" column="req_id">
<generator class="native" />
</id>
<class>
<discriminator column="req_type" type="string" force="true"/>
<property name="status" type="string" column="status"/>
<property name="processId" type="string" column="process_id"/>
<subclass name="RequestType1" discriminator-value="Type1">
..
</subclass>
<subclass name="RequestType2" discriminator-value="Type2">
..
</subclass>
</hibernate-mapping>
Код, который получает сеанс и сохраняет Request
, выглядит следующим образом.
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
requestDAO.save(request);
tx.commit();
}catch(Exception e){
log.error(e);
}
Клиент : на стороне клиента есть два хоста, которые считывают полученные и необработанные запросы. Каждый клиент (Host1, Host2) выполняет следующие действия.
Обновить process_id необработанного запроса на его имя хоста.
update requests set process_id='" + hostName + "' where status='Received' and process_id is null order by req_id asc limit 100"
Получать запросы, обновленные выше, и обрабатывать их.
select * from requests where process_id='"+ hostName + "' where status='Received';
Теперь проблема в том, что в течение некоторого времени эти клиенты будут работать нормально. Но через некоторое время они начинают выбрасывать следующее исключение.
org.hibernate.exception.GenericJDBCException: could not execute native bulk manipulation query at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
Клиент снова начинает нормально работать, если мы перезапускаем их.
Что касается обслуживания, мы иногда видим следующие исключения.
org.hibernate.AssertionFailure: null id don't flush the Session after an exception occurs
Мы пытались решить эту проблему, но не смогли выяснить первопричину. Любое понимание вероятной проблемы было бы полезно.
Спасибо