Spring同時アクセスのスレッドセキュリティの問題
5594 ワード
まずSpringのIOCにとって、対象はSpringが管理してくれます.つまりSpringが起動したとき、Springコンテナの中でSpringが作成してくれて、Springがメンテナンスしてくれます.一般的には一例のオブジェクトです.
Spring生成オブジェクトのデフォルトは単一の例です.scopeプロパティを使用すると、複数の例に変更できます.
セクション1:Spring生成オブジェクトのデフォルトが単一の例であることを確認します.
次に、ネット上の例を検証します.
出力結果:
結果
例:true
非単一例:false
注意:複合データ型の"=="はメモリに格納されているアドレスと比較されますので、ここでは"="を使用して比較します.
objectのequals初期動作は比較メモリのアドレスであるため,(String,Integer,Dateなど)いくつかのクラスライブラリで上書きされている.
第2部:SpringMVCとStruts 2の同時アクセスNoスレッドセキュリティの問題があります.
SpringMVCとStruts 2を使用したことがある人にとって、SpringMVCはメソッドベースのブロックであり、Struts 2はクラスベースのブロックであることはよく知られています.
Struts 2の場合、strutsは1つのリクエストを処理するたびにオブジェクトをインスタンス化するため、これでスレッドのセキュリティの問題はなくなります.
SpringのcontrollerのデフォルトはSingletonです.これは、requestごとにシステムが元のinstanceで処理されることを意味します.これにより、2つの結果が得られます.
1つは、Controllerを作成するたびに、オブジェクトの作成とゴミ収集の時間を短縮することです.Controllerのinstanceが1つしかないため、複数のスレッドが呼び出されると、その中のinstance変数はスレッドが安全ではなく、データのスキップの問題が発生します.
もちろん、beanでインスタンス変数が宣言されていない限り、dao、serviceなどのスレッドセキュリティの問題を考慮する必要はありません.したがって、spring mvcのcontrllerを使用する場合は、controllerでインスタンス変数を定義することを避ける必要があります.次のようになります.
ソリューション:
1、ControllerでThreadLocal変数を使用する2、springプロファイルControllerでscope="prototype"を宣言する2、springを使用してwebを開発するたびに新しいcontrollerを作成する場合は、デフォルトのController、Dao、Serviceは単一の例であることに注意してください.
例:
第3部:springMVCとstruts 2の違い.
以下はネット上から抜粋した比較ですが、ご覧のように
クリックしてリンクを開く
1.メカニズム:spring mvcのエントリはservletであり、struts 2はfilterであり、両者のメカニズムの違いを招く.
2.パフォーマンス:springはstrutsより少し速いです.Spring mvcはメソッドベースの設計であり、sturtsはクラスベースであり、リクエストを1回送信するたびにactionがインスタンス化され、各actionには属性が注入され、springはメソッドベースで粒度がより細いが、servlet制御データのように把握することに注意しなければならない.Spring 3 mvcはメソッドレベルのブロックであり、メソッドをブロックした後、パラメータ上の注釈に基づいてrequestデータを注入し、spring 3 mvcでは、1つのメソッドが1つのrequestコンテキストに対応する.struts 2フレームワークはクラスレベルのブロックであり、要求が来るたびにActionを作成し、setter getterメソッドを呼び出してrequestのデータを注入する.struts 2は実際にsetter getter法によってrequestと付き合っている.struts 2では、1つのActionオブジェクトがrequestコンテキストに対応します.
3.パラメータ伝達:strutsはパラメータを受け入れるときに属性でパラメータを受け入れることができ、これはパラメータが複数の方法で共有されていることを示している.
4.設計思想上:strutsはoopのプログラミング思想にもっと合っており、springは慎重でservletに拡張されている.
5.intercepterの実現メカニズム:strutsは独自のinterceptorメカニズムを持ち、spring mvcは独立したAOP方式を用いている.このようにstrutsのプロファイル量はspring mvcよりも大きく、strutsの構成は継承できるので、使用上spring mvcの使用はより簡潔で、開発効率Spring MVCはstruts 2より確かに高いと思います.Spring mvcはメソッドレベルのブロックであり、1つのメソッドはrequestコンテキストに対応し、メソッドはurlに同時に対応するので、アーキテクチャ自体からspring 3 mvcでrestful urlを実現しやすいと言われています.struts 2はクラスレベルのブロックであり、1つのクラスはrequestコンテキストに対応する.struts 2 actionの1つの方法がurlに対応できるため、restful urlを実現するのは骨が折れる.クラス属性はすべてのメソッドで共有されており、その属するメソッドを注釈や他の方法で識別することはできません.Spring 3 mvcのメソッド間は基本的に独立しており、request responseデータを独占しており、要求データはパラメータによって取得され、処理結果はModelMapによってフレームワークメソッド間に渡されて変数を共有しないが、struts 2は混乱しており、メソッド間も独立しているが、そのすべてのAction変数は共有されており、プログラムの実行に影響を与えないが、符号化されている.プログラムを読むときに迷惑をかける.
6.またspring 3 mvcの検証もハイライトであり、JSR 303をサポートし、ajaxの要求を処理するのがより便利であり、注釈@ResponseBodyを1つだけで、応答テキストに直接戻ることができる.
まとめ:
SpringMVCもサーブレットもメソッドのスレッドセキュリティであることを示しているので,クラスメソッドで宣言されるプライベート変数や公有変数はスレッドセキュリティではなくstruts 2は確かにスレッドセキュリティである.
第四部分:では、Struts 2+Springに対して注入を管理するときは?
Struts 2はマルチインスタンスであり、各リクエストに対して1つのインスタンスが生成されます.springのデフォルトは単一インスタンスです(strutsとSpringを統合する2つの方法についてstruts 2とspringの2つの統合方法について説明します).
一:Springプラグイン(Struts 2-spring-plugin-XX.jar)のない統合方式では、springのaction Beanにビジネスロジックコントローラクラスをscope=「prototype」に追加する必要があります.
二:Springプラグイン(Struts 2-spring-plugin-XX.jar)の統合方法:Struts SpringObjectFactoryと関連するコードを逆コンパイルして発見し、struts actionのプロファイルに中classに書かれている完全なパッケージ名とクラス名であればstrutsがactionオブジェクト、すなわちマルチインスタンスを作成します.
まとめ:springプロファイルのbeanの名前であればspringが作成されます.単一インスタンスまたは複数インスタンスはspringのaction Beanのビジネスロジックコントローラクラスがscope="prototype"に構成されているかどうか、複数のインスタンスがあります.単一インスタンスではありません.順序はspringから探して、strutsプロファイルから探しません.
Spring生成オブジェクトのデフォルトは単一の例です.scopeプロパティを使用すると、複数の例に変更できます.
セクション1:Spring生成オブジェクトのデフォルトが単一の例であることを確認します.
次に、ネット上の例を検証します.
<bean id="singleton" class="java.util.Date" scope="singleton"></bean>
<bean id="prototype" class="java.util.Date" scope="prototype"></bean>
package test;
import java.util.Date;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.opensymphony.xwork2.ActionContext;
public class TestScope {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-web.xml");
Date s1=(Date)context.getBean("singleton");
Date p1=(Date)context.getBean("prototype");
Date s2=(Date)context.getBean("singleton");
Date p2=(Date)context.getBean("prototype");
System.out.println(" :"+(s1==s2));
System.out.println(" :"+(p1==p2));
}
}
出力結果:
結果
例:true
非単一例:false
注意:複合データ型の"=="はメモリに格納されているアドレスと比較されますので、ここでは"="を使用して比較します.
objectのequals初期動作は比較メモリのアドレスであるため,(String,Integer,Dateなど)いくつかのクラスライブラリで上書きされている.
第2部:SpringMVCとStruts 2の同時アクセスNoスレッドセキュリティの問題があります.
SpringMVCとStruts 2を使用したことがある人にとって、SpringMVCはメソッドベースのブロックであり、Struts 2はクラスベースのブロックであることはよく知られています.
Struts 2の場合、strutsは1つのリクエストを処理するたびにオブジェクトをインスタンス化するため、これでスレッドのセキュリティの問題はなくなります.
SpringのcontrollerのデフォルトはSingletonです.これは、requestごとにシステムが元のinstanceで処理されることを意味します.これにより、2つの結果が得られます.
1つは、Controllerを作成するたびに、オブジェクトの作成とゴミ収集の時間を短縮することです.Controllerのinstanceが1つしかないため、複数のスレッドが呼び出されると、その中のinstance変数はスレッドが安全ではなく、データのスキップの問題が発生します.
もちろん、beanでインスタンス変数が宣言されていない限り、dao、serviceなどのスレッドセキュリティの問題を考慮する必要はありません.したがって、spring mvcのcontrllerを使用する場合は、controllerでインスタンス変数を定義することを避ける必要があります.次のようになります.
public class Controller extends AbstractCommandController {
protected Company company;
protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception {
company = ................;
}
}
ソリューション:
1、ControllerでThreadLocal変数を使用する2、springプロファイルControllerでscope="prototype"を宣言する2、springを使用してwebを開発するたびに新しいcontrollerを作成する場合は、デフォルトのController、Dao、Serviceは単一の例であることに注意してください.
例:
@Controller
@RequestMapping("/fui")
public class FuiController extends SpringController {
//
@Controller
@Scope("prototype")
@RequestMapping("/fui")
public class FuiController extends SpringController {
//
第3部:springMVCとstruts 2の違い.
以下はネット上から抜粋した比較ですが、ご覧のように
クリックしてリンクを開く
1.メカニズム:spring mvcのエントリはservletであり、struts 2はfilterであり、両者のメカニズムの違いを招く.
2.パフォーマンス:springはstrutsより少し速いです.Spring mvcはメソッドベースの設計であり、sturtsはクラスベースであり、リクエストを1回送信するたびにactionがインスタンス化され、各actionには属性が注入され、springはメソッドベースで粒度がより細いが、servlet制御データのように把握することに注意しなければならない.Spring 3 mvcはメソッドレベルのブロックであり、メソッドをブロックした後、パラメータ上の注釈に基づいてrequestデータを注入し、spring 3 mvcでは、1つのメソッドが1つのrequestコンテキストに対応する.struts 2フレームワークはクラスレベルのブロックであり、要求が来るたびにActionを作成し、setter getterメソッドを呼び出してrequestのデータを注入する.struts 2は実際にsetter getter法によってrequestと付き合っている.struts 2では、1つのActionオブジェクトがrequestコンテキストに対応します.
3.パラメータ伝達:strutsはパラメータを受け入れるときに属性でパラメータを受け入れることができ、これはパラメータが複数の方法で共有されていることを示している.
4.設計思想上:strutsはoopのプログラミング思想にもっと合っており、springは慎重でservletに拡張されている.
5.intercepterの実現メカニズム:strutsは独自のinterceptorメカニズムを持ち、spring mvcは独立したAOP方式を用いている.このようにstrutsのプロファイル量はspring mvcよりも大きく、strutsの構成は継承できるので、使用上spring mvcの使用はより簡潔で、開発効率Spring MVCはstruts 2より確かに高いと思います.Spring mvcはメソッドレベルのブロックであり、1つのメソッドはrequestコンテキストに対応し、メソッドはurlに同時に対応するので、アーキテクチャ自体からspring 3 mvcでrestful urlを実現しやすいと言われています.struts 2はクラスレベルのブロックであり、1つのクラスはrequestコンテキストに対応する.struts 2 actionの1つの方法がurlに対応できるため、restful urlを実現するのは骨が折れる.クラス属性はすべてのメソッドで共有されており、その属するメソッドを注釈や他の方法で識別することはできません.Spring 3 mvcのメソッド間は基本的に独立しており、request responseデータを独占しており、要求データはパラメータによって取得され、処理結果はModelMapによってフレームワークメソッド間に渡されて変数を共有しないが、struts 2は混乱しており、メソッド間も独立しているが、そのすべてのAction変数は共有されており、プログラムの実行に影響を与えないが、符号化されている.プログラムを読むときに迷惑をかける.
6.またspring 3 mvcの検証もハイライトであり、JSR 303をサポートし、ajaxの要求を処理するのがより便利であり、注釈@ResponseBodyを1つだけで、応答テキストに直接戻ることができる.
まとめ:
SpringMVCもサーブレットもメソッドのスレッドセキュリティであることを示しているので,クラスメソッドで宣言されるプライベート変数や公有変数はスレッドセキュリティではなくstruts 2は確かにスレッドセキュリティである.
第四部分:では、Struts 2+Springに対して注入を管理するときは?
Struts 2はマルチインスタンスであり、各リクエストに対して1つのインスタンスが生成されます.springのデフォルトは単一インスタンスです(strutsとSpringを統合する2つの方法についてstruts 2とspringの2つの統合方法について説明します).
一:Springプラグイン(Struts 2-spring-plugin-XX.jar)のない統合方式では、springのaction Beanにビジネスロジックコントローラクラスをscope=「prototype」に追加する必要があります.
<bean id="user" class="modle.User" scope="prototype"></bean>
二:Springプラグイン(Struts 2-spring-plugin-XX.jar)の統合方法:Struts SpringObjectFactoryと関連するコードを逆コンパイルして発見し、struts actionのプロファイルに
まとめ:springプロファイルのbeanの名前であればspringが作成されます.単一インスタンスまたは複数インスタンスはspringのaction Beanのビジネスロジックコントローラクラスがscope="prototype"に構成されているかどうか、複数のインスタンスがあります.単一インスタンスではありません.順序はspringから探して、strutsプロファイルから探しません.