2010-04-01 45 views
23

Chỉ muốn ý kiến ​​chuyên gia của bạn về quản lý giao dịch khai báo cho Spring. Đây là thiết lập của tôi:Mùa xuân - Giao dịch chỉ đọc

  1. lớp DAO là đồng bằng cũ JDBC sử dụng Spring JdbcTemplate (Không Hibernate vv)
  2. lớp Service là POJO với các giao dịch khai báo như sau - save*, readonly = false, rollback for Throwable

Mọi thứ hoạt động tốt với trên thiết lập. Tuy nhiên, khi tôi nói get*, readonly = true, tôi thấy lỗi trong tệp nhật ký của mình là Database connection cannot be marked as readonly. Điều này xảy ra cho tất cả các phương thức * nhận được trong lớp dịch vụ.

Bây giờ câu hỏi của tôi là:

A. Tôi có phải thiết lập get* như readonly? Tất cả các phương thức get* của tôi đều là các hoạt động DB thuần túy đọc. Tôi không muốn chạy chúng trong bất kỳ ngữ cảnh giao dịch nào. Làm thế nào nghiêm trọng là lỗi ở trên?

B. Khi tôi xóa cấu hình get*, tôi không thấy lỗi. Hơn nữa, tất cả các hoạt động get* đơn giản của tôi được thực hiện mà không cần giao dịch. Đây có phải là con đường để đi?

C. Tại sao mọi người lại muốn có phương thức giao dịch trong đó readonly = true? Có ý nghĩa thiết thực nào của cấu hình này không?

Cảm ơn bạn! Như mọi khi, câu trả lời của bạn được đánh giá cao!

Trả lời

23

This post cho biết hành vi hoặc cờ readOnly là phụ thuộc vào cơ chế bền bỉ.

C. Vâng, khi sử dụng chế độ ngủ đông, nó mang lại lợi ích hiệu suất bằng cách thiết lập chế độ tuôn ra để FLUSH_NEVER (như mô tả trong bài được liên kết)

B. Vâng, cuộc gọi JDBC không yêu cầu một giao dịch (hibernate yêu cầu một), do đó, việc xóa cấu hình @Transactional sẽ trims tất cả quản lý giao dịch.

A. tôi muốn giả mùa xuân đang kêu gọi connection.setReadOnly(true) nhưng trình điều khiển JDBC của bạn không hỗ trợ này

Các mấu chốt là: không sử dụng readonly giao dịch với JDBC đồng bằng.

Và một điều khác - các giao dịch được cho là trải rộng nhiều truy vấn. Không làm cho giao dịch của bạn quá chi tiết. Làm cho chúng a unit of work.

+0

Cảm ơn bạn Bozho! Xóa trong ngày. Tôi đoán tôi sẽ loại bỏ cấu hình get * khi tôi đang sử dụng JDBC đơn giản. – AAK

+1

Nếu không có giao dịch chỉ đọc, bạn cũng tự mở cho mình 'org.hibernate.LazyInitializationException' đáng sợ. – HDave

+0

Bằng cách nào tôi có thể tránh org.hibernate.LazyInitializationException trong khi kiện quản lý authntication waffle. –

5

A. Tôi có phải nói * là chỉ đọc không? Tất cả các phương thức * nhận của tôi là các hoạt động DB đọc thuần túy. Tôi không muốn chạy chúng trong bất kỳ ngữ cảnh giao dịch nào. Làm thế nào nghiêm trọng là lỗi ở trên?

Thực ra, bạn có thể vẫn muốn chạy tất cả get() trong ngữ cảnh giao dịch, để đảm bảo rằng bạn đang nhận được số lần đọc nhất quán. Mặt khác, nếu bạn không quan tâm đến điều này, bạn có thể thiết lập mức giao dịch cho phù hợp.

C. Tại sao mọi người lại muốn có phương thức giao dịch khi readonly = true? Có ý nghĩa thiết thực nào của cấu hình này không?

  1. Để giúp bảo vệ chống lại viết không đúng tiêu chuẩn trong vòng get() `phương pháp
  2. Đối với mục đích tối ưu hóa. Không chỉ Hibernate có thể sử dụng thông tin này, như Bozho đã đề cập, nhưng một số trình điều khiển cơ sở dữ liệu/JDBC cũng có thể sử dụng thông tin này.
+0

Cảm ơn bạn Matt! Tôi đoán tôi nhận được * phương pháp được khá nhiều đơn giản đơn giản SQL chọn truy vấn và tôi không sử dụng Hibernate, vì vậy tôi sẽ tắt các thiết lập. – AAK

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