EJBs وتخزين الأشياء في بنية البيانات (الخريطة, قائمة, الخ)

StackOverflow https://stackoverflow.com/questions/636450

سؤال

هل من الممكن أن يكون الكائنات المخزنة في بنية البيانات طوال مدة التطبيق الملقم الجهوزية ؟ أساسا أنا أريد 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();

}

هنا الدورة الفول:

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 الحالات (حيث أنها تشترك في نفس classloader).مختلفة الدورة الفول في مختلف الأذن قد لا تعمل كما لو أنها لكل classloader, ولكن هذا لا يبدو أن السيناريو الخاص بك.

القائمة الخاصة بك استخدام ConcurrentHashMap تكفل التعامل مع معظم الحالات ولكن كنت لا تزال بحاجة تزامن حول addAnimal الأسلوب منذ كنت في حاجة إلى خريطة أن تكون متسقة بين طريقة المكالمات.

نصائح أخرى

جديد EJB 3.1 المواصفات يوفر نوع جديد من حبوب المفرد الفاصوليا - التي هي بالضبط ما تحتاجه.فقط التنفيذ مع دعم جزئي من EJB 3.1 أعرف من هو أباتشي OpenEJB 3.1.فإنه يشمل المفرد الفاصوليا ولكن لم استخدمها حتى الآن.

هذا هو عديمي الجنسية الدورة الفول.كما يوحي الاسم يجب أن لا يحمل أي نوع من الدولة في مثل هذه فول.أ EJB الحاويات قد عمل مع مثيلات متعددة من الفول لتلبية الطلبات المتزامنة.كيف يمكنك مزامنة البيانات من قوائم جميع الحالات ؟ أنا شيء ليس هناك طريقة للقيام بذلك.

Mainting هذه القائمة في الدورة الفول ، provied منطق الأعمال ، حتى ينتهك مفهوم طبقة رجال الأعمال في رأيي.عليك أن تأخذ الرعاية من المعاملات المتزامنة الكتابة الخاصة بك.

لماذا لا تعقد قائمة الحيوانات على العميل الجانب ؟ أعتقد أن هذا سيكون أفضل طريقة.

أعتقد أن أفضل أعتقد أن نقل البيانات هيكل من EJB تماما وتخزينه ثابت بنية البيانات.ربما الصحيح في حقيقة أن الكائنات يجري محوها لأن EJB ما يجري المجمعة.

ملاحظة اعتمادا على كيفية تنفيذ الوصول إلى datastructure لك العديد من الحاجة لمزامنة الوصول إلى ضمان سلامة الموضوع.

إذا كنت ترغب في الحفاظ على الدولة داخل EJB ثم النظر في جليل الدورة الفاصوليا.أيضا إذا كنت تريد أن ترى عندما الفاصوليا يجري تدميرها يمكنك تجاوز ejbremove طريقة أنسى الشرح جافا 5.

كارل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top