2010-10-13 27 views
8

Tôi gặp lỗi này đôi khi trên một thành phần phạm vi phiên, vẫn chưa tìm ra nguyên nhân gây ra lỗi này. Bất kỳ ý tưởng?không thể lấy khóa trên một thành phần

ERROR [Exceptions] handled and logged exception 
javax.el.ELException: org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: importUser 

Trả lời

16

Thành phần phạm vi phiên được đồng bộ hóa theo mặc định. Điều đó có nghĩa, Seam chỉ quan tâm đến một yêu cầu tại một thời điểm có thể truy cập vào một thành phần như vậy. Tất cả các yêu cầu khác phải đợi cho đến khi yêu cầu đầu tiên kết thúc. Để ngăn chặn nạn đói, các yêu cầu chờ đợi có thời gian chờ (xem org.jboss.seam.core.SynchronizationInterceptor để thực hiện tương ứng). Khi yêu cầu chờ không nhận được quyền truy cập vào thành phần cho đến khi hết thời gian chờ, SynchronizationInterceptor sẽ ném một số org.jboss.seam.core.LockTimeoutException.

Giả sử các yêu cầu, A và B, cần thành phần importUser và A của bạn trước tiên. Nếu A mất một thời gian dài để hoàn thành, B sẽ kết thúc trong LockTimeoutException. Để tìm nguyên nhân gây ra sự cố của bạn, hãy tìm hiểu cách yêu cầu importUser có thể mất nhiều thời gian hơn thời gian chờ đã xác định.

+1

Câu trả lời hay (+1) –

+0

@Arthur Cảm ơn bạn! – kraftan

+0

Điều này không xảy ra vì có một lệnh chạy dài, nhưng có vẻ bề mặt khi có một ngoại lệ được ném ra khỏi phương pháp này và bạn đang cố gắng truy cập lại cùng một chức năng. – Joe

4

Tôi đã có một trang nơi điều này xảy ra thường xuyên dưới tải nặng. Tôi đã có thể giảm tần suất xảy ra bằng cách đặt chú thích này vào lớp đối tượng Seam vi phạm:

@Synchronized(timeout=5000) 

Điều đó làm tăng thời gian chờ lên năm giây thay vì đường may mặc định thứ hai. Nó chỉ là một ban nhạc hỗ trợ, nhưng tôi đã không lên để viết lại khổng lồ đó.

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