тайм-аут весеннего сеанса Hibernate

Я использую шаблон Apache Tomcat и MySQL для Spring Hibernate. Все отлично работает в разработке, но когда я развертываю приложение на тестовом сервере и даю ему поработать (в основном бездействующим) на ночь, меня обычно встречают утром:

Ниже приведен мой весенний servlet.xml:

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
      <property name="maxUploadSize" value="1000000"/>
</bean>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

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

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

Как я могу настроить spring servlet.xml, чтобы избежать этой проблемы? Спасибо.


person jan's    schedule 04.07.2014    source источник
comment
вы только что сказали, что используете apache tomcat 2.0?   -  person Sambhav Sharma    schedule 04.07.2014


Ответы (3)


вы можете использовать свойства гибернации для установки пула сеансов, а также можете настроить тайм-аут.

<property name="hibernate.c3p0.timeout">300</property>.

Надеюсь, что это поможет вам.

person rulhaniam    schedule 04.07.2014
comment
более подробную информацию см. здесь: forum.hibernate. орг/ - person rulhaniam; 04.07.2014
comment
хорошо, спасибо... но где я могу включить этот код в свой Spring-сервлет??. Я использую спящий шаблон Spring Framework,... - person jan's; 04.07.2014

Привет @jans, говорят, что мы не должны использовать встроенный пул соединений hibernate в производстве. Вы можете использовать C3p0 для пула соединений, чтобы избежать ошибки. Также из того, что я узнал, просто убедитесь, что вы закрываете все сеансы, которые вы использовали. Вы можете добавить приведенный ниже код в свойство «hibernateProperties».

<prop key= "hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>      
<prop key="hibernate.c3p0.acquire_increment">5</prop>
<prop key="hibernate.c3p0.idle_test_period">300</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
person Viraj Nalawade    schedule 10.03.2015
comment
C3P0 поставляется со спящим режимом, или вы можете добавить его в свой pom.xml - person Viraj Nalawade; 10.03.2015

Вам нужно проверить журналы SQL. Время ожидания сеанса истекло, так как некоторые запросы занимают слишком много времени, чем время ожидания транзакции по умолчанию.

Присвоение ему большего значения не решит вашу проблему. Итак, вам нужно настроить такой инструмент, как jdbcdslog, чтобы перехватывать все ваши запросы и регистрировать медленные. .

Таким образом, вы можете точно знать, что занимает так много времени. Это может быть один неэффективный запрос или множество мелких (N + 1 select), которые лучше оптимизировать с помощью соединения.

Таким образом, вы также можете выяснить, для каких запросов требуется больше индексов.

В качестве альтернативы вы можете запланировать настройку кеша запросов второго уровня, чтобы ускорить некоторые sloq-запросы, которые редко меняются.

person Vlad Mihalcea    schedule 04.07.2014