2013-06-11 3 views
1

Я использую Spring MVC 3 и Hibernate 3.6, я использую xml сконфигурированное управление транзакциями, мой код работает greate, но мой JDBC не выпущен, хотя он говорит, что это так.Принудительное спящий режим для освобождения соединения в сеансе Spring MVC

Я проверил его с помощью JProfiler, и он говорит, что соединение открыто.

это моя весна-код конфигурации

<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/parse_web?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/> 
    <property name="username" value="root" /> 
    <property name="password" value="miles106" /> 
    <property name="initialSize" value="5"/> 
    <property name="maxActive" value="50000"/> 
</bean> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="ds" /> 
    <property name="mappingResources"> 
     <list> 
      <value>com/mubasher/parsewebpage/entities/Changes.hbm.xml</value> 
      <value>com/mubasher/parsewebpage/entities/Owners.hbm.xml</value> 
      <value>com/mubasher/parsewebpage/entities/Ownerships.hbm.xml</value> 
      <value>com/mubasher/parsewebpage/entities/TargetCompanies.hbm.xml</value> 
      <value>com/mubasher/parsewebpage/entities/TempData.hbm.xml</value> 
      <value>com/mubasher/parsewebpage/entities/Exceptions.hbm.xml</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.connection.useUnicode">true</prop> 
      <prop key="hibernate.connection.characterEncoding">UTF-8</prop> 
      <prop key="hibernate.connection.charSet">UTF-8</prop> 
      <prop key="hibernate.connection.release_mode">after_statement</prop> 
     </props> 
    </property> 
</bean> 

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

и это мой отлаживать код

DEBUG [myExec-2] (JDBCTransaction.java:223) - повторное включение автоматической фиксации DEBUG [myExec-2] (JDBCTransaction.java:143) - совершено соединение JDBC DEBUG [myExec-2] (ConnectionManager.java:427) - агрессивно освобождает соединение JDBC DEBUG [myExec-2] (ConnectionManager.java:464) - освобождение соединения JDBC [(открыть PreparedStatements: 0, глобально: 0) (открыть ResultSets: 0, глобально: 0)] DEBUG [myExec-2] (HibernateTransactionManager.java:734) - Закрытие сеанса спящего режима [[email protected]] после транзакции DEBUG [myExec-2] (SessionFactoryUtils.java:789) - Закрытие сессии Hibernate

но в JProfiler я могу видеть, что соединение остается открытым, как вы видите

enter image description here

это действительно вызывает я проблемы, мое приложение делает огромную работу с базами данных, поэтому мне нужно закрыть соединение, как только работа будет Я должен использовать maxIdle?

ответ

5

Соединения не закрыты, они используются повторно. Это целая цель commons-dbcp, что означает Пул подключений к базе данных.

Установление нового соединения обычно является дорогостоящей операцией. Итак, что делает DBCP, так это то, что вместо закрытия соединения он оставляет его открытым и возвращает его в пул соединений для другого использования.

Если вы хотите, чтобы ваши соединения с базой данных, чтобы получить закрыты и вновь открыты с каждым запросом, то вам необходимо использовать другой источник данных (например org.springframework.jdbc.datasource.SimpleDriverDataSource).


UPDATE 1: Кроме того, обратите внимание, что в вашем примере вы устанавливаете максимальное количество параллельных соединений (maxActive) быть 50000. То есть какой-то экстремальный номер (по умолчанию 8 !!!), что ИМО может вызвать множество проблем.

ОБНОВЛЕНИЕ 2: Использование maxIdle - хорошая идея, если вы не хотите избавиться от пула. Но это не спасет вас от «с незакрытыми соединениями». Если вы думаете об установке maxIdle=0, то полностью опустите бассейн.

UPDAET 3: Мне просто нужно, чтобы подчеркнуть этот один раз - Если вам нужно 50000 параллельных соединений, то есть на самом деле что-то не так с вашим кодом.

+0

Благодарим Павла, проблема в том, что когда я оставляю свое приложение таким образом, и повторное повторение после того, как однажды говорят, пул соединений порождает ошибку, что какой-то запрос был отправлен в источник со вчерашнего дня, и он не вернулся, и когда я использую проверку утечки tomcat, он говорит, что это может быть утечка – engma

+1

Ad. проблема соединения - если у вас есть пул соединений, вам нужно убедиться, что соединение все еще живое (например, машина базы данных может быть перезагружена за время ожидания соединения в пуле), когда вы повторно используете ее. Вот почему 'BasicDataSource' поддерживает' validationQuery'. Когда соединение будет повторно использоваться, пул вызывает этот запрос, чтобы убедиться, что соединение живое. Мы используем 'SELECT 1' (специфичный PostgreSQL, возможно, не работает в MySQL). –

+0

Объявление. утечка памяти - это очень раздражает сообщение проверки Tomcat. Я думаю, вы можете проигнорировать это. –

Смежные вопросы