2016-10-19 3 views
0

Если у меня есть следующая конфигурация в проекте Spring, а в разных частях приложения есть разные экземпляры ServiceA, у меня все еще будет проблема параллелизма, потому что все экземпляры ServiceA будут совместно использовать один экземпляр источник данных? Нужно ли мне просто знать, является ли BasicDataSource потокобезопасным? Если да, тогда я в порядке, если это не так, тогда у меня будут проблемы с потоками?Spring scope в приложении Dropwizard

<bean id="serviceA" name="serviceA" class="com.company.ServiceA" scope="prototype"> 
    <constructor-arg name="dataSource" ref="dataSource"/> 
</bean> 

<bean id="dataSource" destroy-method="close" name="dataSource" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="${dbConnectionUrl}"/> 
    <property name="username" value="${user}"/> 
    <property name="password" value="${password}"/> 
    <property name="initialSize" value="${connectionSize}" /> 
    <property name="maxActive" value="${maxConnectionSize}" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="testOnBorrow" value="true" /> 
</bean> 

ответ

0

У вас не возникнет проблем, если вы не используете какой-то очень странный источник данных. Все ваши бобы весной должны быть апатридами, за исключением сессионных компонентов. Из коробки бобы из Весны будут такими. Если вы это сделаете и в своем коде, у вас не будет никаких проблем. Все ваши одноэлементные бобы могли быть по существу статичными, но это сделало бы их менее или не поддающимися проверке, так как вам было бы сложно издеваться над ними. Другая проблема, помимо параллелизма с состоянием в ваших компонентах, которые не являются сессионными компонентами, заключается в том, что если вы попытаетесь расширить приложение и развернуть несколько экземпляров одного и того же веб-приложения, это, скорее всего, упадет. Как правило, у вас нет компонентов, использующих источник данных (хотя у вас могут быть и причины). Обычно вы работаете с заводом-изготовителем и просто получаете текущую сессию со своей фабрики сеансов, которая имеет ссылку на источник данных. Или с помощью менеджера объектов, который аналогичен.

Редактировать Обращаем внимание на комментарии. Агенты без состояния (без переменных) по сути являются потокобезопасными. Поэтому, если у вашего компонента нет переменных, столько потоков, сколько вы хотите, могут получить к нему доступ в одно и то же время. Даже если бобы обращаются к базе данных, это все равно будет потокобезопасным, потому что база данных обрабатывает все проблемы с данными параллелизма для вас. Я не слишком уверен, что вы подразумеваете под переключением контекста? Два запроса могут выполняться через один и тот же компонент, но у них будут разные сеансы с фабрики сеансов, не будет общего состояния, поэтому проблем с параллелизмом не будет.

С фабрикой сеансов вам просто нужно будет прочитать об этом. Обычно вы используете что-то вроде hibernate для сопоставления классов в базе данных, а ваш сеанс похож на вашу ссылку на базу данных. Это позволяет использовать всевозможные аспекты работы с базой данных для вас. Подавляющее большинство приложений Spring - вот так. Если вы используете hibernate в Spring Spring MVC, вы увидите, что я имею в виду.

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

+0

«все бобы должны быть без гражданства». Как это защищает меня? Значение по умолчанию - одноточечная. Поэтому, когда Spring обрабатывает два запроса, возможно, оба запроса не будут проходить через один и тот же компонент? Не было бы возможным контекстный переключатель в середине обработки запроса? – MedicineMan

+0

«Обычно у вас нет компонентов, использующих источник данных (хотя у вас могут быть и причины). Обычно вы работаете с заводом-изготовителем и просто получаете текущую сессию со своей фабрики сеансов, которая имеет ссылку на источник данных» - я сделал Не понимаю, что вы здесь говорили. Не могли бы вы немного разобраться? – MedicineMan

+0

На самом деле, я делаю услугу REST здесь, поэтому нет сеансов для обсуждения. – MedicineMan

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