Thực nghiệm giải pháp sử dụng Datastore

Một phần của tài liệu Điện toán đám mây và giải pháp lưu trữ dữ liệu trong doanh nghiệp vừa và nhỏ (Trang 64 - 73)

- Máy chủ)

3.3.2.Thực nghiệm giải pháp sử dụng Datastore

Trong phần này chúng ta sẽ xây dựng ứng dụng GAE đơn giản để lưu trữ dữ liệu có sơ đồ quan hệ sau:

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

+ ProductCategory: là bảng lưu trữ loại sản phẩm, ví dụ như: Tivi, Tủ lạnh,

… Bảng này bao gồm các trường thông tin sau: - name: tên của loại sản phẩm,

- description: mô tả loại sản phẩm đó.

+ Product: là bảng lưu trữ một sản phẩm cụ thể. Ví dụ như: Tivi Samsung

LCD 31, iPad 2 GSM 16GB, … ProductCategory và Product có mối quan hệ một-nhiều. Bảng này gồm những trường thông tin sau:

- name: tên của sản phẩm,

- categoryName: tên của loại sản phẩm, - price: giá,

- categoryID.

+ Customer: là bảng lưu trữ khách hàng đặt mua sản phẩm. Bảng này gồm

những trường thông tin sau: - name: tên khách hàng, - firstName, - lastName, - phone, - address, - city, - state, - zip, - email.

+ Order: lưu trữ thông tin về đơn đặt hàng của khánh hàng. Customer và Order có mối quan hệ một-nhiều. Bảng này gồm những trường thông tin sau:

- customerName: tên khách hàng, - status: trạng thái,

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 59 - city, - state, - zip, - customerID.

+ OrderedProduct: lưu trữ thông tin về sản phẩm được khách hàng chọn mua. Một đơn đặt hàng có thể có mua nhiều sản phầm, mỗi một sản phẩm được mua với một số lượng nhất định. Bảng này gồm những trường thông tin sau:

- orderID,

- productID (productName), - quantity: số lượng,

- price: giá khi mua.

Kiến trúc tổng quan của hệ thống thử nghiệm:

Giao diện người dùng được phát triển bằng Google Web Toolkit [3].

Như vậy chúng ta đã có sơ đồ cơ sở dữ liệu cho hệ thống thử nghiệm. Bây giờ chúng ta xây dựng các entities tương ứng với sơ đồ trên.

Bước 1: Xây dựng các entities:

+ ProductCategory:

Entity productCategory = new Entity("ProductCategory", name); productCategory.setProperty("description", description);

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

+ Product:

Entity product = new Entity("Product", productCategory.getKey()); item.setProperty("name", itemName);

item.setProperty("categoryName", categoryName); item.setProperty("price", price);

Trong đó là productCategory entity của loại sản phẩm (ProductCategory).

+ Customer: (adsbygoogle = window.adsbygoogle || []).push({});

Entity customer = new Entity("Customer", nickName); customer.setProperty("name", nickName);

customer.setProperty("firstName", firstName); customer.setProperty("lastName", lastName); customer.setProperty("phone", phone);

customer.setProperty("address", address); customer.setProperty("city", city);

customer.setProperty("state", state); customer.setProperty("zip", zip); customer.setProperty("eMail", email); + Order:

Entity customer = Customer.getSingleCustomer(customerName); Key customerkey = customer.getKey();

Entity order = new Entity("Order", customerkey); order.setProperty("customerName", customerName); order.setProperty("status", "Processed");

order.setProperty("shipTo", shipTo); order.setProperty("city", city); order.setProperty("state", state); order.setProperty("zip", zip);

Trong đó customerkey là object Key của entity customer.

+ OrderedProduct:

Entity orderedProduct = new Entity("OrderedProduct", order.getKey());

// key to string can be inserted instead of name, a better option

orderedProduct.setProperty("productName", productName); orderedProduct.setProperty("quantity", quantity);

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

61

orderedProduct.setProperty("orderID", String.valueOf(order.getKey().getId())); Trong đó order là object của entity Order.

Bước 2. Sử dụng hệ thống entities để xử lý dữ liệu trong ứng dụng của doanh

nghiệp: insert, update, delete, select.

+ Đưa một entity vào cache, đồng thời lưu vào Datastore. public static void persistEntity(Entity entity) { logger.log(Level.INFO, "Saving entity");

Key key = entity.getKey();

Transaction txn = datastore.beginTransaction(); try { datastore.put(entity); txn.commit(); } finally { if (txn.isActive()) { txn.rollback(); } else { addToCache(key, entity); } } }

datastore là một dịch vụ DatastoreService cho phép thao tác với Datastore.

Trong đoạn code trên, trước khi lưu entity, datastore khởi tạo một transaction (datastore.beginTransaction()), sau đó lưu entity vào Datastore (datastore.put(entity)), nếu entity được lưu thành công thì sẽ được đưa vào cache (addToCache(key, entity)). Để làm việc với cache, Google cung cấp dịch vụ MemcacheService. Truy vấn vào dịch vụ này bởi:

MemcacheService keycache =

MemcacheServiceFactory.getMemcacheService() Đưa entity vào cache:

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

logger.log(Level.INFO, "Adding entity to cache"); keycache.put(key, entity);

}

+ Xóa entity khỏi Datastore:

public static void deleteEntity(Key key) {

logger.log(Level.INFO, "Deleting entity"); (adsbygoogle = window.adsbygoogle || []).push({});

Transaction txn = datastore.beginTransaction(); try { datastore.delete(key); txn.commit(); } finally { if (txn.isActive()) { txn.rollback(); } else { deleteFromCache(key); } } }

Trước khi xóa entity, datastore khởi tạo một transaction. Sau khi xóa entity thành công thì xóa tiếp trong cache (deleteFromCache(key)).

Xóa entity trong cache:

public static void deleteFromCache(Key key) {

logger.log(Level.INFO, "Deleting entity from cache"); keycache.delete(key);

}

+ Truy vấn dữ liệu từ Datastore: Lấy entity từ datastore dựa trên key:

public static Entity findEntity(Key key) {

logger.log(Level.INFO, "Search the entity");

try {

Entity entity = getFromCache(key); if (entity != null) { return entity; } return datastore.get(key); } catch (EntityNotFoundException e) { return null; }

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

63

}

Khi truy vấn dữ liệu, đầu tiên kiểm tra xem entity đã có trong cache chưa (Entity entity = getFromCache(key)), nếu có trong cache rồi thì trả về

object entity lưu trong cache, nếu chưa có thì entity được lấy từ Datastore (return datastore.get(key)).

Lấy entity từ datastore dựa trên điều kiện:

public static Iterable<Entity> listEntities(String kind, String searchBy, String searchFor) {

logger.log(Level.INFO, "Search entities based on search criteria");

Query query = new Query(kind);

if (searchFor != null && !"".equals(searchFor)) {

query.addFilter(searchBy, FilterOperator.EQUAL, searchFor); }

PreparedQuery pq = datastore.prepare(query); return pq.asIterable();

}

Trong đoạn code trên, kind là tên loại entity cần tìm kiếm dữ liệu, searchBy là điều kiện search, còn searchFor là giá trị để search. Một object query được tạo ra để truy vấn dữ liệu.

Đoạn code trên tương đương với câu lệnh SQL sau:

SELECT * FROM kind WHERE searchBy = searchFor Ví dụ, nếu:

Kind = "Product"

searchBy = "categoryName" searchFor = "Tivi"

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ (adsbygoogle = window.adsbygoogle || []).push({});

SELECT * FROM Product WHERE categoryName = „Tivi‟

Bước 3: Sử dung BlobStore để thao tác với các dữ liệu dạng files: hình ảnh, âm thanh, files dữ liệu khác.

Tạo form để up files:

<form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">

<input type="file" name="myFile"> <input type="submit" value="Submit"> </form>

blobstoreService là object của dịch vụ BlobstoreService. BlobstoreService blobstoreService =

BlobstoreServiceFactory.getBlobstoreService()

Ở phía server, một servlet Upload (Upload extends HttpServlet) sẽ sử lý các files được upload lên:

Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);

List<BlobKey> blobKeys = blobs.get("myFile"); if (blobKeys == null) {

System.err.println("BlobKey: is NULL"); resp.sendRedirect("/");

} else {

for (BlobKey blobKey : blobKeys) {

String productImage = blobKey.getKeyString();

//Save product image name to datastore here.

Product.saveProductImage(productImage); }

}

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

65

Truy cập vào file này bằng cách tạo một servlet, servlet này dùng blobstoreService để truy cập vào file thông qua khóa của file:

BlobKey blobKey = new BlobKey(req.getParameter("productImage"));

blobstoreService.serve(blobKey, resp);

Một số giao diện của hệ thống thử nghiệm: + Tạo loại sản phẩm:

+ Tất cả các loại sản phẩm:

+ Các sản phẩm:

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

+ Danh sách đơn đặt hàng:

Một phần của tài liệu Điện toán đám mây và giải pháp lưu trữ dữ liệu trong doanh nghiệp vừa và nhỏ (Trang 64 - 73)