2011-02-03 62 views
8

Tôi đang sử dụng System.currentTimeMillis() (trả về số long số nguyên) trong Java để tạo ID duy nhất cho các thực thể cơ sở dữ liệu vì tôi cho rằng không thể trùng lặp tại bất kỳ thời điểm nào.An toàn để sử dụng System.currentTimeMillis() để tạo một ID cơ sở dữ liệu duy nhất?

Đây có phải là giả định an toàn không?

Ví dụ, tại thời điểm này tôi có được điều này:

1296691225227 

Trả lời

8

Đó là khá khó xảy ra bạn sẽ nhận được một cuộc đụng độ, vâng (trừ khi bạn đang ở trong một hệ thống tải cao, trong trường hợp này đó là rất khả năng), nhưng vẫn có thể.

Java hiện có cơ chế tạo số nhận dạng duy nhất - java.util.UUID. Nó có các phương thức để tạo các ID ngẫu nhiên.

Tôi đặc biệt khuyên bạn nên sử dụng thay vào đó.

+0

Về xác suất thất bại, tôi nghi ngờ cách tiếp cận hàng nghìn giây sẽ tồn tại trong thử nghiệm đơn vị. – Dolph

+0

@Dolph - hoặc kiểm tra tải hệ thống. Chắc chắn nó không nên ... nếu bạn đang làm chúng đúng cách. –

+1

Tôi thích UUID rất nhiều tuy nhiên nó là khá kém hiệu quả (hiểu rằng cách cứng ...) cách thông thường để lưu trữ là UUID.toString() đó là khủng khiếp 36bytes dài (thường được ánh xạ tới một cái gì đó như varchar (36)). Chỉ số DB nên được lưu trong bộ nhớ - chỉ mục càng lớn, càng cần nhiều bộ nhớ hơn, việc lập chỉ mục sẽ chậm hơn, v.v. Tôi khuyên bạn nên sử dụng một số bit phân vùng cao/phân cụm và id 'long'. – bestsss

16

Không, điều này không an toàn. Một mili giây là một thời gian dài trong chu trình CPU (chúng chạy với hàng tỷ chu kỳ mỗi giây, không phải hàng nghìn), vì vậy nếu nhiều yêu cầu đến vào một thời điểm hoặc nếu có nhiều chủ đề thử tạo mục cơ sở dữ liệu, chúng sẽ thấy cùng thời gian CPU và sẽ kết thúc bằng các phím va chạm. Bạn cũng sẽ gặp sự cố nếu đồng hồ hệ thống bằng cách nào đó đã được đặt lại hoặc thay đổi thành thời gian trước đó.

+5

Cũng đáng chú ý rằng trong khi độ chi tiết * tối thiểu * của bộ đếm thời gian mili giây là về mặt lý thuyết 1ms, độ chi tiết thực tế có thể nhiều hơn. Tôi đã sử dụng các hệ thống mà nó là 20ms. –

+1

không đề cập đến một cái gì đó như ntp di chuyển đồng hồ của bạn ngược. – jtahlborn

+0

mức độ chi tiết tối thiểu là gì? Làm thế nào tôi có thể kiểm tra giá trị của hệ thống của tôi? – piechuckerr

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