如果我在一个Spring项目中有以下配置,并且应用程序的不同部分得到不同的ServiceA实例,那么由于所有ServiceA实例都将共享一个dataSource实例,是否仍然存在并发问题?我是否只需要知道BasicDataSource是否是线程安全?如果是,那么我没事,如果不是,那么我会有线程问题吗?
<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>发布于 2016-10-19 04:32:01
除非您正在使用一些非常奇怪的数据源,否则不会有任何问题。除了会话bean之外,Spring中的所有bean都应该是无状态的。春天的豆子就会是这样的。如果您在代码中也这样做,您就不会有任何问题。所有的单例bean可能本质上都是静态的,但这会使它们更难测试,因为您将很难对它们进行嘲弄。除了与非会话bean的bean中的状态并发之外的另一个问题是,如果您试图扩展您的应用程序并部署同一个over应用程序的多个实例,它很可能会崩溃。通常,您没有bean使用数据源(尽管您可能也有原因)。您通常使用一个会话工厂,并从您的会话工厂获得当前会话,该工厂具有对数据源的引用。或者使用类似的实体管理器。
编辑来访问评论。无状态bean (没有变量)本质上是线程安全的。因此,除非您的bean有变量,否则任意多的线程可以同时访问它。即使bean正在访问数据库(这种情况是这样的),它仍然是线程安全的,因为数据库为您处理所有并发数据问题。我不太明白你所说的语境转换是什么意思?两个请求可能通过同一个bean运行,但它们将有来自会话工厂的不同会话,没有共享状态,因此不会出现并发问题。
对于会话工厂,您只需了解一下。通常,您会使用类似hibernate的方法将类映射到数据库,并且您的会话就像到数据库的链接。这将处理为您处理数据库的各种方面。绝大多数Spring应用程序都是这样的。如果你谷歌Spring,你会明白我的意思。
我相信对于REST服务是否仍然可以有会话存在很大的争论,但我不能对此进行评论,尽管我知道您可以在URL中传递一个会话id,但是如果您真的没有任何会话和变量,那么除非您引用一个非常奇怪的库,否则您不会出现任何并发问题,因为如果没有共享状态,就不可能存在任何问题。
https://stackoverflow.com/questions/40121814
复制相似问题