Singleton EJB বনাম CDI @ApplicationScoped
সহজ শেয়ার্ড-স্টেট ম্যানেজমেন্টের জন্য Singleton EJBs-কে CDI @ApplicationScoped বিন দিয়ে প্রতিস্থাপন করুন।
@Singleton
@Startup
@ConcurrencyManagement(
ConcurrencyManagementType.CONTAINER)
public class ConfigCache {
private Map<String, String> cache;
@PostConstruct
public void load() {
cache = loadFromDatabase();
}
@Lock(LockType.READ)
public String get(String key) {
return cache.get(key);
}
@Lock(LockType.WRITE)
public void refresh() {
cache = loadFromDatabase();
}
}
@ApplicationScoped
public class ConfigCache {
private volatile Map<String, String> cache;
@PostConstruct
public void load() {
cache = loadFromDatabase();
}
public String get(String key) {
return cache.get(key);
}
public void refresh() {
cache = loadFromDatabase();
}
}
কম অ্যানোটেশন নয়েজ (Annotation Noise)
কোনো @ConcurrencyManagement, @Lock, বা @Startup অ্যানোটেশনের প্রয়োজন নেই – কেবল একটি @ApplicationScoped অ্যানোটেশন।
নমনীয় কনকারেন্সি (Flexible Concurrency)
আপনার প্রয়োজনীয় থ্রেড-সেফটির (thread-safety) জন্য java.util.concurrent লক বা volatile ব্যবহার করুন।
সহজ টেস্টিং
প্লেইন CDI বিনসগুলো EJB কন্টেইনার ছাড়াই টেস্টে সরাসরি ইনস্ট্যান্ট (instantiate) করা যায়।
জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
Singleton EJBs কনকারেন্সি ম্যানেজমেন্ট (@Lock, @ConcurrencyManagement) এবং ইগার ইনিশিয়ালাইজেশন (@Startup) EJB কন্টেইনারের মধ্যে নিয়ে আসে। একটি CDI @ApplicationScoped বিন অনেক কম আনুষ্ঠানিকতার সাথে একই সিঙ্গেল-ইনস্ট্যান্স লাইফসাইকেল অর্জন করে। যখন কনকারেন্সি কন্ট্রোলের প্রয়োজন হয়, স্ট্যান্ডার্ড java.util.concurrent ইউটিলিটিগুলো EJB লক অ্যানোটেশনগুলোর চেয়ে আরও সূক্ষ্ম-দানা নিয়ন্ত্রণ (finer-grained control) প্রদান করে।