문제

앱 서버의 가동 시간 동안 데이터 구조에 객체를 저장할 수 있습니까? 기본적 으로이 데이터 구조와 인터페이스하는 EJB를 원하지만 완전한 신생 데이터베이스 솔루션이 필요하지 않습니다.

예를 들어 나는이 더미 동물 대상을 만들었습니다.

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 리모컨 상호 작용:

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();

}

다음은 세션 Bean입니다.

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;
    }

}

따라서 기본적으로 나는 동물지도를 조작하려는 모든 고객 이이 EJB를 통과하고 각 클라이언트가 동일한 객체 맵에 액세스하도록하기를 원합니다.

이 예는 충분히 잘 작동하지 않습니다. 잠시 후 모든 동물이 지워지고 (EJB가 콩 수영장에서 교체 될 때를 가정하고 있습니다) 이것은 어떻게 든 자원으로 주입 될 수 있습니까?

도움이 되었습니까?

해결책

이것은 싱글 톤에지도를 넣고 콩 에서이 싱글 톤에 액세스하여 달성 할 수 있습니다. 이렇게하면 모든 EJB 인스턴스에 대한 단일 인스턴스가 있습니다 (동일한 클래스 로더를 공유하므로). 다른 귀에있는 다른 세션 콩은 각자 자체 클래스 로더를 가지고 있기 때문에 작동하지 않지만 시나리오는 아닙니다.

기존 ConsperEthashMap의 사용은 대부분의 케이스를 충분히 처리하지만 두 메소드 호출 사이에 맵이 일관되도록 맵이 필요하기 때문에 여전히 AddAnimal 메소드 주위의 동기화가 필요합니다.

다른 팁

New EJB 3.1 사양은 새로운 유형의 콩 (Singleton Bean)을 제공합니다. 내가 아는 EJB 3.1의 부분 지원을 갖춘 유일한 구현은 Apache Openejb 3.1입니다. 싱글 톤 콩이 포함되어 있지만 아직 사용하지 않았습니다.

이것은 무국적 세션 콩입니다. 이름에서 알 수 있듯이 그러한 콩에 어떤 종류의 상태도 유지해서는 안됩니다. EJB 컨테이너는 동시 요청을 만족시키기 위해 여러 콩 인스턴스와 함께 작동 할 수 있습니다. 모든 인스턴스 목록의 데이터를 어떻게 동기화합니까? 나는 이것을 할 방법이 없다.

비즈니스 논리를 입증 한 세션 Bean에 그러한 목록을 제시하면 제 생각에는 비즈니스 계층의 개념을 위반합니다. 당신은 당신 자신의 거래를 처리하고 동시 글쓰기를 처리해야합니다.

고객 측에서 동물 목록을 잡지 않는 이유는 무엇입니까? 나는 이것이 더 나은 방법이 될 것입니다.

가장 좋은 생각은 데이터 구조를 EJB에서 완전히 옮기고 정적 데이터 구조로 저장하는 것입니다. EJB가 풀링 되었기 때문에 객체가 지워지고 있다는 사실에서 당신은 아마도 맞을 것입니다.

참고 데이터를 구현하는 방법에 따라 스레드 안전을 보장하기 위해 액세스를 동기화하는 데 필요한 많은 사람들이 필요합니다.

EJB 내부에서 상태를 유지하려면 상태가 높은 세션 Bean을 보는 것을 고려하십시오. 또한 콩이 언제 파괴되었는지보고 싶다면 ejbremove 방법을 무시할 수 있습니다. Java 5에 대한 주석을 잊어 버릴 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top