2010-01-25 27 views
8

Chúng tôi có ứng dụng Java chuẩn bog của bạn đang được phát triển và rất nhiều bản ghi chúng tôi đang tạo (các thực thể Hibernate trong MySQL) có dấu thời gian 'được tạo' và 'sửa đổi' trên chúng.Với một dấu thời gian được tạo ra, tốt hơn là để DB quản lý nó hay ứng dụng?

Bây giờ, tôi và một trong các nhà phát triển không đồng ý - tôi tin rằng cả hai trường đó phải có mặc định MySQL là CURRENT_TIMESTAMP và sau đó ứng dụng có thể thay đổi sửa đổi. Anh ta muốn cả hai được quản lý bởi ứng dụng.

Có lý do thuyết phục nào cho một trong hai quyết định không? Tôi không thể thấy lý do tại sao bạn muốn thêm các bước rõ ràng hơn vào mã, trừ khi vì lý do nào đó mà bạn lo ngại về máy chủ của mình (db, ứng dụng) có dấu thời gian không nhất quán.

Trả lời

7
  • sử dụng dấu thời gian DB nếu bạn có thể hy sinh tính di động. Ngoài ra, nếu rất khác biệt nhỏ sẽ quan trọng đối với ứng dụng và bạn sẽ có nhiều hơn một máy chủ ứng dụng/cụm, bạn có thể gặp sự cố khi đồng bộ hóa các nút.
  • sử dụng ứng dụng để tạo dấu thời gian trong trường hợp không chắc chắn DB đã chọn sẽ ở lại hoặc nếu bạn đang sử dụng nhiều cơ sở dữ liệu - ví dụ MySQL để sản xuất, HSQLDB cho các bài kiểm tra đơn vị.

Nếu không có những lập luận này được áp dụng, sử dụng một trong đó là dễ dàng hơn cho bạn (hoặc một trong đó nhiều nhà phát triển bỏ phiếu cho)

Nếu bạn đi cho việc xử lý ứng dụng, hoặc đi cho đề nghị Pascal Thivent với @PreUpdate , hoặc đã lĩnh vực của bạn thiết lập với giá trị mặc định, như:

private Calendar date = Calendar.getInstance(); 
+0

+1 nhưng bạn có thể giải thích về cách điều này quan trọng không. –

+0

Tôi vẫn không nhận được nội dung cụm. Có hoặc không có bộ nhớ cache cấp 2, tại sao bạn sẽ thấy những thứ khác nhau trên các nút khác nhau. Nếu bạn có một cái gì đó cụ thể, xin vui lòng làm rõ bởi vì điều này chỉ có vẻ không đúng với tôi: clustering ứng dụng của bạn không buộc bạn phải sử dụng dấu thời gian db trong bất kỳ cách nào. –

+0

tốt, bạn có thể đặt nó chính xác ở mọi nơi, nhưng nó là phí trên + tùy chọn DST và múi giờ + cần phải đặt lại trên mỗi nút mới. Thành thật mà nói, tôi đã chỉ có một kinh nghiệm rất cụ thể với kịch bản này mà không áp dụng cho trường hợp thông thường, và chúng tôi đang sử dụng một máy chủ dấu thời gian. – Bozho

3

Có ý nghĩa khi phân bổ tất cả dấu thời gian trong cùng một cấp cho tính nhất quán.

Điều này answer cho một câu hỏi có liên quan đưa ra một ví dụ hay về cách thực hiện trong Hibernate.

3

tôi sẽ xử lý này từ mã và sử dụng Hibernate/JPA của @PrePersist@PreUpdate callbacks:

012.
@PreUpdate 
@PrePersist 
public void setTimeStamps() { 
    modified = new Date(); 
    if (created==null) { 
     created = new Date(); 
    } 
} 

Lý do chính: tính di động (tức là điều này sẽ làm việc với một cơ sở dữ liệu khác, ví dụ trong một ngữ cảnh thử nghiệm, mà không có bất kỳ ma thuật cơ sở dữ liệu nào, không có DEFAULT, không có trình kích hoạt, không có gì).

0

Tôi sẽ sử dụng trình kích hoạt và quy trình lưu trữ để duy trì các trường này. Vì vậy, đặt logic trong DB.

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