2013-01-31 37 views
5

Designing J2EE Applications for Real-Life Clustered EnvironmentsJava biến tĩnh trong môi trường cụm

bài viết này cho biết không thể sử dụng java biến tĩnh trong môi trường cluster, nhưng nếu chúng ta muốn sử dụng biến tĩnh như tính năng (chỉ có một bản sao của giá trị được chia sẻ bởi tất cả các đối tượng trong một nhóm ứng dụng) chúng ta nên sử dụng cái gì?

+0

Lưu ý rằng bài viết này được viết vào năm 2004, trong khi một số nội dung vẫn đúng, tôi sẽ không sử dụng nó làm tài liệu tham khảo. –

+0

bạn có thể muốn xem xét lớp bên trong bất biến là "chỉ một bản sao giá trị được chia sẻ bởi tất cả các đối tượng" Nếu trạng thái chia sẻ là một số kiểu dữ liệu cơ bản, biến mẫu cuối cùng phải phù hợp với yêu cầu của bạn. – spiritwalker

+1

Nếu dữ liệu của bạn không thay đổi trong suốt quá trình hoạt động (ví dụ: bạn đã tải một số tệp thuộc tính), bạn có thể sử dụng 'tĩnh'. Hạn chế duy nhất là bạn phải khởi tạo hai lần (một lần cho mỗi JVM). Nếu dữ liệu thay đổi, bạn phải sử dụng một số phương pháp sao chép để theo dõi các thay đổi hoặc có một "nguồn chân lý" như cơ sở dữ liệu, memcache, v.v. – gaborsch

Trả lời

4

Biến tĩnh chỉ có thể được chấp nhận bởi một máy ảo Java, được nạp với một trình nạp lớp. Nếu bạn cần chia sẻ giá trị này cho một số JVM, bạn có thể sử dụng cơ sở dữ liệu, bộ nhớ đệm (memcached, redis) hoặc bất kỳ hệ thống bên ngoài nào khác.

+0

chúng tôi luôn khai báo hằng số bằng cách sử dụng công cụ sửa đổi cuối cùng của Public Static, trong môi trường cụm, chúng ta không nên sử dụng điều này để khai báo hằng số vì chỉ có một JVM có thể truy cập hằng số này? – user1169587

+1

Bạn sẽ không gặp vấn đề với hằng số (bạn sẽ có một "bản sao" của hằng số trong mỗi nút), nhưng khi bạn có biến "tĩnh" (không phải cuối cùng), nó có thể được sửa đổi và sẽ có cùng giá trị cho mọi đọc từ mọi lớp (điều này không phải lúc nào cũng đúng khi làm việc với các luồng, có thể "sao chép" giá trị cục bộ), nhưng chỉ từ một JVM. Nếu bạn có một ứng dụng phân tán (ví dụ EJB từ xa), bạn sẽ sửa đổi giá trị "cục bộ" trong JVM đó (sẽ không được sửa đổi trong mọi JVM (thậm chí có thể trong các máy chủ khác nhau). – greuze

0

Bạn có thể thử làm cho nó @Stateful đậu với @javax.enterprise.context.ApplicationScoped.

Tôi chưa thử điều này, nhưng có vẻ như với tôi rằng GlassFish 3.1 nên hỗ trợ nó (ít nhất là tài liệu không từ chối nó).

Các vấn đề liên quan