Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > MqSql + hibernate +Spring


Автор: PovAnd 21.7.2008, 12:40
Есть приложение работающие с БД в отдельные моменты интенсивно. Вот в такие моменты раз за разом получаю нижеидущий эксепшен. Как его побороть?


12:33:00,072 WARN  JDBCExceptionReporter:77 | SQL Error: 0, SQLState: 08S01
12:33:00,072 ERROR JDBCExceptionReporter:78 | The driver was unable to create a connection due to an inability to establish the client portion of a socket.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.

For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
12:33:00,072 WARN  JDBCExceptionReporter:77 | SQL Error: 0, SQLState: 08S01
12:33:00,087 ERROR JDBCExceptionReporter:78 | The driver was unable to create a connection due to an inability to establish the client portion of a socket.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.

For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
12:33:00,087 WARN  MatchEventsReader:171 | org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:599)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy9.insert(Unknown Source)



--------------
Конфиг sessionFactory в Spring для hibernate:


Код

...
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
...
            </list>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>
...


Как нужно (если можно) ее сконфигурить, так чтобы проблемы не было?


Автор: AntonSaburov 21.7.2008, 17:14
Попробоавть поставить свойство hibernate.connection.pool_size побольше

Автор: chief39 22.7.2008, 22:30
Пробовал?
http://support.microsoft.com/kb/196271
Ты под какой осью?

Добавлено через 1 минуту и 17 секунд
Антон, тут 
12:33:00,072 ERROR JDBCExceptionReporter:78 | The driver was unable to create a connection due to an inability to establish the client portion of a socket.
Имхо, проблема с сокетами - это не уровень хибернейта.
Оно прямым текстом намякиваеть на узкое горлышко оси

Автор: dejavu 10.1.2009, 17:38
Вопрос на тему Нехватка connections MqSql + hibernate +Spring,  .

Ситуация Hоst Provider  установил max кол-во активных конектов к MySQL      = 30
и предположим увеличивать не хочет.

Веб приложение на основе MqSql + hibernate +Spring требует от 10 - до 40 конектов и это без нагрузки в режиме теста 2-3 пользователя (при тесте на другом сервере где количество активных конектов установлено 100)

Думаю возможная причина в настройке пула

В моем случае пробую вот так , все равно создает больше конектов чем 30

  <property name="hibernateProperties">
            <props>
      ..............

                    <!-- configuration pool via c3p0-->
                <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.initial_pool_size">20</prop>
                <prop key="hibernate.c3p0.timeout">5000</prop>
                <prop key="hibernate.c3p0.acquire_increment">1</prop>
        ..................         
          </props>
  </property>            


 
Если у кого нибудь мысли как настроить пул чтобы вписаться в 30 и при этом по возможности повысить производительность

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

Автор: skhilkov 11.1.2009, 10:09
dejavu,  не знаю какая у Вас функциональность, но мне кажется что 40 соединений для 2-3х пользователей - это многовато...
думаю что стоит еще раз пересмотреть все места где устанавливабтся соединения...
Хотя при всем при этом пул не должен вроде как позволять создавать больше подключений.... В общем по поводу c3p0 ничего не могу сказать... я пробовал его год назад, но у меня столько запарок вышло с его настройками, что я пересел на dbcp и с тех пор не знаю проблем...

Автор: barracuda477 11.1.2009, 16:25
Цитата

Пробовал?
http://support.microsoft.com/kb/196271
Ты под какой осью?


там указано про порты больше чем 5000, в то время как для мускуля по дефолту 3306

глянь http://dev.mysql.com/doc/refman/5.1/en/too-many-connections.html
причиной может быть то, что все 30 коннекшенов реально юзаются и мускуль не может тебе выделить больше.

я в хибернейте не силён, разбираюсь как раз. 
но предположу такие выходы:
1) увеличивать лимит коннекшинов в мускуле, например, с 30 до 100 (если хостер согласится)
2) закрывать коннекшены если они не юзаются, возможно твоё приложение всё время создаёт коннекшены вместо того, чтобы реюзать уже те, которые есть в пуле
3) заоптимайзить запросы (если выполняются долго. Кстати, индексы верно проставлены и юзаются? Сколько записей в самых больших таблицах? Насколько сложные запросы ?) Кстати, можно зайти на сервак мускуля и посмотреть что он делает через "showprocesslist".

Цитата

но мне кажется что 40 соединений для 2-3х пользователей - это многовато...


+1



Автор: dejavu 19.1.2009, 12:45
Спасибо всем кто ответил, действительно проблема была не в настройке пула (хотя я считаю разобраться с ним стоило, считаю важная тема при разворачивании на реалном сервере ) а в не зарытых конектах, которые произошли от собственной не внимательности, кому интересно
чтобы не наступали на грабли как я - проверьте закрывает гибернат сессии - здесь почти прямая зависимость сессия- конект в самом общем случае, если правильно настроили транзакт менеджера который и делает в в спринге это за вас все будет работать правильно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)