2016-06-30 16 views
10

Tôi có hệ thống phần mềm thanh toán qua telco. Trong đó có nhật ký hàng ngày của các cuộc gọi của người dùng. Các bản ghi được phân chia theo chiều ngang theo ngày (tháng). Mỗi phân vùng được lưu trữ trong một cơ sở dữ liệu riêng biệt và có thể được trải rộng trên nhiều phiên bản.Cách sắp xếp dữ liệu được phân đoạn ngang

Trong giao diện người dùng, người dùng sẽ chỉ định phạm vi ngày. Dữ liệu được trả về có thể được sắp xếp trên bất kỳ trường nào. Phạm vi ngày có thể trải rộng trên nhiều phân vùng. Ứng dụng phải hỗ trợ phân trang thông qua dữ liệu của phạm vi ngày.

Tôi không thể tải quá nhiều bản ghi vào bộ nhớ để sắp xếp. Đặt sắp xếp bên trong truy vấn chỉ cung cấp cho tôi dữ liệu được sắp xếp bên trong một bộ kết quả.

Vì vậy, tôi cần sắp xếp dữ liệu từ nhiều phân đoạn được phân loại riêng lẻ. Làm thế nào tôi có thể trả về các bản ghi đã sắp xếp cho giao diện người dùng từ nhiều bộ kết quả được sắp xếp?

EDIT: Sau khi phân tích thêm về vấn đề này, Chúng tôi có thêm một số yếu tố đầu vào. Cũng có yêu cầu phân trang. Do đó, chúng ta cần phải tìm ra một cách khác để phân loại thời gian thực trên nhiều tập hợp kết quả.

+1

Bạn chỉ có thể tải cột được sắp xếp và id bản ghi, sau đó sắp xếp và cuối cùng tải các bản ghi bạn muốn hiển thị dựa trên các id được sắp xếp. Tôi không chắc chắn bạn có thể làm bất kỳ interleaving có ý nghĩa trên một cấp db để làm nó trong mã của bạn có vẻ là cách dễ nhất. Một tùy chọn khác có thể là viết các bản ghi (một phần) vào một tệp ánh xạ bộ nhớ và sắp xếp ở đó nhưng điều đó có lẽ sẽ tốn nhiều hiệu suất hơn - sau khi tất cả bạn có một tình huống tốc độ-bộ nhớ cổ điển ở đây. – Thomas

+0

Chúng ta đã thảo luận cách tiếp cận đầu tiên, nhưng nhược điểm trong cách tiếp cận này là chúng ta cần truy vấn lại với Id và vì nó là từ giao diện người dùng, nên cần phải thực hiện phân trang. –

+1

Vâng, chúng tôi đã có một tình huống tương tự khi tải tất cả dữ liệu chỉ mất quá nhiều bộ nhớ và do đó chúng tôi tuân theo phương pháp tải đầu tiên chỉ dữ liệu được sắp xếp cũng như id, sau đó sắp xếp và chỉ giữ id. Phân trang sau đó sẽ hoạt động trên các id được sắp xếp và chỉ các bản ghi tương ứng với các id của trang sẽ được tải hoàn toàn. Tất nhiên bạn cần phải truy vấn lại nhưng với phân trang bạn phải làm điều đó anyways. Để tăng tốc truy vấn thứ hai (phân trang) của bạn, bạn cũng có thể lưu trữ phân vùng nguồn và chỉ truy vấn các phân vùng đó. – Thomas

Trả lời

2

Bằng cách dựa vào khả năng tải dữ liệu hạn chế của bộ nhớ trong bộ nhớ, chúng tôi có thể đưa ra giải pháp trong Java bằng cách sử dụng Bộ so sánh động. Giải pháp là lấy bản ghi đầu tiên từ mỗi resultSet và sắp xếp nó trong java và trả về phần tử đầu tiên từ dữ liệu được sắp xếp.

Giải pháp chi tiết:

tiên chúng ta đã xây dựng một chương trình có thể cho chúng ta một Comparator dymanic dựa trên các tiêu chí chọn lựa trên màn hình.

Thứ hai Chúng tôi đã viết một trình bao bọc AggregateResultSet trên DAO bao quanh ResultSets từ các phân vùng khác nhau. Lưu ý: các ResultSets riêng lẻ này đã được sắp xếp với cùng tiêu chí. Sau đó, AggregateResultSet sẽ được cung cấp một bộ so sánh động.

AggregateResultSet này sẽ có cấu trúc dữ liệu để lưu trữ phần tử đầu tiên của từng bộ kết quả ban đầu. Nó sẽ trả về phần tử tiếp theo gọi tới next(). Phần tử này sẽ là phần tử đến trước theo dynamicComparator. Trong lần gọi tiếp theo(), Chúng tôi xóa phần tử này khỏi cấu trúc dữ liệu tạm thời và chèn phần tử tiếp theo từ cùng một tập kết quả trong cấu trúc dữ liệu tạm thời. Bằng cách này, AggregateResultSet sẽ trả về dữ liệu theo thứ tự mong đợi, bằng cách hợp nhất/lưu trữ/sắp xếp dữ liệu rất hạn chế trong Java.

Chúng tôi hy vọng sẽ không nhận được sự cố so sánh vì chúng tôi có phần lớn dữ liệu số/chuỗi trong sắp xếp.

+1

Âm thanh như một giải pháp thú vị giúp giảm chi phí bộ nhớ trong ứng dụng Java. Tôi không chắc chắn về ý nghĩa của các cơ sở dữ liệu mặc dù vì lý thuyết bạn phải giữ kết nối mở cũng như giữ kết quả trong bộ nhớ đệm của db để nhanh chóng lấy ra phần tử tiếp theo. Ngoài ra, bạn có thể gặp phải các vấn đề giao dịch nếu dữ liệu mà db lưu trong bộ đệm ẩn của nó được cập nhật. – Thomas

+0

@Thomas, vì đó là hệ thống thanh toán, dữ liệu (bản ghi cuộc gọi) chỉ được tải lên một lần (ngày + 2) sau khi dữ liệu được đối chiếu ở các cấp khác nhau và không bao giờ được cập nhật (bảo mật). –

+0

Nếu tôi hiểu giải pháp của bạn một cách chính xác, phân trang sẽ rất kém hiệu quả, vì bạn sẽ cần phải đọc tất cả các trang 'n-1' trước trang' n'. –

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