2013-01-31 22 views
5

Designing J2EE Applications for Real-Life Clustered EnvironmentsJava statik değişken

bu makalede küme ortamında java statik değişkeni kullanamazsınız dedi, ama biz özelliği gibi statik değişkeni kullanmak istiyorsanız (bir kümelenmiş tüm nesne tarafından paylaşılan değerin yalnızca bir kopyası uygulama) ne kullanmalıyız?

+0

Bu makalenin 2004 yılında yazıldığını, bazı içeriğin hala doğru olduğunu, bunu bir referans olarak kullanmayacağımı unutmayın. –

+0

değişmez içsel sınıfı "tüm nesneler tarafından paylaşılan tek bir kopya" olarak düşünebilirsiniz Paylaşılan durum bazı temel veri türleriyse, son örnek değişken gereksiniminize uymalıdır. – spiritwalker

+1

Verileriniz işlemler sırasında değişmezse (ör., Bazı özellik dosyaları yüklediyseniz) 'static' kullanabilirsiniz. Tek dezavantaj iki kere (her JVM için bir kere) başlatmanız gerektiğidir. Veriler değişiyorsa, değişiklikleri takip etmek için bazı çoğaltma yöntemlerini kullanmalısınız veya veritabanları, memcache vb. Gibi "tek bir gerçek" kaynağına sahip olmalısınız. – gaborsch

cevap

4

Statik bir değişken yalnızca bir sınıf yükleyici ile yüklenmiş bir Java Sanal Makinesi tarafından kullanılabilir. Bu değeri birkaç JVM'ye paylaşmanız gerekiyorsa, bir veritabanı, bir önbellek (memcached, redis) veya başka bir harici sistem kullanabilirsiniz.

+0

Kamu Statik Son değiştirici kullanarak sabitleri her zaman açıklarız, küme ortamında, bunu sabit olarak bildirmemiz gerekir, çünkü yalnızca bir JVM bu sabite erişebilir? – user1169587

+1

Sabitlerle ilgili sorun yaşamayacaksınız (her düğümde sabit bir "kopyasına" sahip olacaksınız), ancak "statik" değişkeniniz varsa (son değil), değiştirilip aynı değere sahip olacaksınız. Her sınıftan okunan her şey için (bu, iş parçacığı ile çalışırken her zaman doğru değildir, bu, değeri yerel olarak "kopyalayabilir"), ancak yalnızca bir JVM'den. Dağıtılmış bir uygulamanız varsa (örneğin, uzak EJB), bu JVM'deki "yerel olarak" değerini değiştireceksiniz (her JVM'de (belki farklı ana makinelerde bile) değiştirilmeyecektir. – greuze

0

@javax.enterprise.context.ApplicationScoped ile @Stateful fasulye yapmayı deneyebilirsiniz.

Bunu denemedim, ancak GlassFish 3.1'in desteklemesi gerektiğini düşünüyorum (en azından belgeler bunu inkar etmez).