2011-08-24 26 views
6

Tôi đang sử dụng Play để viết một ứng dụng web được triển khai trong Tomcat. Bởi vì các ứng dụng sẽ không được xử lý dữ liệu rất nhiều Tôi đang sử dụng cơ sở dữ liệu H2 mặc định với Hibernate. Khi tôi muốn triển khai một phiên bản mới của ứng dụng, tôi tắt tomcat, xóa webapp cũ và WAR, thêm WAR mới của tôi và bắt đầu sao lưu.Phát! không tắt H2 đúng cách

Điều này đã hoạt động cho đến vài ngày trước, khi tôi thêm thành phần cơ sở dữ liệu. Bây giờ, tôi thường không thể triển khai lại ứng dụng. Khi tôi xóa thư mục cũ, thư mục được tự động tạo lại với cấu trúc này:

$ ls -laR myapp/ 
myapp/: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 13 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 WEB-INF 

myapp/WEB-INF: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 application 

myapp/WEB-INF/application: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 db 

myapp/WEB-INF/application/db: 
total 24 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
drwxr-xr-x 2 root root 4096 Aug 24 17:20 h2 

myapp/WEB-INF/application/db/h2: 
total 24 
drwxr-xr-x 2 root root 4096 Aug 24 17:20 . 
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .. 
-rw-r--r-- 1 root root 100 Aug 24 17:20 play.lock.db 

Điều tương tự cũng xảy ra khi WAR giải nén.

Gần đây tôi đã nhận thấy một thông báo trong nhật ký catalina.out phàn nàn về ứng dụng của tôi không tắt quá trình được gọi là "Công cụ theo dõi khóa tệp H2". Dựa trên một tìm kiếm ngắn gọn về tài liệu H2, tôi nghĩ rằng quá trình đó là những gì gây trở ngại cho ứng dụng của tôi.

EDIT

Đây là dòng than phiền trong file log:

SEVERE: The web application [/myapp] appears to have started a thread named [H2 File Lock Watchdog /var/lib/apache-tomcat-6.0.32/webapps/myapp/WEB-INF/application/db/h2/play.lock.db] but has failed to stop it. This is very likely to create a memory leak.

Vì vậy, làm thế nào để tôi giết quá trình này? Tôi không thể khởi động lại máy vì nó không phải của tôi và tôi không thể tìm thấy cơ quan giám sát với top hoặc ps. Tôi muốn một cách để Play tắt nó một cách tự động, nhưng tôi không ở trên xây dựng nó thành kịch bản triển khai của tôi.

Cảm ơn một triệu nếu bạn đã đọc sách này đến nay!

+0

Một điểm đáng lưu ý khác là quá trình cơ sở dữ liệu rõ ràng đã chết cuối cùng. Tôi không chắc là phải mất bao lâu, nhưng nó trên quy mô giờ.Chờ đợi nó ra chỉ là một giải pháp, nhưng tốt hơn là không có gì? – andronikus

Trả lời

8

Tôi tắt tomcat

Bạn có chắc bạn đã tắt tomcat hoàn toàn? Bởi vì cơ sở dữ liệu H2 đang chạy. Nếu bạn tắt quá trình tomcat, cơ sở dữ liệu cũng bị dừng lại (vì H2 đang chạy trong quá trình tomcat). Ngoại trừ nếu bạn chạy cơ sở dữ liệu trong một quy trình khác.

Hay bạn vừa tắt ứng dụng web trong phạm vi tomcat? Nếu đúng như vậy, thì ít nhất một kết nối cơ sở dữ liệu không bị đóng, để cơ sở dữ liệu tiếp tục chạy (và tạo tệp .lock.db này).

Bây giờ, tôi không biết khung chơi, và không thể nói làm thế nào để đảm bảo tất cả các kết nối cơ sở dữ liệu được đóng lại.

Một cách để buộc cơ sở dữ liệu đóng là chạy câu lệnh SQL SHUTDOWN.

tôi không thể tìm thấy cơ quan giám sát với đầu hoặc ps

topps chỉ hiển thị quá trình. Cơ quan giám sát H2 là một chủ đề trong một quy trình java. Để xem chuỗi, hãy sử dụng:

jps -l (to get the list of Java processes) 
jstack -l <pid> (to get a full thread dump) 
+0

Tôi tắt máy chủ bằng 'sh bin/shutdown.sh' như bình thường. Tôi có nên làm gì khác không? Vở kịch! khuôn khổ có xu hướng xử lý những thứ như thế này tự động, vì vậy tôi không biết làm thế nào để vượt qua một tuyên bố 'SHUTDOWN'. Tôi sẽ cố gắng giết chết quá trình java bằng tay vào thứ hai, và hy vọng không bước vào ngón chân của bất kỳ ai. – andronikus

+0

Thật không may 'jps -l' chỉ cho tôi thấy chính JPS! – andronikus

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