2010-03-25 39 views
9

TLDR: Ưu điểm/khuyết điểm của việc sử dụng cơ sở dữ liệu trong bộ nhớ so với khóa và cấu trúc dữ liệu đồng thời là gì?Đề xuất cho cơ sở dữ liệu trong bộ nhớ so với cấu trúc dữ liệu an toàn của luồng

Tôi hiện đang làm việc trên một ứng dụng có nhiều (có thể từ xa) màn hình thu thập dữ liệu trực tiếp từ nhiều nguồn dữ liệu và hiển thị chúng trên màn hình trong thời gian thực. Một trong những nhà phát triển khác đã đề xuất sử dụng cơ sở dữ liệu bộ nhớ thay vì làm theo cách tiêu chuẩn mà các hệ thống khác của chúng ta hoạt động, sử dụng các hashmaps đồng thời, hàng đợi, mảng và các đối tượng khác để lưu trữ các đối tượng đồ họa và xử lý chúng một cách an toàn khóa nếu cần. Lập luận của anh ta là DB sẽ giảm bớt sự cần thiết phải lo lắng về sự tương tranh vì nó sẽ xử lý các khóa đọc/ghi tự động, và DB cũng cung cấp một cách dễ dàng hơn để cấu trúc dữ liệu thành nhiều bảng như chúng ta cần thay vì tạo hashmaps hashmaps của danh sách, vv và theo dõi tất cả.

Tôi không có nhiều kinh nghiệm DB bản thân mình vì vậy tôi hỏi người dùng SO đồng nghiệp những gì họ đã có kinh nghiệm và những ưu điểm & khuyết điểm của việc chèn DB vào hệ thống là gì?

+0

thêm tiền thưởng để thu hút thêm câu trả lời –

+0

Đó là thư viện STM dành cho! Họ quản lý khóa cho bạn. –

Trả lời

5

Điều quan trọng là sự không phù hợp giữa Java và DB. Đó là một nhức đầu lớn nếu bạn không cần nó. Nó cũng sẽ chậm hơn rất nhiều cho việc truy cập thực sự đơn giản. Mặt khác, lợi ích sẽ là giao dịch và sự kiên trì đối với hệ thống tệp trong trường hợp xảy ra sự cố. Ngoài ra, tùy thuộc vào nhu cầu của bạn, nó cho phép truy vấn theo cách có thể khó thực hiện với cấu trúc dữ liệu Java thông thường.

Đối với nội dung nào đó ở giữa, tôi sẽ xem Neo4j. Nó là một cơ sở dữ liệu đồ thị Java thuần túy. Điều này có nghĩa rằng nó có thể dễ dàng nhúng, xử lý đồng thời và giao dịch, quy mô tốt, và không có tất cả các vấn đề không phù hợp mà các DB quan hệ có.

Cập nhật Nếu cấu trúc dữ liệu của bạn là đủ đơn giản - một bản đồ của danh sách, bản đồ bản đồ, một cái gì đó như thế, có lẽ bạn có thể nhận được ngay với một trong hai bộ sưu tập đồng thời trong JDK hoặc Google Collections, nhưng nhiều hơn nữa, và bạn có thể sẽ thấy mình tái tạo một cơ sở dữ liệu bộ nhớ. Và nếu các ràng buộc truy vấn của bạn thậm chí còn khó khăn từ xa, bạn sẽ phải tự mình thực hiện tất cả các cơ sở đó. Và sau đó bạn sẽ phải chắc chắn rằng họ làm việc đồng thời vv Nếu điều này đòi hỏi bất kỳ phức tạp nghiêm trọng hoặc quy mô (datasets lớn), tôi chắc chắn sẽ không cuộn của riêng bạn trừ khi bạn thực sự muốn cam kết với nó.

Nếu bạn quyết định đi với DB được nhúng, có khá nhiều lựa chọn. Bạn có thể muốn bắt đầu bằng cách xem xét có hay không bạn muốn đi SQL hoặc các tuyến đường NoSQL. Trừ khi bạn thấy lợi ích thực sự để đi SQL, tôi nghĩ rằng nó cũng sẽ thêm rất nhiều vào sự phức tạp của ứng dụng của bạn. Hibernate có lẽ là con đường dễ nhất của bạn với SQL thực tế nhất, nhưng nó vẫn là một dạng nhức đầu. Tôi đã thực hiện nó với Derby mà không có vấn đề nghiêm trọng, nhưng nó vẫn không đơn giản. Bạn có thể thử db4o là một cơ sở dữ liệu đối tượng có thể được nhúng và không yêu cầu ánh xạ. This is a good overview. Như tôi đã nói trước đây, nếu đó là tôi nếu tôi có thể thử Neo4j, nhưng đó chỉ là tôi muốn chơi với những thứ mới và sáng bóng;) Tôi chỉ xem nó như một thư viện rất minh bạch có ý nghĩa. Hibernate/SQL và db4o có vẻ như quá nhiều tay vẫy tay để cảm thấy nhẹ.

+2

điểm tốt về sự dễ dàng bổ sung của sự kiên trì đối với hệ thống tệp –

+1

Ngoài ra còn có một chiến thắng lớn với hướng cơ sở dữ liệu bằng cách làm cho mô hình dữ liệu minh bạch hơn. Nó có thể rất phức tạp làm thay đổi mã liên quan đến cấu trúc dữ liệu phức tạp. Trong khi đó, nó là rõ ràng hơn khi dữ liệu được cấu trúc như bảng và các mối quan hệ. Và với các ORM hiện đại, tôi không nghĩ rằng truy cập cơ sở dữ liệu là tất cả những đau đầu lớn trong những ngày này. Chắc chắn ít đau đầu hơn so với cấu trúc dữ liệu phức tạp mã hóa tay tương tranh. Tôi muốn chọn tuyến đường cơ sở dữ liệu. – nicerobot

+0

neo4j trông rất hứa hẹn bây giờ tôi đã đọc một chút về nó trên wiki của họ. –

-1

Không rõ lý do tại sao bạn cảm thấy rằng trong cơ sở dữ liệu bộ nhớ không thể là chủ đề an toàn.

Tại sao bạn không xem JDO và DataNucleus? Họ có rất nhiều kho dữ liệu khác nhau, nơi bạn có thể cắm vào những gì nhà cung cấp kiên trì cuối cùng của bạn ở thời gian chạy như là một bước cấu hình. Mã ứng dụng của bạn phụ thuộc vào ORM nhưng ORM đó có thể được cắm vào RDBMS, DB40, NeoDatis, LDAP, v.v. Nếu một chương trình phụ trợ không hoạt động cho bạn, thì chuyển sang một chương trình khác.

+0

bạn hiểu sai câu hỏi của tôi. Tôi đã không nói rằng một DB không phải là thread an toàn, trên thực tế đó là một trong những cân nhắc cho lý do tại sao để sử dụng một DB. –

1

Tôi đã từng làm việc cho một dự án đã sử dụng Oracle TimesTen. Điều này đã trở lại vào đầu năm 2006 khi Java 5 vừa được phát hành và các lớp học java.util.concurrent hầu như không được biết đến. Hệ thống chúng tôi đã phát triển có khả năng mở rộng hợp lý và các yêu cầu thông lượng lớn (đó là một trong những hộp telco chính để nhắn tin SMS/MMS).

Nói ngắn gọn, lý do cho TimesTen là công bằng: "hãy thuê các vấn đề về tính tương thích/khả năng mở rộng của chúng tôi cho người khác và tập trung vào lĩnh vực kinh doanh của chúng tôi". Nhưng điều này đã trở lại vào năm 2006. Tôi không nghĩ rằng một quyết định như vậy sẽ được đưa ra hôm nay.

Đồng thời là khó khăn, nhưng do đó, việc xử lý cơ sở dữ liệu trong bộ nhớ. Giải phóng bản thân các vấn đề tương tranh bạn phải trở thành một chuyên gia về thế giới cơ sở dữ liệu trong bộ nhớ. Tinh chỉnh TimesTen để nhân rộng là khó (chúng tôi phải thuê một chuyên gia tư vấn chuyên nghiệp từ Oracle để làm điều này). Giấy phép (s) không đến miễn phí. Bạn cũng cần phải lo lắng về lớp bổ sung không phải là nguồn mở và/hoặc có thể được viết bằng một ngôn ngữ khác với ngôn ngữ bạn hiểu.

Nhưng thật khó để đưa ra bất kỳ phán đoán nào mà không biết kinh nghiệm, ngân sách, yêu cầu về thời gian, v.v. Hãy mua sắm xung quanh, dành chút thời gian để xem xét các khuôn khổ đồng thời phù hợp (chẳng hạn như http://akkasource.org/) ... biết những gì bạn đã quyết định;)

4

Bạn có thể sử dụng một cái gì đó như Space4J và nhận được lợi ích của cả một bộ sưu tập như giao diện và cơ sở dữ liệu bộ nhớ. Trong thực tế sử dụng một cái gì đó cơ bản như một bộ sưu tập một trong cơ sở dữ liệu bộ nhớ không có chỉ mục. Danh sách một cơ sở dữ liệu bộ nhớ có chỉ mục int đơn. Bản đồ một cơ sở dữ liệu trong bộ nhớ có chỉ mục dựa trên chỉ mục T và không đồng thời trừ khi được đồng bộ hóa hoặc một java.util.concurrency. * Implementation.

+2

Giản đồ chỉ mục của space4j khá mạnh, với 4 loại chỉ mục. Hãy xem: http://forum.space4j.org/posts/list/5.page – TraderJoeChicago

1

Dưới đây là một vài câu hỏi có thể tạo điều kiện cho quyết định.

  • Truy vấn - bạn có cần truy vấn/tổng hợp lại dữ liệu của mình dưới các hình thức khác nhau không?
  • Giao dịch - bạn có bao giờ cần khôi phục dữ liệu đã thêm không?
  • Tính bền bỉ - bạn chỉ cần trình bày dữ liệu được thu thập hay bạn cũng cần lưu trữ dữ liệu theo cách nào đó?
  • Khả năng mở rộng - liệu dữ liệu của bạn luôn phù hợp với bộ nhớ?
  • Hiệu suất - nhanh như thế nào?
Các vấn đề liên quan