2013-07-01 3 views
0

Наше веб-приложение находится в режиме разработки, и я видел репликацию шаблона. т. е. сроки выполнения MySQl линейно увеличиваются с количеством запросов.Процедура занимает много времени при одновременных запросах

Наш db довольно маленький (~ 500mb). При открытии страницы три процедуры вызываются параллельно (только чтение, без записи). При обычном прогоне я заметил, что для выполнения процедуры требуется около 0.5 sec. Но интересно наблюдать, что, когда 3 пользователя открывают страницу: для обработки занимает около 3 секунд (т. Е. Вызывается 9 процедур).

Для 5 пользователей (т.е. 15 процедур) около 11 секунд

За 10 пользователей (т.е. 30 процедур) около 20 секунд

И для большего числа пользователей, даже возрастает до 40+ , После чего, даже если я попытаюсь подключить свою базу данных из workbench mysql или так, он не подключается, пока я его не перезапущу. Процедуры доступны только для чтения.

Я звоню от Spring JDBC. Мои config.xml:

//DBCP connection pool settings. 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" p:initialSize="20" p:maxActive="-1" p:minIdle="5" 
    p:maxIdle="35" p:driverClassName="com.mysql.jdbc.Driver" 
    p:url="jdbc:mysql://10.0.1.100/warehouse?useUnicode=true&amp;" 
    p:username="user" p:password="123" p:testOnBorrow="true" 
    p:validationQuery="SELECT 1" /> 
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
</bean> 

Вопрос: Был ли он должен сделать с настройкой MySQL? Или мой пул соединений DBCP? Что еще может быть причиной такого поведения?

+0

Возможно, это зависит от MySQL. Попробуйте выполнить сериализацию доступа к нему, запустив блок «syncronized» вокруг кода доступа db и посмотрите, не изменилось ли это. –

+0

Это действительно (попробовал уже). Но тогда это снова является узким местом. – Jatin

+0

Возможно, вы повторно используете одно соединение с БД? Похоже, что время ответа умножается точно так же, как растет число запросов. Таким образом, пропускная способность остается прежней. Предполагается, что DB будет более параллельной. – darijan

ответ

1

Вопрос: Это связано с настройкой MySQL?

Возможно, нет.

Или мой пул соединений DBCP?

Возможно, нет.

Что еще может быть причиной такого поведения?

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

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

synchronized (someGlobalLock) { 
    // perform queries, updates 
    } 

После этого вы эффективно сериализуете выполнение операций с базой данных для этих запросов. Это приведет к линейному увеличению истекшего времени, когда N запросов выполняются одновременно.


Но, честно говоря, трудно предсказать, что причина не глядя подробно на код Java, схемы и запросов базы данных и (возможно) конфигурации базы данных.

+0

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

+0

Хотя да, все процедуры используют одну и ту же таблицу. – Jatin

+1

@Jatin - Я не думаю, что простое профилирование обязательно скажет вам, есть ли узкое место параллелизма. Во всяком случае, я дал вам некоторые идеи ... и это, вероятно, так же, как любой ответ сможет. –

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