2010-04-07 12 views
10

Tôi đang thiết kế một ứng dụng web dựa trên Java và tôi cần một kho khóa-giá trị. Berkeley DB dường như đủ phù hợp với tôi, nhưng dường như có hai Berkeley DBs để lựa chọn: Berkeley DB Core được triển khai trong C, và Berkeley DB Java Edition được thực hiện trong Java thuần túy.Lựa chọn giữa Berkeley DB Core và Berkeley DB JE

Câu hỏi đặt ra là, cách chọn loại nào sẽ sử dụng? Với khả năng mở rộng và hiệu suất của ứng dụng web khá quan trọng (ai biết được, có thể ý tưởng của tôi sẽ trở thành Youtube tiếp theo) và tôi không thể dễ dàng tìm thấy bất kỳ điểm chuẩn có ý nghĩa nào giữa hai người. Tôi vẫn chưa quen với Java API lõi, nhưng tôi thấy khó tin rằng nó có thể tồi tệ hơn nhiều so với Java Editions, điều này có vẻ khá tốt.

Nếu một số cửa hàng khóa-giá trị khác tốt hơn nhiều, vui lòng đề xuất điều đó. Tôi đang lưu trữ các đốm màu nhị phân nhỏ, và các khóa có thể sẽ là băm của dữ liệu, hoặc một số id duy nhất khác.

Trả lời

2

Nếu bạn lấy được một giao diện chung cho chúng, và có một bộ kiểm tra đơn vị phù hợp, bạn có thể trao đổi giữa hai điểm sau này (có thể khi bạn thực sự cần đưa ra quyết định dựa trên sự thật khó khăn) hiện không có sẵn)

+2

Chỉ cần cảnh báo về điều này: Bản thân cơ sở dữ liệu sẽ * không * di động giữa các phiên bản. Nếu bạn đi xuống lộ trình này, bạn sẽ cần một chiến lược di chuyển cho chính dữ liệu nếu bạn thấy mình muốn hoán đổi các triển khai. Vì lý do này, nếu tính di động trong dữ liệu là quan trọng, bạn nên sử dụng Berkeley DB và API Java trên phiên bản Java. – Shaun

2

Tôi đã gặp phải vấn đề tương tự và quyết định sử dụng phiên bản Java, chủ yếu là do tính di động của nó (tôi cần thứ gì đó sẽ chạy ngay cả trên thiết bị di động). Ngoài ra còn có API Direct Persistence Layer (DPL) và thực tế là toàn bộ db là một jar duy nhất làm cho việc triển khai của nó khá đơn giản.

Phiên bản gần đây 4 mang lại tính khả dụng và cải thiện hiệu suất cao. Ngoài ra còn có một thực tế là các ứng dụng java chạy dài có thể đạt được một tối ưu hóa như vậy, rằng chúng sẽ vượt qua hiệu năng ứng dụng C bản địa trong một số kịch bản.

Đó là sự phù hợp tự nhiên đối với mọi ứng dụng Java - máy tính để bàn hoặc web.

2

Tôi đã có cùng một câu hỏi, sau khi thực hiện một số tiêu chuẩn, tôi thấy rằng chế độ băm trong ấn bản gốc nhanh hơn và lưu trữ hiệu quả hơn bất kỳ thứ gì mà phiên bản java cung cấp, vì vậy tôi quyết định đi với thực hiện.

Tôi khuyên bạn nên thực hiện các tiêu chuẩn riêng cho dung lượng lưu trữ mà bạn mong đợi và quyết định xem phiên bản Java có đủ nhanh không.

nếu có, hoặc nếu hiệu suất không phải là vấn đề lớn đối với bạn (điều đó rất quan trọng đối với tôi), chỉ cần đi với ấn bản Java. nếu không thì đi với người bản xứ (giả sử bạn thấy cùng một hiệu suất tăng cho trường hợp sử dụng của riêng bạn).

btw: điểm chuẩn của tôi đã kiểm tra tốc độ truy vấn các khóa ngẫu nhiên trong số 20.000.000 bản ghi, trong đó khóa là chuỗi và giá trị là int (4 byte). Tôi thấy rằng chèn (điền vào điểm chuẩn) nhanh hơn nhiều với phiên bản gốc và các truy vấn nhanh gấp hai lần.

(Điều này không phải do thiếu sót Java nhưng vì phiên bản Java không có cùng phiên bản với phiên bản gốc - 4.0 so với 4.8 IIRC).

12

Tôi có khá nhiều kinh nghiệm sử dụng cả BDB-JE và BDB-core với Java. Quyết định sử dụng cái nào là khá đơn giản: Nếu bạn muốn đồng thời, hãy sử dụng BDB-JE. Nếu bạn muốn khả năng mở rộng, hãy sử dụng BDB-core.

BDB-JE phá vỡ hiệu suất một cách khôn ngoan với cơ sở dữ liệu lớn do định dạng tệp và sự phụ thuộc vào bộ sưu tập rác Java để xóa các mục trong bộ nhớ cache bị xóa. Mong đợi thu gom rác thải tạm dừng hoặc dành nhiều thời gian điều chỉnh cài đặt GC ảo thuật.Các định dạng tập tin có vấn đề quá, bởi vì các chủ đề sạch hơn nền phải mất rất nhiều thời gian làm sạch rác được tạo ra bởi các biện pháp khắc phục bộ nhớ cache sớm. Nếu cơ sở dữ liệu của bạn phù hợp với RAM, BDB-JE hoạt động khá tốt.

BDB-core dựa vào chiến lược khóa trang và các ứng dụng đồng thời cao trải nghiệm rất nhiều lần bế tắc. Nếu bạn có thể đặt hàng ngẫu nhiên các hoạt động, nó làm giảm tiềm năng bế tắc, nhưng nó không bao giờ loại bỏ nó. Bởi vì BDB-core lưu trữ dữ liệu theo cách truyền thống hơn, nó chia tỷ lệ thành các kích thước siêu lớn với sự suy giảm hiệu suất dự đoán và dự kiến. Bởi vì bộ nhớ cache của nó không được quản lý bởi một bộ thu gom rác, nó có thể khá lớn và không gây ra bất kỳ tạm dừng nào.

1

Tôi quyết định đi với Ấn bản Java, đơn giản là vì nó có thể nhúng thời gian chạy cơ sở dữ liệu trong cùng một triển khai. Đây là một tính năng quan trọng cho thiết lập của tôi. Tôi đã không chuẩn bị giữa lõi và JE, nhưng tôi đã thấy hiệu suất tuyệt vời so với các cửa hàng giá trị quan trọng khác mà tôi đã kiểm tra khi lần đầu tiên đánh giá các cửa hàng cơ sở dữ liệu.

Nếu bạn đang tạo ứng dụng web, thì đồng thời có thể rất quan trọng đối với bạn trong thời gian dài.