2009-12-11 33 views
28

Trợ giúp! Tôi đang chuyển một ứng dụng ruby ​​lớn sang Grails - nhưng khởi động Grails của ứng dụng của tôi mất hơn 2 phút.Khởi động Grails chậm

Tôi đã đặt dbCreate thành "read" Tôi đã đảm bảo hộp cửa sổ máy tính để bàn xử lý kép cao cấp cho Grails cần RAM (1 Gig). Tôi chưa cài đặt plugin nào. Tôi có 170 lớp miền đã từng là lớp ruby.

Khi khởi động nó in ra dòng "Chạy ứng dụng Grails .." và sau đó treo trong một thời gian dài trước khi nó in ra dòng "Máy chủ đang chạy".

Tôi vừa làm điều gì đó mà tôi đã di chuyển tất cả các id của mình thành bigints. Điều đó dường như đã làm trầm trọng thêm vấn đề. Bây giờ phải mất khoảng 10 phút để khởi động.

Tôi mới đến grails bạn vui lòng cho tôi thêm một vài chi tiết về những gì và nơi để đăng nhập các sự kiện khi khởi động? Như để lược tả vm, nó đã được một vài năm kể từ khi tôi đã làm rất nhiều Java. Bạn khuyên bạn nên sử dụng công cụ định dạng tốt nhất nào để sử dụng ngay bây giờ?

Tôi có thể làm gì khác để tăng tốc độ khởi động Grails?

Trả lời

10

Thật không may, tôi không chắc chắn quá nhiều có thể được thực hiện ngoài những gì bạn đã làm. Như bạn đã biết, có rất nhiều thứ xảy ra khi nó khởi động, với tất cả các độ phân giải/tải của plugin, thêm các phương thức động vào các đối tượng miền của bạn và bản chất động tổng thể của Groovy.

Tôi không chắc chắn bạn đang sử dụng phiên bản nào, nhưng tôi đã yêu cầu tắt tính năng kiểm tra phụ thuộc khi bạn khởi động ở phiên bản 1.2, vì điều đó cũng tăng thêm thời gian khởi động.

Tôi nhận thấy ở trên không phải là quá hữu ích, vì vậy có lẽ điều này sẽ là: Tôi chia ứng dụng của mình thành nhiều plugin. Một cho các đối tượng miền, một cho khả năng vẽ đồ thị, một cho nhập khẩu excel, một cho một số cấu trúc giao diện người dùng mà tôi cần. Tôi đã không làm điều đó chỉ vì thời gian khởi động chậm, nhưng lợi thế là tôi có thể kiểm tra các phần của hệ thống tách biệt với nhau trước khi tích hợp mọi thứ lại với nhau.

Tôi sắp thêm một phần chức năng mới liên quan đến ít nhất 10 đối tượng tên miền mới, và lần đầu tiên tôi phát triển chúng trong một plugin riêng biệt bằng cách có sơ đồ cho vài đối tượng mà chúng phải tương tác với ứng dụng chính. Điều đó cho phép tôi làm giảm thời gian khởi động và cũng có mã của tôi bị cô lập tốt hơn.

Vì vậy, nếu đó là một lựa chọn cho bạn, hãy cố gắng tách riêng mọi thứ để bạn có thể làm việc riêng biệt, điều này sẽ làm giảm bớt vấn đề của bạn. Cũng có thể có các lợi ích khác về việc giúp nhóm của bạn làm việc riêng biệt trên các thành phần nhỏ hơn, mô đun hóa tốt hơn, v.v.

Hy vọng điều này hữu ích.

1

Bạn có thể muốn xem liệu có các nút bấm khác mà bạn có thể chuyển đổi không phải là Grails để sửa lỗi này không.

Bạn đã thử tiếp cận vấn đề này dưới dạng vấn đề về hiệu suất chưa? Bạn có thể xem hiệu suất của hộp và cố gắng tìm hiểu xem nút cổ chai là gì. Có phải CPU không? Nó là một vấn đề đọc đĩa? Bạn có thể đính kèm một profiler cho VM và tìm hiểu những gì đang sử dụng hết thời gian khởi động của bạn?

3

170 lớp miền là khá lớn, nhưng 2 phút vẫn có vẻ thực sự dài đối với tôi. Bạn có một tấn plugin được cài đặt? Các cài đặt gỡ lỗi có khả năng quá dài?

Tôi sẽ tò mò mất bao lâu nếu bạn tạo một ứng dụng grails mới, được sao chép trong tất cả các đối tượng miền của bạn (và tập con của các plugin mà đối tượng miền có thể cần thực sự hoạt động) và xem mất bao lâu để bắt đầu.

Đề xuất của Jean về cách phân biệt mọi thứ nếu có thể là tốt nhất. Tôi đã làm một cái gì đó tương tự như trên các dự án trước đây, nơi chúng tôi có một plugin miền và các ứng dụng khác của chúng tôi đều dựa vào plugin miền đó.

Bạn cũng có thể sử dụng grails events để đăng nhập một số thông tin thời gian để bắt đầu xem điểm nghẽn của bạn ở đâu. Thời gian sự kiện "PluginInstalled" nên được tốt như tôi nghĩ rằng các plugin hibernate sẽ bị bắt bởi điều này ngoài các plugin khác.

2

Bạn có thể gặp sự cố phụ thuộc. Nếu một plugin mà bạn sử dụng dựa vào thư viện trong maven có phụ thuộc 'mở đã kết thúc', các grails sẽ đi và tìm mỗi lần nếu có các phiên bản mới hơn để tải xuống trong phạm vi. Tôi không có ý tưởng tại sao bất cứ ai sẽ chỉ định nó như thế này. Có vẻ như nó sẽ dẫn đến hành vi không đáng tin cậy. Đối với tôi, thủ phạm là thư viện java aws của Amazon, được sử dụng tự nhiên bởi một plugin nói chuyện với đám mây của Amazon.

http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.2.10

lưu ý cách mà một số phụ thuộc của nó là như thế này

org.apache.httpcomponents httpclient [4.1, 5.0)

dường như mọi thời gian, grails đang tìm kiếm một phiên bản mới hơn (và tải về nếu nó tồn tại, tôi chỉ nhận thấy 4,2-alpha1 của httpclient đi xuống khi tôi chạy thời gian này).

Bằng cách loại bỏ sự phụ thuộc mà từ các plugin và tự thêm các thư viện cần thiết vào thư mục lib của tôi, tôi giảm thời gian khởi động của tôi từ> 30 giây để < 1 giây

0

Các bạn đã thử điều cơ bản như thế này cho việc triển khai hơn nữa để một servlet container của bạn lựa chọn hoặc tại chỗ .war bootstrapping?

grails -Ddisable.auto.recompile=true run-app 

grails run-war 

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