2017-12-18 85 views
5

Tôi có dịch vụ Grails nói chuyện với SQL Server, xử lý hàng loạt (cập nhật bản ghi từ cơ sở dữ liệu hoặc tạo bản ghi mới) của hơn 80.000 bản ghi. Trong khi quá trình này đang diễn ra, những hồ sơ đó đang bị khóa bởi quá trình này. Nếu một số người khác đang cố gắng cập nhật một bản ghi riêng lẻ, đó là thời gian chờ, chờ bản ghi đó. Làm thế nào để truy vấn và cập nhật các bản ghi trong quá trình xử lý hàng loạt? theo cách đó, nó không bị chặn ?.Xử lý số lượng lớn Grails có khóa trên bàn

Tôi đã thử sử dụng tuôn ra: đúng, nhưng không hiệu quả.

Trả lời

4

flush=true ghi dữ liệu từ phiên ngủ đông cục bộ của bạn vào cơ sở dữ liệu, điều quan trọng là tránh các vấn đề về bộ nhớ trên máy chủ ứng dụng của bạn cho các hoạt động hàng loạt lớn như của bạn, nhưng nó không ảnh hưởng đến cơ sở dữ liệu khóa hàng.

Những gì bạn cần thay đổi là ranh giới giao dịch của bạn. Tất cả các hàng của bạn đều bị khóa vì chúng nằm trong cùng một giao dịch và có thể không được mong muốn (hoặc hiệu quả cho cơ sở dữ liệu). Trừ khi có một lý do tất cả những hàng đó cần phải bị khóa, bạn có thể làm cho dịch vụ của bạn không trạng thái. Sau đó, mỗi hàng sẽ được cập nhật trong giao dịch của chính nó và chỉ bị khóa một thời gian ngắn. Tuy nhiên, điều này có thể chậm hơn rất nhiều.

Đối với nền tảng trung bình, tôi đề xuất phương pháp kết hợp, nơi bạn đặt dịch vụ là static transactional=false nhưng sau đó sử dụng đóng cửa .withTransaction {...} và lặp lại để thực hiện một số hàng nhất định tại một thời điểm.

Đây là một bài viết cũ nhưng có thông tin hữu ích bạn nên đọc để đưa ra các ví dụ mã về những gì tôi đã đề cập. http://sacharya.com/transactions-in-grails/

+0

Tôi gặp vấn đề tương tự với GORM MongoDB. Có vẻ như bean sessionFactory không tồn tại cho GORM MongoDB. Bạn có biết làm cách nào khác để xóa sạch và xóa phiên làm việc cho GORM MongoDB không? – unekwu

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