Призыв к Hibernate сохранить приводит к зависанию темы - PullRequest
0 голосов
/ 19 июня 2019

Мы используем Hibernate и Spring, используя шаблон DAO, где приложение вызывает отдельный класс DAO для каждого вызова базы данных. Мы используем SQL Server в качестве нашей базы данных.

В течение некоторого времени мы видим, что вызов сохранения в Hibernate просто приводит к зависанию потока, и мы ничего не знаем об этом. Тот же код работает в другой среде (отдельный сервер, отдельный сервер базы данных, но одна и та же версия).

Мы используем Hibernate 4.3.10, и в приложении ничего не изменилось за 2 года.

Что может быть не так?

Код для класса, который вызывает сохранение, вставлен ниже. BusinessAlerts - это просто класс POJO.

@Override
@Transactional(propagation = Propagation.REQUIRED)
public void persistBusinessAlert(BusinessAlerts businessAlert) throws DAOException {
    if (businessAlert == null) {
        return;
    }
    try {
        currentSession().save(businessAlert);
    } catch (HibernateException e) {
        throw new DAOException(e.getMessage(), e);
    }
}

Мы определили трассировку стека потоков, но я не могу опубликовать ее здесь полностью.

Свойства Hibernate для БД:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd">

            <tx:annotation-driven transaction-manager="priceTransactionManager" />

            <bean class="mro.util.CryptoPropertyPlaceholderConfigurer">
                           <property name="location" value="common_db.properties" />
            </bean>

            <bean id="priceDataSource" destroy-method="close"
                           class="org.apache.commons.dbcp.BasicDataSource">
                <property name="driverClassName" value="${db.driver}" />
                <property name="url" value="${alert.db.url}" />
                <property name="username" value="${alert.db.username}" />
                <property name="password" value="${alert.db.password}" />
            </bean>

            <bean id="priceSessionFactory"
                           class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
                <property name="dataSource" ref="priceDataSource" />
                <property name="annotatedClasses">
                    <list>
                        <value>BusinessAlerts</value>
                        <value>Executions</value>
                        <value>AlertCodes</value>
                    </list>
                </property>
                <property name="hibernateProperties">
                    <props>
                        <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
                        <prop key="hibernate.show_sql">true</prop>
                    </props>
                </property>
            </bean>

            <bean id="priceTransactionManager"
                           class="org.springframework.orm.hibernate4.HibernateTransactionManager">
                <property name="sessionFactory" ref="priceSessionFactory" />
            </bean>
</beans>

currentSession() - это вызов Hibernate, и вот что появляется, когда мы узнаем о нем больше:

protected final org.hibernate.Session currentSession() throws org.springframework.dao.DataAccessResourceFailureException;
     0  aload_0 [this]
     1  invokevirtual org.springframework.orm.hibernate4.support.HibernateDaoSupport.getSessionFactory() : org.hibernate.SessionFactory [10]
     4  invokeinterface org.hibernate.SessionFactory.getCurrentSession() : org.hibernate.Session [11] [nargs: 1]
     9  areturn
      Line numbers:
        [pc: 0, line: 129]
      Local variable table:
        [pc: 0, pc: 10] local: this index: 0 type: org.springframework.orm.hibernate4.support.HibernateDaoSupport
...