2010-07-09 38 views
5

Câu hỏi này hơi dài vì nó mang tính khái niệm. Tôi hy vọng nó không phải là một xấu đọc :)Controller (Spring Managed Bean) Phạm vi Câu hỏi: Singleton, Yêu cầu hoặc Phiên?

Tôi đang làm việc trong một hiệu suất quan trọng Spring MVC/Tiles web-app (10.000 người dùng tải điển hình). Chúng tôi tải một màn hình nhân viên cập nhật, nơi chúng tôi tải một màn hình chi tiết nhân viên (ràng buộc với một đối tượng kinh doanh của nhân viên) cho các bản cập nhật thông qua một MultiActionController. Có nhiều tab trên màn hình này, nhưng chỉ tab1 có dữ liệu updatabale. Phần còn lại của các tab là công cụ chỉ đọc, để tham khảo về cơ bản. Không cần phải nói, chúng tôi đã quyết định tải các tab chỉ đọc này theo cách lười biếng, tức là khi mỗi tab được kích hoạt, chúng tôi sẽ thực hiện cuộc gọi ajax (một lần) để tìm nạp dữ liệu từ máy chủ. Chúng tôi không tải mọi thứ thông qua phương thức tải chế độ xem cập nhật. Hãy nhớ rằng: đây là một lần, dữ liệu chỉ đọc.

Hiện tại, tôi đang gặp khó khăn. Tôi đã thực hiện một bộ điều khiển đa tác vụ khác, có tên là "AjaxController" để xử lý các cuộc gọi ajax này. Bây giờ, câu hỏi của tôi:

  1. Phạm vi tốt nhất cho bộ điều khiển này là gì?

Suy nghĩ: Nếu tôi yêu cầu phạm vi thì 10.000 người dùng cùng nhau có thể tạo 10.000 bản sao của bean này: vấn đề bộ nhớ ở đó. Nếu tôi làm cho nó phiên scoped, sau đó một sẽ được tạo ra cho mỗi phiên người dùng. Điều đó có nghĩa, khi 10.000 người dùng đăng nhập vào ứng dụng, bất kể họ có nhấn các phương thức AjaxController hay không, thì mỗi người dùng sẽ có một bean.

  1. Sau đó, là singleton phạm vi tốt nhất cho bộ điều khiển này?

Suy nghĩ: Một hạt đơn sẽ được tạo khi khởi động mùa xuân và ví dụ này sẽ được cung cấp trong suốt. Nghe hay đấy.

  1. Phương thức xử lý (như fetchTab7DataInJsonFormat) có phải là tĩnh và được gắn với lớp không?

Suy nghĩ: Trong trường hợp này, có thể havign phương pháp tĩnh xung đột về mặt ngữ nghĩa với phạm vi? Ví dụ: không phạm vi = "phiên"/"yêu cầu" + phương pháp tĩnh có ý nghĩa? Tôi hỏi bởi vì mặc dù mỗi phiên người dùng có bean AjaxController riêng của nó, nhưng các phương thức xử lý thực sự được gắn vào lớp và không phải là các cá thể. Ngoài ra, không phạm vi = "singleton" + phương pháp xử lý tĩnh có ý nghĩa?

  1. Tôi có thể triển khai mẫu thiết kế đơn lẻ vào AjaxController theo cách thủ công không?

Suy nghĩ: Điều gì sẽ xảy ra nếu tôi kiểm soát việc tạo: thực hiện đơn giản GoF singleton. Sau đó, đặc tả phạm vi có thể làm gì? Phạm vi phiên/yêu cầu chắc chắn không thể tạo ra nhiều trường hợp có thể họ?

  1. Nếu, bởi bất kỳ cơ chế nào (đặc tả đậu/kiểu thiết kế/phương pháp tĩnh), tôi quản lý để có một cá thể của AjaxController: Các phương thức STATIC này có cần được đồng bộ không? Tôi nghĩ là không, bởi vì ngay cả khi các phương thức xử lý STATIC có thể nói chuyện với các dịch vụ (mà nói chuyện với DB/WS/MQ, vv) mất thời gian, tôi nghĩ rằng mỗi chuỗi yêu cầu nhập vào các phương thức tĩnh sẽ được trả về bởi quyền chủ đề của chúng? Nó không giống như user1 nhập vào phương thức tĩnh, và sau đó user2 nhập vào phương thức tĩnh trước khi user1 được trả về, và sau đó cả hai đều nhận được một số dữ liệu bị cắt xén? Điều này có lẽ là ngớ ngẩn, nhưng tôi muốn chắc chắn.

Tôi đang bối rối. Về cơ bản tôi muốn chính xác một cá thể duy nhất của bean điều khiển phục vụ tất cả các yêu cầu cho tất cả các máy khách.

Lưu ý quan trọng: Hạt AjaxController không được INJECTED ở bất kỳ nơi nào khác, nó tồn tại riêng biệt. Đó là phương pháp được nhấn thông qua các cuộc gọi ajax.

Trả lời

3

Nếu tôi đã làm điều này, tôi chắc chắn sẽ làm cho singleton LazyLoadController mà không có phương pháp tĩnh trong nó và không có bất kỳ trạng thái nào trong đó.

Ngoài ra, bạn chắc chắn không nên khởi tạo các trình đơn theo cách thủ công, tốt hơn nên sử dụng cơ chế chung của Spring và cho phép khung điều khiển mọi thứ.

Ý tưởng chung là tránh sử dụng bất kỳ phương pháp tĩnh nào và/hoặc dữ liệu liên tục trong bộ điều khiển. Cơ chế phù hợp sẽ sử dụng một số bean dịch vụ để tạo dữ liệu cho yêu cầu, do đó, bộ điều khiển hoạt động như bộ điều phối tham số yêu cầu để tìm nạp dữ liệu vào khung nhìn. Không cho phép trạng thái có thể thay đổi hoặc đồng thời các nội dung không an toàn trong bộ điều khiển. Nếu một số thành phần cụ thể cho người dùng, hệ thống AOP của Spring cung cấp việc tiêm các thành phần dựa trên phiên/yêu cầu.

Đó là về thực hành tốt khi làm việc như vậy. Có điều cần làm rõ để đưa ra câu trả lời cụ thể hơn cho trường hợp của bạn. Tôi đã hiểu nó đúng rằng trường hợp sử dụng điển hình cho sẽ được rằng AjaxController sẽ vượt qua một số yêu cầu để LazyLoadController để có được dữ liệu tab? Vui lòng cung cấp chi tiết về điều đó trong nhận xét hoặc câu hỏi của bạn, vì vậy tôi có thể cập nhật câu trả lời của mình.

Điều không đúng với việc có các phương pháp tĩnh trong bộ điều khiển là bạn phải tự quản lý an toàn đồng thời không chỉ gây ra lỗi mà còn làm giảm hiệu suất tổng thể. Spring chạy mọi yêu cầu trong thread riêng của nó, vì vậy nếu hai cuộc gọi đồng thời cần sử dụng một số phương thức tĩnh và có các tài nguyên được chia sẻ (vì vậy bạn cần sử dụng câu lệnh đồng bộ hoặc khóa), một trong các luồng sẽ phải chờ một số khác hoàn thành công việc trong khối được bảo vệ. Mặt khác, nếu bạn sử dụng các dịch vụ không trạng thái và tránh có dữ liệu có thể được chia sẻ cho nhiều cuộc gọi, bạn sẽ nhận được hiệu suất tăng lên và không cần phải xử lý truy cập dữ liệu đồng thời.

+0

Sai lầm lớn về phía tôi. LazyLoadController IS AjaxController. Tôi nghĩ đến một cái tên trong khi bắt đầu viết câu hỏi, và sau đó quay trở lại một tên khác trong các câu hỏi. Xin lỗi, tôi đã chỉnh sửa bài đăng. Có, bạn đã có quyền sử dụng. Trong thực tế, tôi có một lớp dịch vụ thực hiện chính xác điều đó và AjaxController này chỉ hoạt động như một bộ điều phối yêu cầu và trình xử lý đáp ứng. Một số nghi ngờ của tôi vẫn liên quan đến các tình huống xung đột. Hiện tại AjaxController của tôi là singleton, và có các phương thức tĩnh để xử lý các yêu cầu và tương tác với lớp dịch vụ. Bất cứ điều gì sai thiết lập này? – SpringConfused

+0

Tôi hiểu. Cập nhật câu trả lời của tôi với giải thích lý do tại sao phương pháp tĩnh là sai. –

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