Hibernate / Spring: множество (тысячи) открытых соединений базы данных - PullRequest
2 голосов
/ 17 июня 2011

У меня на моем сервере развернут Spring / hibernate / mysql.С некоторых дней я сталкиваюсь с проблемой, что мое приложение, похоже, открывает много соединений с базой данных.Я извлекаю эту подсказку из вывода netstat, который выглядит следующим образом (IP-адреса обфусцированы):

tcp6       0      0 ************:53547       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53595       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53645       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:34986       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53669       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53710       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53757       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53716       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53627       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53752       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53505       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53549       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:35185       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53604       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:35331       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53488       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:34938       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:34987       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53695       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:35380       ************:3306        TIME_WAIT   0          0           -
tcp6       0      0 ************:53651       ************:3306        TIME_WAIT   0          0           -

Однако, глядя на вкладку работоспособности MySQL Workbench Server для моей базы данных MySQL, она выглядит так, как всевсе будет в порядке (см. скриншот).

Кроме того, у моего приложения нормальная производительность.

В настоящее время мы активно разрабатываем приложение, но не видим изменений в коде, влияющих на это поведение.Очевидно, это должно было быть изменение, но это также может быть проблема конфигурации или что-то в этом роде.

Может ли это быть Hibernate Connection Pool?Странно то, что все соединения ждут.

Я благодарен за все идеи и подсказки!

Редактирование - Конфигурация Hibernate (с использованием Spring)

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://************:3306/********</value> 
    </property>
    <property name="username">
        <value>********</value>
    </property>
    <property name="password">
        <value>********</value>
    </property>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="configLocation">
            <value>WEB-INF/hibernate.hbm.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.jdbc.batch_size">0</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.bytecode.provider">cglib</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="eventListeners">
            <map>
                <entry key="save-update" value-ref="saveUpdateEventListener" />
            </map>
        </property>
    </bean>

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

РЕШЕНИЕ: Я теперь закончилиспользуя Tomcats JNDI Datasource и он наконец работает.Только 11 (!!) подключений к используемой базе данных;) Спасибо @Vineet Reynolds

1 Ответ

3 голосов
/ 17 июня 2011

Документация Hibernate описывает, как в Hibernate устанавливаются пулы соединений:

Hibernate will obtain and pool connections using java.sql.DriverManager if you set the following properties:

Table 3.1. Hibernate JDBC Properties

Property name                       Purpose
hibernate.connection.driver_class   JDBC driver class
hibernate.connection.url            JDBC URL
hibernate.connection.username       database user
hibernate.connection.password       database user password
hibernate.connection.pool_size      maximum number of pooled connections

и, что более важно:

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

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

Что касается вывода команды netstat, то число соединений и причина их открытия являются наиболее важными критериями для решения проблемы. Обычно готовые к реализации реализации пула открывают соединения только при необходимости и также могут уменьшать размеры пула. Кроме того, такой менеджер пула может прервать соединения, если они не используются. Может показаться, что из числа соединений, которые находятся в состоянии TIME_WAIT, сервер ожидает трафика от клиента; это может быть в случае физического сброса соединения после того, как он больше не требуется.

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

Обновление

На основании опубликованной конфигурации Spring Hibernate представляется, что источник данных используется для получения соединений для Hibernate . Следовательно, будет использоваться конфигурация базового пула соединений за источником данных.

Обновление № 2

Обновленный файл контекста приложения Spring использует DriverManagerDataSource из среды Spring. Изложение объявления дословно из документации:

ПРИМЕЧАНИЕ. Этот класс не является пул соединений; это на самом деле не Подключения к бассейну. Он просто служит простая замена для полноценного пул соединений, реализующий то же самое стандартный интерфейс, но создание нового Соединения при каждом звонке.

Важно отметить, что DriverManagerDataSource использует предоставленные ему свойства для создания соединения. И как указано в документации, для создания соединений будет использоваться DriverManager вместо JNDI-связанного источника данных. Важным моментом здесь является то, что DriverManager обычно возвращает физические соединения с базой данных, в отличие от источников данных, которые возвращают обертки логических соединений. Из вывода netstat выясняется, что эти физические соединения не закрываются. Возможно, Hibernate не закрывает соединения; но это маловероятно; вам лучше использовать более эффективную реализацию пула соединений, которую можно настроить так, чтобы иметь фактический пул объектов соединений, которые никогда не превышают размер пула.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...