2012-04-16 25 views
24

Cách tốt nhất/nhanh nhất để kiểm tra xem thực thể có tồn tại trong kho dữ liệu của Google-app-engine không? Bây giờ tôi đang cố gắng lấy thực thể bằng khóa và kiểm tra xem get() có trả về lỗi hay không.Kiểm tra xem Thực thể có tồn tại trong kho dữ liệu công cụ ứng dụng của google hay không.

Tôi không biết quy trình nhận thực thể trên kho dữ liệu. Có cách nào nhanh hơn để chỉ thực hiện kiểm tra này không?

+0

nhận thực thể theo khóa sẽ không bao giờ trả về lỗi, nó trả về Không. – aschmid00

+5

Trong java 'get' ném một ngoại lệ khi thực thể không được tìm thấy: https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService#get(com.google .appengine.api.datastore.Key) –

+0

ok không biết điều đó. – aschmid00

Trả lời

4

com.google.appengine.api đã không còn được sử dụng để ủng hộ ứng dụng khách GCS của Máy ứng dụng.

Bạn đã xem xét sử dụng truy vấn chưa? Đoán và kiểm tra không phải là cách có thể mở rộng để tìm ra một thực thể tồn tại trong kho dữ liệu. Một truy vấn có thể được tạo ra để lấy các thực thể từ các kho dữ liệu có thể đáp ứng một bộ quy định các điều kiện:

https://developers.google.com/appengine/docs/java/datastore/queries

EDIT:

gì về truy vấn chủ chốt chỉ? Truy vấn chỉ khóa chạy nhanh hơn các truy vấn trả về các thực thể hoàn chỉnh. Để chỉ trả về các khóa, sử dụng phương thức Query.setKeysOnly().

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly(); 

Nguồn: [1]: http://groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1

+1

Phản hồi thời gian để thực hiện truy vấn tốt hơn cho việc tìm nạp thực thể? – Victor

+13

Không, truy vấn sẽ luôn mất nhiều thời gian và tốn kém hơn, vì vậy tôi không nghĩ đây là câu trả lời đúng. –

+1

Chi phí cho một truy vấn với bộ lọc .setKeysOnly() thực sự có cùng chi phí như một hoạt động nhận đơn (cả về thuật ngữ và thời gian chạy hiệu quả vì điều này chủ yếu được xác định bởi thời gian khứ hồi mạng). Cũng lưu ý rằng Truy vấn cho KEY_RESERVED_PROPERTY được xử lý theo cách đặc biệt vì nó không sử dụng chỉ mục nhất quán cuối cùng làm truy vấn cho bất kỳ thuộc tính nào khác, nhưng thay vào đó là phù hợp nhất quán. Điều này làm cho câu trả lời này hoàn toàn hợp lệ, mặc dù việc tiết kiệm bằng cách tìm nạp các khóa chỉ không được chỉ định cho kiểu truy vấn này. – Ext3h

3

Bạn có thể lấy sử dụng một List<Key> chỉ chứa một Key, that method trả về một Map<Key, Entity> mà bạn có thể kiểm tra xem nó có chứa một giá trị thực tế hoặc null, ví dụ:

Entity e = datastoreService.get(Arrays.asList(key)).get(key); 

Nói chung, mặc dù tôi nghĩ sẽ dễ dàng hơn khi quấn get() trong thử/bắt trả về null nếu bị bắt gặp EntityNotFoundException.

+0

Tại sao điều này là tốt nhất bằng cách chỉ sử dụng get (Key)? – Victor

+0

Nó dường như có vẻ "đúng" hơn nếu bạn chỉ tìm nạp một khóa - nhưng nó hoàn toàn là sở thích cá nhân, và tùy thuộc vào bạn. –

+0

Tôi yêu cầu dựa trên thời gian phản hồi tốt hơn – Victor

6

Những gì bạn đề xuất thực sự sẽ là cách nhanh nhất để biết thực thể của bạn có tồn tại hay không. Điều duy nhất làm chậm bạn xuống là thời gian cần để lấy và deserialize thực thể của bạn. Nếu thực thể của bạn lớn, điều này có thể làm chậm bạn xuống. Nếu hành động này (kiểm tra sự tồn tại) là một nút cổ chai lớn cho bạn và bạn có thực thể lớn, bạn có thể muốn cuộn hệ thống kiểm tra của riêng mình bằng cách sử dụng hai thực thể - trước tiên bạn sẽ có thực thể hiện tại của bạn với dữ liệu, và thực thể thứ hai lưu trữ tham chiếu đến thực thể thực hoặc có thể là thực thể trống trong đó khóa chỉ là biến thể trên khóa thực thể ban đầu mà bạn có thể tính toán. Bạn có thể kiểm tra sự tồn tại nhanh chóng bằng cách sử dụng thực thể thứ 2 và sau đó tìm nạp thực thể đầu tiên chỉ khi dữ liệu là cần thiết. Cách tốt hơn tôi nghĩ sẽ chỉ là thiết kế các phím của bạn như bạn biết sẽ không có bản sao, hoặc các hoạt động của bạn là không đáng tin cậy, để ngay cả khi một thực thể cũ bị ghi đè, nó sẽ không thành vấn đề.

+0

Tôi không nghĩ rằng có một cách để tránh kiểm tra này khi một số quy trình chạy song song. Cách duy nhất để đảm bảo không có trùng lặp là sử dụng giao dịch: kiểm tra xem một thực thể đã tồn tại chưa, nếu không - tạo một thực thể mới. –

+0

Có thể bạn không hiểu câu trả lời của tôi. Tôi đã nói khá nhiều điều tương tự. Và sau đó, tôi đã thêm một tối ưu hóa trong trường hợp bạn có các thực thể lớn và bạn không muốn deserialize thực thể lớn. Bạn có thể có một thực thể nhỏ thứ hai để kiểm tra sự tồn tại để nó trả về nhanh hơn nhiều so với tìm nạp thực thể lớn. Nhưng bạn đang viết, bạn phải viết hai thực thể đó trong một giao dịch. – dragonx

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