2016-10-19 4 views
0

Springプロジェクトで次の設定をしていて、アプリケーションのさまざまな部分がServiceAのインスタンスを取得しても、ServiceAのすべてのインスタンスが1つのインスタンスを共有するため、情報元? BasicDataSourceがスレッドセーフであるかどうかを単純に知る必要がありますか?もしそうなら、私は大丈夫です、そうでなければ、スレッドの問題がありますか?Dropwizard AppのSpringスコープ

<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

非常に奇妙なデータソースを使用している場合を除き、問題はありません。 SpringのすべてのBeanはセッションBeanを除いてステートレスでなければなりません。春からの豆の外はこれのようになります。コード内でこれを行うと、問題はありません。すべてのシングルトンBeanは本質的に静的であった可能性がありますが、厳しい時間を費やしてしまうため、テストすることが難しくなります。セッションBeanではない豆の状態を持つ並行性以外の問題は、アプリケーションを拡大して同じWebアプリケーションの複数のインスタンスをデプロイしようとすると、ほとんどが失敗する可能性があります。通常、データソースを使用する豆はありませんが(理由はあるかもしれませんが)。通常、セッションファクトリで作業し、データソースへの参照を持つセッションファクトリから現在のセッションを取得します。または、類似したエンティティマネージャを使用します。

コメントに対処する。ステートレスBean(変数なし)は、本質的にスレッドセーフです。だから、あなたのBeanに変数がある場合を除き、必要な数のスレッドを同時にアクセスできます。 Beanがデータベースにアクセスしている場合であっても、データベースがすべての並行処理データの問題を処理するため、Beanはスレッドセーフです。私はあなたが文脈の切り替えによって何を意味するのかについてはあまりよく分かりません。 2つの要求は同じBeanを介して実行されることがありますが、セッションファクトリとは異なるセッションを持ちます。共有状態がないため、同時実行性の問題は発生しません。

セッションファクトリを使用すると、それを読み取るだけで済みます。通常は、クラスをデータベースにマッピングするためにhibernateのようなものを使用し、セッションはデータベースへのリンクのようなものです。これはあなたのためのデータベースを扱うためのあらゆる側面を処理します。 Springアプリケーションの大部分はこのようなものです。あなたがGoogleのSpring MVCを冬眠すると、私の言いたいことがわかります。

私は、RESTサービスがまだセッションを持つことができるかどうかについて大きく議論していると思いますが、実際にコメントすることはできませんが、URLにセッションIDを渡すことはできます非常に奇妙なライブラリを参照していない限り、共有状態が存在しない場合には問題が存在しないため、実際にはセッションや変数はありません。

+0

"すべての豆はステートレスでなければなりません"。これはどうやって私を守っているの?デフォルトスコープはシングルトンです。したがって、Springが2つの要求を処理するとき、両方の要求が同じBeanを介して実行される可能性はありませんか?要求を処理する途中でコンテキストスイッチが可能ではないでしょうか? – MedicineMan

+0

"通常、あなたのBeanはデータソースを使用しませんが(理由はありますが)、セッションファクトリで作業し、セッションファクトリから現在のセッションを取得するだけです。あなたがここで言っていることを理解していない。あなたは少し詳しく説明できますか? – MedicineMan

+0

実際にはここでRESTサービスを行っているので、話すセッションはありません。 – MedicineMan

関連する問題