2010-08-04 22 views
18

Tôi khá mới phát triển web. Vì vậy, tôi xin lỗi nếu đây là một câu hỏi rất cơ bản. Ví dụ, tôi tạo một ứng dụng web và triển khai nó lên tomcat. Bây giờ khi nhiều người dùng nhấn ứng dụng web, tomcat có tạo một chuỗi mới cho mỗi người dùng không? Nếu đó là trường hợp sau đó tôi vẫn có thể tạo ra các chủ đề trong chính ứng dụng của tôi và mong đợi nó ở lại địa phương cho mỗi người dùng thread được tạo ra bởi tomcat? Dữ liệu cấp phiên có được đồng bộ hóa giữa các luồng không?Tomcat có tạo chuỗi cho mỗi người dùng không?

Tôi hy vọng câu hỏi của tôi có ý nghĩa.

+2

Bạn có thể tìm thấy [câu trả lời này] (http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909) cũng hữu ích. – BalusC

Trả lời

35

Mỗi yêu cầu được xử lý theo một chủ đề khác. Đây không phải là "luồng cho mỗi người dùng". Yêu cầu là bất kỳ sự tương tác nào từ máy khách (trình duyệt web) và máy chủ. Vì vậy, gõ một Url trong trình duyệt của bạn, gọi một yêu cầu ajax, mỗi một được xử lý trong một chủ đề riêng biệt.

Trạng thái người dùng mua lại trong khi 'đăng nhập' (không phải đăng nhập mỗi lần; một cách tốt hơn để nói đó là "một tập hợp các yêu cầu liên quan của một người dùng") được lưu trữ thuận tiện trong phiên. Bạn có thể sử dụng phiên để lưu trữ bất kỳ dữ liệu nào có thể áp dụng cho người dùng, mặc dù bạn nên cẩn thận không lưu trữ quá nhiều dữ liệu bởi vì nó ăn hết bộ nhớ. Quản lý phiên yêu cầu một mức độ kỹ năng.

Có bạn phải rất cẩn thận nếu bạn kích hoạt chủ đề mới; bạn có thể phá vỡ mọi thứ, và thường là một ý tưởng tồi. Nếu bạn phải làm một cái gì đó mà sẽ mất một thời gian dài, sử dụng JMS để xử lý bất cứ điều gì nó là không đồng bộ. Cũng nên nhớ rằng không phải tất cả các tác vụ ảnh hưởng đến dữ liệu ứng dụng web phải được gọi từ webapp. Một nhiệm vụ quét dữ liệu hàng ngày có thể được chạy như một nhiệm vụ riêng biệt trong hoặc ngoài tomcat - tức là bạn có thể viết một công việc bằng cách sử dụng một cái gì đó như lịch trình thạch anh, hoặc thậm chí viết một chương trình riêng biệt và thiết lập nó để chạy trong một cron (cẩn thận của công việc thay đổi dữ liệu từ dưới webapp bạn, mặc dù).

Nếu bạn đang sử dụng các công nghệ giống như Spring và Hibernate, chúng thường ràng buộc các đối tượng (hoặc có thể được cấu hình bởi nhà phát triển ứng dụng) mà lập trình viên cần cho mỗi luồng (sử dụng ThreadLocal của java).

Đây cũng là một trong những lý do bắt đầu chủ đề của riêng bạn là nguy hiểm. Nếu bạn bắt đầu chuỗi của riêng mình, bạn có thể mất tài nguyên bị ràng buộc với chuỗi ban đầu khi yêu cầu kết thúc và điều này có nghĩa là nếu bạn cố gắng truy cập các tài nguyên đó trong chuỗi công việc của bạn, chúng sẽ không sẵn có. Đây là loại lỗi có thể là một nỗi đau trong ass để tìm/sửa chữa.

chỉnh sửa - như Stephen C đã chỉ ra trong nhận xét cho một câu trả lời khác, điều quan trọng cần lưu ý là Tomcat (và các vùng chứa khác) duy trì một nhóm các chủ đề để sử dụng. Điều này có nghĩa là một luồng mới không nhất thiết được tạo ra cho mọi yêu cầu. Điều này có nghĩa là mỗi yêu cầu chạy trong một chuỗi riêng biệt, có thể hoặc không được tạo hoặc sử dụng lại.

+1

Cảm ơn câu trả lời chi tiết. Làm cách nào để một người nào đó thực hiện các tác vụ đồng thời trong một ứng dụng web? Nó thường tránh ngay cả khi bạn có thể nhận được hiệu suất của nó? – user377067

+2

Bạn đồng nghĩa với điều gì? Nếu yêu cầu bắt đầu một tác vụ sẽ mất nhiều thời gian, bạn cần xử lý không đồng bộ. Sử dụng JMS là câu trả lời ở đây. Ý tưởng là bạn gửi một tin nhắn đến hàng đợi hoặc chủ đề (và yêu cầu khởi tạo kết thúc), và một bean (bean điều khiển thông điệp) được cấu hình để xem hàng đợi hoặc chủ đề và tiêu thụ các thông điệp trên đó, và làm một số thứ tốn thời gian dựa trên thông điệp. Bạn sẽ cần phải google nó để tìm hiểu làm thế nào để thực hiện nó, nhưng nó không khó. – hvgotcodes

+0

Tôi đánh giá cao nó. – user377067

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