2009-03-11 6 views
1

App Server의 가동 시간 동안 객체를 데이터 구조에 저장할 수 있습니까? 기본적으로이 데이터 구조와 인터페이스하는 EJB를 원하지만 완전한 데이터베이스 솔루션은 필요하지 않습니다.데이터 구조의 EJB 및 저장 객체 (Map, List 등)

다음
package com.test.beans; 

import java.util.Map; 

import javax.ejb.Remote; 

import com.test.entities.Animal; 

@Remote 
public interface MapBeanRemote { 

    public void addAnimal(Animal a); 

    public void removaAnimal(Integer id); 

    public Animal getAnimalById(Integer id); 

    Map<Integer, Animal> getAllAnimals(); 

} 

는 세션 빈입니다 :

package com.test.beans; 

import java.util.ConcurrentHashMap; 
import java.util.Map; 

import javax.annotation.PostConstruct; 
import javax.ejb.Stateless; 

import com.test.entities.Animal; 

@Stateless(mappedName="ejb/MapBean") 
public class MapBean implements MapBeanRemote{ 

    Map<Integer, Animal> animalStore; 

    @PostConstruct 
    public void initialize(){ 
     animalStore = new ConcurrentHashMap<Integer,Animal>(); 
    } 

    @Override 
    public void addAnimal(Animal a) { 
     if(a.getId()!=null){ 
      animalStore.put(a.getId(), a); 
     } 
    } 

    @Override 
    public Animal getAnimalById(Integer id) { 
     return animalStore.get(id); 
    } 

    @Override 
    public void removaAnimal(Integer id) { 
     animalStore.remove(id); 

    } 

    @Override 
    public Map<Integer, Animal> getAllAnimals() { 
     return animalStore; 
    } 

} 
그래서 여기

package com.test.entities; 

public class Animal implements java.io.Serializable { 

    private static final long serialVersionUID = 3621626745694501710L; 
    private Integer id; 
    private String animalName; 

    public Integer getId() { 
     // TODO Auto-generated method stub 
     return id; 
    } 
    public void setId(Integer id){ 
     this.id=id; 
    } 
    public String getAnimalName(){ 
     return animalName; 

    } 
    public void setAnimalName(String animalName){ 
     this.animalName=animalName; 
    } 
} 

EJB 원격 인터페이스입니다 :이 더미 동물 개체를 만든 예를 들어

기본적으로 나는 t를 조작하고자하는 클라이언트를 원한다. 그는 Animal Map을 사용하여이 EJB를 탐색하고 각 클라이언트가 동일한 정확한 객체 맵에 액세스하게합니다.

이 예제는 충분하지 않습니다. 잠시 후 모든 동물이 지워진다. (EJB가 빈 풀에서 대체 될 때 나는 추측한다.) 어떻게 든 자원으로 주입 될 수 있을까?

답변

3

Map을 Singleton에 넣고 Bean에서이 싱글 톤에 액세스하여 수행 할 수 있습니다. 그렇게하면 모든 EJB 인스턴스에 대해 단일 인스턴스가 생깁니다 (동일한 클래스 로더를 공유하기 때문에). 다른 EAR의 다른 Session Bean은 각각 고유 한 클래스 로더를 가지므로 작동하지 않지만 시나리오는 아닙니다.

ConcurrentHashMap의 기존 사용으로 대부분의 경우를 충분히 처리 할 수 ​​있지만 두 메소드 호출간에 맵이 일치해야하므로 addAnimal 메소드를 동기화해야합니다.

0

나는 데이터 구조를 EJB 밖으로 완전히 이동시키고 정적 데이터 구조로 저장하는 것이 가장 좋다고 생각한다. EJB가 풀 (pool)되기 때문에 객체가 지워지고 있다는 사실에 아마 맞을 것이다.

스레드 안전성을 보장하기 위해 액세스를 동기화해야하는 데이터 구조에 대한 액세스를 구현하는 방법에 따라 달라집니다.

EJB 내부에서 상태를 유지하려면 Stateful Session Bean을 살펴보십시오. 당신은 콩이 당신은 내가이 무 상태 세션 빈 자바 5

+0

감사합니다. Stateful Session Bean은 전체 응용 프로그램 서버가 아닌 특정 클라이언트에서만 상태를 유지할 수 있습니다. – systemoutprintln

+0

예, 죄송합니다. – Karl

1

에 대한 주석을 잊지 ejbremove 메소드를 오버라이드 (override) 할 수 파괴되었을 때보고 싶지 않았다 또한합니다. 이름에서 알 수 있듯이 그런 빈에는 어떤 종류의 상태도 있어서는 안됩니다. EJB 컨테이너는 동시 요청을 만족시키기 위해 빈의 여러 인스턴스와 함께 작동 할 수 있습니다. 모든 인스턴스의 목록 데이터를 어떻게 동기화합니까? 나는 이것을 할 방법이 없다.

비즈니스 로직을 규정 한 세션 빈에 그러한 목록을 유지하는 것은 제 의견으로는 비즈니스 계층의 개념을 위반하는 것입니다. 당신은 당신 자신의 트랜잭션과 동시 쓰기를 처리해야합니다.

왜 클라이언트 측에서 동물 목록을 갖고 있지 않습니까? 나는 이것이 더 나은 방법이 될 것입니다.

+0

나는 비즈니스 계층의 개념을 위반하는 것에 동의한다. 그래서 이상적으로지도를 일종의 자원으로 주입 할 수 있습니다. Java SE 응용 프로그램을 Java EE 컨텍스트로 shoehorning하기 때문에 서버 측에서 Map을 사용할 수 있어야합니다. – systemoutprintln

+0

사악한 생각 : 모든 세션 빈에서 사용되는 정적 맵을 사용하는 정적 클래스를 사용하고 맵의 동기화가 잘 구현되고 작업을 수행하는 컨테이너에 영향을주지 않기를 바랍니다. – Timo

2

새로운 EJB 3.1 스펙은 새로운 유형의 bean (Singleton beans)을 제공합니다. 내가 아는 EJB 3.1을 부분적으로 지원하는 유일한 구현은 Apache OpenEJB 3.1입니다.그것은 싱글 톤 콩을 포함하지만 아직 그들을 사용하지 않았습니다.