Phát triển Java 2.0: Lưu trữ đám mây với SimpleDB của Amazon, Phần 1

Làm quen với SimpleDB và bộ thư viện Amazon SDK

Là một phần trong họ Amazon Web Services (Các dịch vụ Web của Amazon), SimpleDB của Amazon là một kho dữ liệu khóa/giá trị tin cậy và có khả năng mở rộng quy mô, được trình bày qua một giao diện web và có thể sử dụng ngôn ngữ Java để truy cập nó. Hãy bắt đầu với SimpleDB của Amazon trong bài đầu tiên này bằng việc khám phá cách tiếp cận độc đáo của SimpleDB tới kho dữ liệu không lược đồ, bao gồm trình bày về một trong những tính năng đáng chú ý nhất của kho dữ liệu: đó là tính năng Lexicographic Searching (Tìm kiếm từ điển).

Andrew Glover, Tác giả và Nhà phát triển, Beacon50

 Andrew GloverAndrew Glover là một nhà phát triển, tác giả, diễn giả và là người điều hành doanh nghiệp với niềm đam mê phát triển các hệ thống điều khiển hành vi, tích hợp liên tục và phát triển phần mềm dựa trên quy trình Agile. Ông đã sáng lập ra nền tảng phát triển điều khiển hành vi easyb và là đồng tác giả của 3 cuốn sách: Continuous Integration (Tích hợp liên tục), Groovy in Action (Thực hành ngôn ngữ Groovy), và Java Testing Patterns (Các mẫu kiểm thử Java). Bạn có thể theo dõi và tìm hiểu về ông qua trang blogTwitter.



27 02 2013

Đôi điều về loạt bài này

Bối cảnh phát triển Java đã thay đổi hoàn toàn kể từ khi công nghệ Java đã xuất hiện lần đầu tiên. Nhờ các khung công tác nguồn mở hoàn thiện và cơ sở hạ tầng triển khai cho thuê tin cậy mà ngày nay chúng ta có thể lắp ráp, thử nghiệm, chạy và duy trì các ứng dụng Java một cách nhanh chóng và không tốn kém. Trong loạt bài này, Andrew Glover khám phá một loạt các công nghệ và các công cụ làm cho hình mẫu phát triển Java mới này trở nên khả thi.

Qua loạt bài này, tôi đã chia sẻ với bạn một số trong các kho dữ liệu không quan hệ, có tên chung là NoSQL. Trong một bài viết gần đây, tôi đã giới thiệu cho bạn một kho dữ liệu hướng tài liệu (CouchDB) rất khác với các cơ sở dữ liệu quan hệ hướng lược đồ. Hơn nữa, API tổng thể của CouchDB là RESTful (Chuyển trạng thái đại diện) và hỗ trợ một phương tiện truy vấn khác: các hàm MapReduce được định nghĩa trong JavaScript. Rõ ràng, điều này đã thoát khỏi những truyền thống thông thường của JDBC.

Gần đây tôi cũng đã viết về Bigtable của Google. Bigtable không phải là một giải pháp dữ liệu quan hệ hay giải pháp dữ liệu hướng tài liệu (và nó cũng không hỗ trợ JDBC). Bigtable thường được gọi là một kho khóa/giá trị (key/value). Nghĩa là, nó không có lược đồ và nói chung cho phép bạn lưu trữ bất cứ thứ gì bạn muốn cho dù đó là một tờ vé phạt đỗ xe, một danh sách các cuộc thi chạy hoặc thậm chí cả những người chạy thi trong một cuộc thi chạy. Do không có lược đồ nên Bigtable mang đến rất nhiều sự linh hoạt để hỗ trợ phát triển nhanh chóng.

Đoạn clip demo giới thiệu về SimpleDB của Amazon

Hãy theo dõi hướng dẫn của Andrew Glover qua bài giới thiệu về SimpleDB, một kho dữ liệu key/value có khả năng mở rộng quy mô to lớn, tính sẵn sàng cao. Là một phần trong bộ Amazon Web Services, SimpleDB cung cấp một giao diện dịch vụ web đơn giản để tạo và lưu trữ nhiều tập hợp dữ liệu, truy vấn dữ liệu và trả về các kết quả.

Bigtable không chỉ là kho dữ liệu key/value duy nhất mà chúng ta phải lựa chọn từ đó. Amazon có kho key/value dựa trên đám mây riêng của mình, có tên là Amazon SimpleDB. Trong khi người ta giới thiệu Bigtable cho các nhà phát triển Java thông qua sự trừu tượng hóa do Google App Engine hỗ trợ, thì người ta lại trình bày SimpleDB của Amazon thông qua một giao diện dịch vụ web. Vì vậy, bạn có thể thao tác kho dữ liệu SimpleDB thông qua web và HTTP. Các ràng buộc dựa trên của cơ sở hạ tầng Dịch vụ Web của Amazon giúp khả thi trong việc sử dụng SimpleDB thông qua ngôn ngữ tùy chọn của bạn như PHP, Ruby, C# và Java .

Trong phần này, tôi sẽ giới thiệu cho bạn về SimpleDB thông qua SDK chính thức của Amazon. Tôi cũng sẽ sử dụng một ví dụ về các cuộc thi chạy để chứng minh một trong những khía cạnh khác thường của kho dữ liệu dựa trên đám mây mạnh mẽ này: đó là Lexicographic Searching.

Giới thiệu SimpleDB

Phát triển kỹ năng về chủ đề này

Nội dung này nằm trong "đường dẫn đến kiến thức (knowledge path)" để bổ sung các kỹ năng của bạn. Xem Sử dụng NoSQL và phân tích Big Data

Trong triển khai bên dưới một sản phẩm, SimpleDB là một kho dữ liệu có tính sẵn sàng cao, có khả năng mở rộng quy mô to lớn được viết bằng Erlang. Về khái niệm, nó giống như S3 của Amazon. Trong khi S3 đặt các đối tượng trong các thùng chứa (buckets), thì SimpleDB được định nghĩa một cách hợp lý là các miền có chứa các mục. SimpleDB cũng cho phép các mục chứa các thuộc tính. Hãy suy nghĩ về một miền giống như bạn muốn có một thùng chứa trong S3 hoặc một bảng theo nghĩa quan hệ (hoặc một cách thích hợp hơn là khái niệm "loại" của Bigtable). Nhưng hãy cẩn thận đừng đặt tính quan hệ vào khái niệm của SimpleDB của bạn, vì cuối cùng Bigtable không có lược đồ. Các miền có thể có nhiều mục (tương tự như các hàng) và các mục có thể có nhiều thuộc tính (giống như các cột trong thế giới quan hệ).

'Tính nhất quán cuối cùng' của SimpleDB

Định lý CAP (xem phần Tài nguyên) phát biểu rằng một hệ thống phân tán không thể có khả năng mở rộng quy mô, khả năng sẵn sàng cao và bảo đảm tính nhất quán cùng một lúc; thay vào đó, một hệ thống phân tán chỉ có thể hỗ trợ hai trong ba đặc tính này ở bất kỳ thời điểm cụ thể nào. Theo đó, SimpleDB bảo đảm một kho dữ liệu có khả năng mở rộng và có khả năng sẵn sàng cao mà không hỗ trợ tính nhất quán ngay lập tức. SimpleDB chỉ hỗ trợ tính nhất quán cuối cùng, điều đó không tồi như bạn nghĩ đâu.

Trong trường hợp của Amazon, tính nhất quán cuối cùng có nghĩa là mọi thứ bắt đầu nhất quán trên tất cả các nút (mặc dù trong một vùng) trong vòng vài giây. Độ tin cậy lớn và với một mức giá rất phải chăng là điều mà bạn đánh đổi để lấy khoảng thời gian nhỏ nhoi đó, nơi hai quá trình đồng thời có thể (chỉ có thể) đọc hai cá thể khác nhau của cùng một dữ liệu. (Bạn chỉ cần đặt giá các thực thể thương mại để đưa ra độ tin cậy tương tự để thấy sự khác biệt này).

Các thuộc tính thực sự chỉ là các cặp tên/giá trị (name/value) (bạn thấy nó có giống Bigtable không?) và khía cạnh "cặp" không bị hạn chế với một giá trị. Đó là, một tên thuộc tính có thể có một bộ sưu tập (hoặc danh sách) của các giá trị có liên quan; ví dụ, một mục từ có thể có các giá trị thuộc tính với nhiều định nghĩa. Hơn nữa, người ta biểu diễn tất cả dữ liệu trong SimpleDB như một String, (chuỗi ký tự), điều này hoàn toàn khác với Bigtable hoặc thậm chí khác với một RDBMS tiêu chuẩn, thường hỗ trợ vô số kiểu dữ liệu.

Cách tiếp cận kiểu dữ liệu duy nhất của SimpleDB với các giá trị thuộc tính có thể là một lợi ích hoặc một hạn chế, tùy thuộc vào cách bạn xem xét nó. Dù bằng cách nào, nó có ý nghĩa đối với cách chạy các truy vấn (sẽ nói thêm ở phần dưới). SimpleDB cũng không hỗ trợ khái niệm các phép nối giữa các miền, vì vậy bạn không thể truy vấn các mục trong nhiều miền. Tuy nhiên, bạn có thể khắc phục hạn chế này bằng cách thực hiện nhiều truy vấn SimpleDB và tự mình thực hiện phép nối giữa các miền.

Về bản chất các mục không có các khóa (như Bigtable có). Khóa hay mã định danh duy nhất cho một mục là tên của mục đó. SimpleDB có đủ thông minh để cập nhật một mục khi ban hành một yêu cầu tạo bản sao và cũng cung cấp các thuộc tính của mục đã bị thay đổi.

Giống như Amazon Web Services, SimpleDB hiển thị mọi thứ qua HTTP, do đó, có rất nhiều cách để giao tiếp với nó. Trong thế giới Java, phạm vi tùy chọn của chúng ta từ SDK riêng của Amazon (mà chúng ta sẽ sử dụng trong các ví dụ tiếp theo) cho một dự án phổ biến được gọi là Topica đến cả các việc triển khai thực hiện JPA đang phát triển nhanh (mà chúng ta sẽ tìm hiểu trong Phần 2).


Cuộc đua trong những đám mây

Cho đến loạt bài này, tôi đã sử dụng một phép loại suy về cuộc đua và vé phạt đỗ xe để chứng minh các tính năng của các công nghệ Java 2.0 khác nhau. Việc sử dụng một miền vấn đề quen thuộc làm cho việc đánh giá những khác biệt và những tương đồng giữa các hệ thống trở nên dễ dàng hơn. Vì vậy, chúng ta sẽ gắn với phép loại suy về vạch đích trong một cuộc đua vào lúc này và xem cách biểu diễn của những người chạy thi và các cuộc thi chạy trong SimpleDB của Amazon.

Trong SimpleDB, chúng ta có thể mô hình hóa một cuộc đua như một miền. Cá thể cuộc đua sẽ là một mục trong SimpleDB và tên và ngày tháng của nó sẽ được thể hiện như là các thuộc tính (có các giá trị). Điều quan trọng cần lưu ý là name (tên) trong trường hợp này là một thuộc tính và chứ không phải là tên của chính mục đó. Tên mà bạn đặt cho một cá thể của mục sẽ trở thành khóa của mục đó. Khóa của mục có thể là tên của cuộc thi chạy ma-ra-tông. Cách khác, chúng ta có thể đặt cho một mục một tên duy nhất (giống như một dấu thời gian), để cho phép chúng ta lưu trữ nhiều cuộc đua sáu tháng một lần trong SimpleDB, chứ không phải hạn chế một cá thể trong cuộc đua vào một thời điểm nào (cuộc thi chạy thường là sự kiện hàng năm).

Tương tự như vậy, runner (người chạy thi) sẽ là một miền. Những người chạy thi cá nhân sẽ là các mục và tên tuổi của họ sẽ là các thuộc tính. Cũng giống như với một race, mỗi cá thể mục của runner sẽ cần một tên duy nhất (ví dụ, để phân biệt Pete Smith với Marty Howard). Không giống như Bigtable, SimpleDB không quan tâm bạn đặt tên cho mỗi mục là gì và trong thực tế, nó không cung cấp cho bạn một bộ tạo khóa. Có lẽ trong trường hợp này, chúng ta có thể sử dụng một dấu thời gian hoặc chỉ tăng thêm một số đếm cho mỗi người chạy thi, như là runner_1, runner_2, ....

Vì không có lược đồ nào, nên các mục riêng được tự do thay đổi thuộc tính của chúng. Tương tự như vậy, bạn có thể thay đổi các mục trong một miền nếu bạn muốn. Tuy nhiên, bạn sẽ muốn hạn chế tính thay đổi này, do nó có xu hướng làm cho dữ liệu không có tổ chức, nên không dễ dàng tìm kiếm hoặc quản lý. Hãy lưu ý đến lời tôi nói ở đây: Dù muốn hay không, dữ liệu không có tổ chức, không có lược đồ nào là cách dẫn đến tai họa!

Bắt đầu và chạy với SDK của Amazon

Amazon gần đây đã tiêu chuẩn hóa một thư viện có chứa mã để làm việc với tất cả các dịch vụ web của mình, gồm cả SimpleDB. Thư viện này, giống như hầu hết các thư viện khác, trừu tượng hóa việc truyền thông bên dưới cần thiết để truy cập và sử dụng các dịch vụ này, cho phép các trình máy khách làm việc theo cách nguyên gốc. Ví dụ, thư viện Java của Amazon với SimpleDB cho phép bạn tạo các miền và các mục, truy vấn chúng và tất nhiên cập nhật và xóa chúng khỏi thiết bị lưu trữ — trong lúc không biết về các hoạt động này đang chuyển qua HTTP vào đám mây.

Liệt kê 1 cho thấy việc sử dụng mã Java của plain-Jane để định nghĩa một AmazonSimpleDBClient, cùng với một miền Races. (Bạn sẽ cần phải tạo một tài khoản trong Amazon nếu bạn muốn sao chép bài tập này vào máy trạm của mình).

Liệt kê 1. Tạo một cá thể của AmazonSimpleDBClient
AmazonSimpleDB sdb = new AmazonSimpleDBClient(new PropertiesCredentials(
                new File("etc/AwsCredentials.properties")));
String domain = "Races";
sdb.createDomain(new CreateDomainRequest(domain));

Lưu ý rằng mẫu của đối tượng Request của Amazon SDK sẽ vẫn tiếp tục tất cả các hoạt động của SimpleDB. Trong trường hợp này, việc tạo ra một CreateDomainRequest sẽ tạo ra một miền. Tôi có thể thêm vào các mục thông qua phương thức batchPutAttributes của trình máy khách, về cơ bản phương thức này lấy một List của các mục giống như trong Liệt kê 2:

Liệt kê 2. Race_01
List<ReplaceableItem> data = new ArrayList<ReplaceableItem>();

data.add(new ReplaceableItem().withName("Race_01").withAttributes(
   new ReplaceableAttribute().withName("Name").withValue("Charlottesville Marathon"),
   new ReplaceableAttribute().withName("Distance").withValue("26.2")));

Trong SDK của Amazon, các Item được biểu diễn là các kiểu ReplaceableItem. Bạn đặt cho mỗi cá thể một tên (đó là, một khóa) và sau đó bạn có thể thêm vào các thuộc tính (của kiểu ReplaceableAttribute). Trong Liệt kê 2, tôi đã tạo ra một race, một cuộc đua ma-ra-tông với khóa đơn giản là "Race_01". Tôi thêm cá thể này vào miền Races của mình bằng cách tạo ra một BatchPutAttributesRequset và gửi nó đến AmazonSimpleDBClient, như trong Liệt kê 3:

Liệt kê 3. Tạo một Item trong SimpleDB
sdb.batchPutAttributes(new BatchPutAttributesRequest(domain, data));

Các truy vấn trong SimpleDB

Bây giờ tôi đã lưu một race và tất nhiên tôi có thể tìm kiếm nó qua ngôn ngữ truy vấn của SimpleDB, trông rất giống SQL. Thế nhưng vẫn có một cái bẫy. Bạn có nhớ khi tôi đã nói tất cả các giá trị thuộc tính của mục đều được lưu trữ như các String không? Điều này có nghĩa là việc thực hiện các so sánh dữ liệu theo từ điển, có thể gây ảnh hưởng khi thực hiện các tìm kiếm.

Ví dụ, nếu tôi chạy một truy vấn dựa trên các con số, SimpleDB sẽ tìm kiếm dựa trên các ký tự và không phải các giá trị số nguyên thực sự. Ngay bây giờ, tôi đã có một cá thể cuộc thi chạy duy nhất được lưu trữ trong SimpleDB và tôi có thể tìm kiếm nó một cách dễ dàng bằng cách sử dụng câu lệnh giống như SQL của SimpleDB, như trong Liệt kê 4:

Liệt kê 4. Tìm kiếm Race_01
String qry = "select * from `" + domain + "` where Name = 'Charlottesville Marathon'";
SelectRequest selectRequest = new SelectRequest(qry);
for (Item item : sdb.select(selectRequest).getItems()) {
 System.out.println("Race Name: " + item.getName());
}

Truy vấn trong Liệt kê 4 trông giống như SQL thông thường. Trong trường hợp này, tôi chỉ gọi tất cả cá thể từ Race, ở đây Name tương ứng với "Charlottesville Marathon." Việc gửi một SelectRequest tới AmazonSimpleDBClient tạo ra một bộ sưu tập của các Item làm các kết quả. Vì vậy, tôi có thể lặp lại qua hết các mục và in tên của chúng và trong trường hợp này tôi sẽ chỉ nhận được một mục trả về.

Nhưng bây giờ chúng ta hãy xem điều gì sẽ xảy ra khi tôi thêm một race khác có một thuộc tính khoảng cách khác nhau, như trong Liệt kê 5:

Liệt kê 5. Một race ngắn hơn
List<ReplaceableItem> data2 = new ArrayList<ReplaceableItem>();

data2.add(new ReplaceableItem().withName("Race_02").withAttributes(
   new ReplaceableAttribute().withName("Name").withValue("Charlottesville 1/2 Marathon"),
   new ReplaceableAttribute().withName("Distance").withValue("13.1")));

sdb.batchPutAttributes(new BatchPutAttributesRequest(domain, data2));

Với hai race có các khoảng cách khác nhau, thì việc tìm kiếm dựa trên khoảng cách là đúng, như trong Liệt kê 6:

Liệt kê 6. Tìm kiếm theo khoảng cách
String disQry = "select * from `" + domain + "` where Distance > '13.1'";
SelectRequest selectRequest = new SelectRequest(disQry);
for (Item item : sdb.select(selectRequest).getItems()) {
 System.out.println("Race Name: " + item.getName());
}

Chắc chắn, race trả về là Race_01, chính xác là: 26,2 lớn hơn 13,1, cả theo toán học lẫn theo từ điển. Nhưng hãy xem điều gì sẽ xảy ra khi tôi thêm một race dài thực sự để hòa vào:

Liệt kê 7. Cuộc đua siêu Ma-ra-tông ở Leesburg
List<ReplaceableItem> data3 = new ArrayList<ReplaceableItem>();

data3.add(new ReplaceableItem().withName("Race_03").withAttributes(
   new ReplaceableAttribute().withName("Name").withValue("Leesburg Ultra Marathon"),
   new ReplaceableAttribute().withName("Distance").withValue("103.1")));

sdb.batchPutAttributes(new BatchPutAttributesRequest(domain, data3));

Trong Liệt kê 7, tôi đã thêm một race có khoảng cách là 103,1. Khi tôi chạy lại truy vấn trong Liệt kê 6, hãy đoán xem điều gì xảy ra ở đây? Đúng, sự thật là: 103,1, nói theo từ điển, là thấp hơn so với 13,1, tức là không lớn hơn. Đó là lý do tại sao (nếu bạn đang theo dõi ở nhà), bạn không thấy có liệt kê về cuộc đua siêu Ma-ra-tông ở Leesburg!

Bây giờ chúng ta hãy xem điều gì sẽ xảy ra nếu tôi chạy một truy vấn khác để tìm kiếm các cuộc đua ngắn hơn, như thể hiện trong Liệt kê 8:

Liệt kê 8. Hãy xem những gì sẽ xuất hiện!
String disQry = "select * from `" + domain + "` where Distance < '13.1'";
SelectRequest selectRequest = new SelectRequest(disQry);
for (Item item : sdb.select(selectRequest).getItems()) {
 System.out.println("Race Name: " + item.getName());
}

Việc chạy truy vấn trong Liệt kê 8 sẽ mang đến một kết quả đáng ngạc nhiên. Tuy nhiên, khi biết rằng thực hiện các tìm kiếm theo từ điển, thì đúng là cuộc đua siêu Ma-ra-tông ở Leesburg (hư cấu) không có trong danh sách của bạn! — dù bạn đang tìm kiếm một cuộc đua ngắn.


Tìm kiếm từ điển

Tìm kiếm từ điển có thể gây ra các vấn đề khi tìm kiếm dữ liệu số (bao gồm cả ngày tháng), nhưng vẫn còn một cách để khắc phục vấn đề tìm kiếm theo khoảng cách là đệm thêm các số cho các thuộc tính khoảng cách.

Cuộc đua dài nhất của tôi hiện nay là 103,6 dặm (mặc dù về phần mình tôi chưa bao giờ đến gần với việc chạy đua ở khoảng cách này), đọc theo từ điển là ba chữ số bên trái dấu thập phân. Vì vậy, tôi sẽ chỉ đệm thêm vào các race còn lại với các số không đằng trước, làm cho tất cả các race có cùng số lượng ký tự. Việc thêm vào như vậy sẽ làm cho các tìm kiếm theo khoảng cách của tôi bắt đầu hoạt động.

Hình 1 là ảnh chụp màn hình từ Công cụ SDB (SDB Tool), một add-on của Firefox để truy vấn và cập nhật trực quan các miền cơ sở dữ liệu của Simple DB (xem phần Tài nguyên):

Hình 1. Đệm thêm các giá trị khoảng cách
Một ảnh chụp màn hình hiển thị các cuộc thi chạy và các giá trị khoảng cách như được hiển thị bằng SDB Tool

Như bạn thấy đấy, tôi đã thêm một số không vào cả hai giá trị khoảng cách của Race_01Race_02. Trong khi điều này có lẽ không có nhiều ý nghĩa lắm nhưng nó sẽ làm cho việc tìm kiếm dễ dàng hơn rất nhiều. Như vậy, trong Hình 2, bạn có thể thấy rằng tôi đã ban hành một tìm kiếm các race có khoảng cách nhỏ hơn 020,0 dặm (hoặc chỉ đơn giản là 20 dặm) và hãy xem những gì cuối cùng — và chính xác — xuất hiện:

Hình 2. Việc tìm kiếm có đệm thêm giải quyết vấn đề này
Một ảnh chụp màn hình hiển thị các kết quả truy vấn thành công trong SDB Tool

Với một chút nhìn xa thấy trước, không khó để vượt qua điều dường như là một yếu tố hạn chế của các tìm kiếm từ điển. Nếu việc đệm thêm không phải là sở trường của bạn, thì tùy chọn khác là lọc phần ứng dụng của vấn đề. Có nghĩa là, bạn có thể duy trì các số nguyên của mình như là các số nguyên bình thường và lọc vấn đề khoảng cách ngay khi bạn đã nhận được một bộ sưu tập các mục chưa lọc từ Amazon — đó là ban hành câu lệnh select * trên tất cả các mục. Mặc dù, cách tiếp cận này có thể tốn kém, nếu bạn có rất nhiều dữ liệu.


Các mối quan hệ trong SimpleDB

Không khó thiết lập các mối quan hệ trong SimpleDB. Theo khái niệm, bạn có thể dễ dàng tạo ra một thuộc tính trên một race được gọi của mục runner và sau đó đặt một tên (như là Race_01) cho nó. Hơn nữa, thậm chí bạn hoàn toàn có khả năng duy trì một bộ sưu tập về các tên race trong giá trị này. Điều ngược lại cũng đúng: Bạn có thể dễ dàng duy trì một bộ sưu tập các tên của người chạy thi trong một miền race (được hiển thị trong Liệt kê 9). Chỉ cần nhớ là: Trong thực tế bạn không thể nối hai miền thông qua ngôn ngữ truy vấn của Amazon; bạn sẽ phải tự mình làm điều đó.

Liệt kê 9. Tạo một miền và hai runner
sdb.createDomain(new CreateDomainRequest("Runners"));

List<ReplaceableItem> runners = new ArrayList<ReplaceableItem>();

runners.add(new ReplaceableItem().withName("Runner_01").withAttributes(
   new ReplaceableAttribute().withName("Name").withValue("Sally Smith")));

runners.add(new ReplaceableItem().withName("Runner_02").withAttributes(
	new ReplaceableAttribute().withName("Name").withValue("Richard Bean")));

sdb.batchPutAttributes(new BatchPutAttributesRequest("Runners", runners));

Một khi tôi đã tạo ra một miền Runners và đã thêm những runner vào miền đó, tôi có thể cập nhật một race hiện tại và thêm những runner của tôi ở đó, như trong Liệt kê 10:

Liệt kê 10. Cập nhật một race có hai runner
races.add(new ReplaceableItem().withName("Race_01").withAttributes(
  new ReplaceableAttribute().withName("Name").withValue("Charlottesville Marathon"),
  new ReplaceableAttribute().withName("Distance").withValue("026.2"),
  new ReplaceableAttribute().withName("Runners").withValue("Runner_01"),
  new ReplaceableAttribute().withName("Runners").withValue("Runner_02")));

Điểm mấu chốt là ở chỗ có thể có các mối quan hệ, nhưng bạn sẽ phải quản lý chúng ở bên ngoài SimpleDB. Ví dụ, nếu bạn cũng muốn nhận được các tên đầy đủ của tất cả runner trong Race_01, thì bạn thêm các tên đó vào một truy vấn rồi ban hành các truy vấn (có hai truy vấn trong trường hợp này, vì Race_01 chỉ có hai giá trị thuộc tính) dựa vào miền runner để nhận được các câu trả lời.


Xóa các hoạt động

Xóa những thứ bạn đã bày ra là một điều quan trọng, vì vậy tôi sẽ kết thúc bằng một việc xóa nhanh mọi thứ bằng cách sử dụng SDK của Amazon. Các hoạt động xóa không khác nhiều so với việc tạo ra các dữ liệu và truy vấn nó; bạn chỉ cần tạo ra các kiểu Request và ban hành các câu lệnh xóa.

Việc xóa Race_01 khá dễ dàng, như trong Liệt kê 11:

Liệt kê 11. Ban hành một câu lệnh xóa trong SimpleDB
sdb.deleteAttributes(new DeleteAttributesRequest(domain, "Race_01"));

Nếu tôi đã sử dụng một câu lệnh DeleteAttributesRequest để xóa một mục, bạn nghĩ tôi cần sử dụng câu lệnh nào để xóa một tên miền? Bạn đã đoán được: đó là một câu lệnh DeleteDomainRequest!

Liệt kê 12. Xóa một miền trong SimpleDB
sdb.deleteDomain(new DeleteDomainRequest(domain));

Vẫn chưa kết thúc!

Chúng ta vẫn chưa tìm hiểu xong SimpleDB của Amazon với những đám mây, nhưng bây giờ chúng ta đã thực hiện xong với Amazon SDK. Amazon SDK là chức năng và có thể có ích ở một mức độ nào đó, nhưng nếu bạn muốn mô hình hóa mọi thứ — giống như các cuộc đua và những vận động viên thực sự— bạn có thể cần sử dụng một cái gì đó giống như JPA. Trong Phần 2 tới, chúng ta sẽ tìm hiểu điều gì sẽ xảy ra khi chúng ta kết hợp JPA với SimpleDB.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Amazon SDK: Tải về SDK của Amazon và bắt đầu sử dụng cơ sở hạ tầng Amazon Web Services. (Bạn sẽ phải tạo một tài khoản với Amazon nếu bạn vẫn chưa có).
  • SDB Tool: Một trình cắm thêm của giao diện người dùng đồ họa của Firefox làm cho việc sử dụng Amazon SimpleDB dễ dàng hơn.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Công nghệ Java, Cloud computing
ArticleID=859713
ArticleTitle=Phát triển Java 2.0: Lưu trữ đám mây với SimpleDB của Amazon, Phần 1
publish-date=02272013