2012-03-19 31 views
21

Gần đây tôi đã hỏi một câu hỏi về Neo4j, mà tôi đã làm việc và có vẻ tốt đẹp. Nó có thể nhúng và được viết bằng Java và không có quá nhiều phụ thuộc.DB được nhúng nào được viết bằng Java cho một kho khóa/giá trị đơn giản?

Tuy nhiên đó là biểu đồ DB và tôi không biết liệu đó có phải là ý hay hay không để sử dụng nó làm cửa hàng khóa/giá trị đơn giản.

Về cơ bản tôi đã có một bản đồ lớn, mà trong Java sẽ trông như thế này:

Map<Integer,Map<String,String>> 

Tôi đã có một vài hàng chục triệu mục trong bản đồ chính và mỗi mục chứa bản thân bản đồ thuộc tính/giá trị. Bản đồ "bên trong" tương đối nhỏ: khoảng 20 mục.

Tôi cần một cách để duy trì bản đồ đó từ khi chạy webapp sang ứng dụng kia.

Sử dụng Neo4j, những gì tôi đã làm là tạo một nút cho mỗi ID (số nguyên) và sau đó đặt một thuộc tính cho mỗi mục nhập bên trong bản đồ bên trong. Từ thử nghiệm ban đầu của tôi nó có vẻ làm việc nhưng tôi không chắc đó là một cách tốt để tiến hành.

DB nhúng nào được viết bằng Java, bạn có sử dụng không?

Các yêu cầu là:

  • viết bằng Java

  • nhúng (vì vậy không có gì quá lớn)

  • không SQL (*)

  • mã nguồn mở

  • dễ dàng để sao lưu (tôi cần để có thể làm "sống" sao lưu, trong khi máy chủ đang chạy)

ngữ của tôi có thể là một chút sai quá, vì vậy cảm thấy tự do để giúp tôi/chính xác cho tôi . Đối với "bản đồ bản đồ" của tôi, sự phù hợp nhất sẽ là một cặp khóa/giá trị DB phải không?

tôi là một chút mất như sự khác biệt giữa các cặp khóa/giá trị DB, tài liệu DBS, bảng lớn, đồ thị DBS vv

Tôi cũng thích nếu đó là một ý tưởng tốt để sử dụng một đồ thị DB giống như Neo4J cho nhu cầu của tôi (tôi nghĩ hiệu suất thực sự sẽ không phải là một vấn đề nhìn thấy số lượng tương đối nhỏ của mục tôi sẽ có).

Tất nhiên tôi có thể chỉ đơn giản là duy trì bản đồ của tôi bản đồ nhưng tôi thực sự không muốn phát minh lại bất kỳ bánh xe nào ở đây. Tôi muốn sử dụng lại DB đã cố gắng và thử nghiệm ...

(*) Lý do tôi không muốn SQL là tôi sẽ luôn có "bản đồ bản đồ" này và bản đồ bên trong sẽ không ngừng phát triển, vì vậy tôi không muốn một cái gì đó quá cấu trúc.

+0

là bản đồ bên trong rất có thể sẽ khác nhau trong mỗi mục của bản đồ chính, hoặc sẽ có một số lượng đáng kể sự chồng chéo giữa các bản đồ bên trong của bản đồ chính? Có một số tuyến đường khác nhau mà bạn có thể thực hiện, nhưng nó thực sự phụ thuộc vào lượng bản sao tham chiếu trong cấu trúc của bạn. – cdeszaq

+0

@cdeszaq: cảm ơn nhận xét và giúp đỡ của bạn ... Bản đồ bên trong chủ yếu sẽ có cùng số thuộc tính và cùng thuộc tính, nhưng giá trị của mỗi thuộc tính sẽ khác đôi chút. Tôi muốn nói khá một số chồng lên nhau tuy nhiên tôi không nghĩ rằng buổi biểu diễn sẽ là một điều đáng lo ngại: Tôi có nhiều thứ sau khi thuận tiện/nhỏ/dễ sao lưu. Bạn có nghĩ Neo4j sẽ làm việc ở đây không? Tôi biết có một số lựa chọn: rất nhiều mà tôi là một chút bị mất:) –

+0

@cdeszaq: Tôi quên đề cập đến: các thuộc tính của bản đồ bên trong sẽ "tiến hóa" trong suốt vòng đời của ứng dụng: các thuộc tính mới sẽ được thêm vào (và các mục nhập cũ, không có các thuộc tính mới hơn này, sẽ mặc định thành giá trị mặc định khi được truy vấn cho thuộc tính không tồn tại). Vì vậy, có chồng lên nhau nhưng nó không "có cấu trúc" trong đó không có thực sự bất kỳ lược đồ cố định (nếu tôi nhận được thuật ngữ của tôi đúng). –

Trả lời

5

Bạn có thể nhìn vào Berkeley DB

http://docs.oracle.com/cd/E17277_02/html/GettingStartedGuide/index.html

Nó là khá hiệu quả trong việc đối phó với số lượng lớn dữ liệu và nó là chìa khóa/giá trị. tôi có thể không thực sự nói rõ hơn về nó vì tôi phát hiện ra nó bản thân mình nhưng nếu bạn có thời gian để có một cái nhìn vào nó ...

+0

Tôi sẽ trả lời bạn * "có, Berkeley luôn tốt đẹp nhưng nó được viết bằng C" * và sau đó tôi nhận ra có một phiên bản * "Berkeley DB Java" * hoàn toàn được viết bằng Java và mã nguồn mở ... Nó có thể là hấp dẫn. –

+0

Đó là Java thuần túy ... vấn đề là giấy phép không thân thiện với doanh nghiệp phần mềm (nhỏ). –

13

Dường như có một vài cổng của Google LevelDB vào Java:

Sau đó, có một danh sách toàn bộ nhúng Java sở dữ liệu ở đây:

+0

đây là những liên kết tuyệt vời ... Sẽ có bất kỳ người trong số họ bạn muốn giới thiệu trong trường hợp cụ thể của tôi? –

+0

@CedricMartin Tôi chắc chắn sẽ giới thiệu LevelDB nếu bạn muốn có một cơ sở dữ liệu nhúng nhẹ và cực kỳ nhanh. Để có được hiệu suất tối đa từ LevelDB, hãy thử truy cập các khóa của bạn theo thứ tự tuần tự bằng cách sử dụng trình lặp thay vì nhận (Iterator.Seek vs DB.Get). LevelDB rất nhanh để đọc/viết ngẫu nhiên, nhưng nó được tối ưu hóa cao cho các lần đọc/ghi tuần tự. Hơn nữa, LevelDB rất kiên cường với các lỗi và nó đã xây dựng sẵn các chức năng để sửa chữa cơ sở dữ liệu nếu bạn không thể mở nó. – Kiril

2

Bạn thể chỉ gắn bó với một tập tin XML hoặc JSON. Không ai trong số này yêu cầu một giản đồ và khá dễ dàng để chuyển qua lại giữa đĩa và bộ nhớ, đặc biệt nếu hiệu suất thực sự không quan trọng quá nhiều. (ví dụ: bạn chỉ tải cấu hình mọi lúc và sau đó)

Lợi thế là cả XML và JSON đều rất đơn giản và đối phó với Maps khá tốt.

Bạn cũng có tải phụ thuộc nhiều hơn vào ứng dụng của mình. Toàn bộ hệ thống kiểu DB được nhúng khá nặng nếu bạn chỉ kiên trì/không bền bỉ một cấu trúc dữ liệu lớn khi bạn cần và không sử dụng bất kỳ truy vấn hoặc khả năng tương tự mà hầu hết các giải pháp nhúng sẽ thêm vào.

Để loại bỏ các yêu cầu của bạn, nó được xây dựng trong Java phần lớn, dễ sao lưu, vì nó chỉ là một tệp, có khả năng nhúng cao, rất nhiều Nguồn mở và không phải SQL. XML có thể hơi dài dòng và khó sử dụng, nhưng đó là một tên miền nổi tiếng và có công cụ rất phong phú xung quanh nó để bạn có thể xử lý nó bên ngoài ứng dụng của bạn nếu cần.

+0

well Tôi đã xem xét XStream và tôi chắc chắn có những cách khác để làm điều đó tuy nhiên có vẻ như một chút "low-level'ish". Tôi sẽ phải đối phó với các "giao dịch" không thành công, có khả năng không ổn định nếu dây nguồn bị loại bỏ khi đang viết một tệp XML, vv. Hơn nữa tôi sẽ có vài chục triệu mục (như tôi đã viết trong câu hỏi của tôi), vì vậy Tôi không chắc XML hay JSON sẽ là "nhẹ" trong trường hợp này (tôi cần hoặc cần nhiều tệp XML hoặc đặt một số mục trong cùng một tệp). XML hoặc JSON là một tùy chọn nhưng tôi có Neo4j chạy ngay bây giờ và nó có vẻ tương đối nhẹ. –

+0

Có, nó là một chút cấp thấp, nhưng nó không yêu cầu bất kỳ phụ thuộc khác. Và nếu bạn lo lắng về thất bại quyền lực giữa ghi và giao dịch, vv, tôi sẽ đặt câu hỏi về việc sử dụng chỉ khoảng _any_ giải pháp nhúng. Cuối cùng, nếu bạn có một cái gì đó hoạt động, sau đó chỉ cần sử dụng cho đến khi bạn có thể cho thấy rằng bạn cần cái gì khác.Nếu Neo4j hoạt động và đáp ứng nhu cầu của bạn, hãy sử dụng nó và chuyển sang các vấn đề quan trọng hơn. Đưa nó ra khỏi cửa trước, sau đó lặp lại một khi bạn có phản hồi thực sự. Cho đến lúc đó, bạn chỉ đoán thôi. – cdeszaq

+0

* "nếu bạn lo lắng về việc mất điện giữa ghi và giao dịch, v.v ..., tôi sẽ đặt câu hỏi về việc sử dụng bất kỳ giải pháp nhúng nào" * ... Kinda. Nhưng chắc chắn một số người trong số họ phải có sự bảo vệ tốt hơn chống lại các sự kiện như vậy hơn những người khác. Thing là: Tôi biết tôi đoán. Phải mất một vài giờ để có được Neo4j và chạy và tôi đã tự hỏi tôi có thể thử so sánh với. Oh well, tôi sẽ làm theo lời khuyên của bạn và ở lại với Neo4j kể từ bây giờ, mặc dù tôi không cần tính năng "đồ thị". Tiếp theo tôi sẽ thử nếu tôi gặp vấn đề sẽ là "Berkeley DB Java edition":) –

11

Đối với trường hợp sử dụng của bạn tôi muốn giới thiệu MapDB (http://www.mapdb.org)

Nó phù hợp với yêu cầu của bạn:

  • viết bằng Java
  • nhúng - jar duy nhất không có phụ thuộc
  • không SQL - cung cấp cho bạn các bản đồ được lưu giữ trên đĩa
  • nguồn mở (giấy phép Apache 2)
  • dễ sao lưu (vài tệp)

và có các tính năng đẹp khác như giao dịch, đồng thời và hiệu suất.

6

Chronicle-Map là trình phát đẹp mới trên trường này.

  • Đó là off-đống trú (với khả năng để được tồn vào đĩa bằng tập tin bộ nhớ ánh xạ) Map thực hiện
  • siêu nhanh - duy trì hàng triệu truy vấn/cập nhật mỗi giây, i. e.mỗi truy vấn có sub-micro độ trễ trung bình
  • Hỗ trợ cập nhật đồng thời (giả định là một thả thay thế ConcurrentHashMap)
  • hỗ trợ đặc biệt của bản đồ tài sản bạn đề cập, nếu tập các thuộc tính được cố định trong bộ sưu tập - cho phép cập nhật các thuộc tính cụ thể của giá trị mà không cần tuần tự hóa/giải tuần tự hóa toàn bộ giá trị (20 trường). Tính năng này được gọi là thế hệ tạo giá trị dữ liệu trong Chronicle/Lang dự án.
  • Và nhiều hơn nữa ...
2

Phần cuối cùng nhưng bạn có thể sử dụng Tayzgrid. Nguồn mở của nó và bộ đệm trong-proc của nó có thể được nhúng vào trong ứng dụng của bạn. Về cơ bản nó là một lưới dữ liệu trong bộ nhớ hoặc In Memory Key value store nhưng nó cũng có khả năng bạn muốn, tức là một quá trình lưu trữ giá trị khóa nhúng đơn giản.

1

Thanh toán www.jsondb.io

Đây là một java tinh khiết, nhúng cơ sở dữ liệu trọng lượng nhẹ mà các cửa hàng dữ liệu của nó như các file mà làm cho nó dễ dàng để sao lưu

+0

Rất tuyệt! Cảm ơn bạn đã làm cho nó! Cộng với hỗ trợ XPath o yeah !!!!!!!!!!!! – GOXR3PLUS