CHƯƠNG 4. SỬ DỤNG DATASTORE CỦA GAE TRÊN NGÔN NGỮ JAVA

Một phần của tài liệu Vai trò của điện toán lưới đối với điện toán đám mây xây dựng ứng dụng web trên nền GAE (Trang 67)

Môi trường App Engine cung cấp một vài lựa chọn cho việc lưu trữ dữ liệu như : •Google Cloud SQLcung cấp một dịch vụ cơ sở dữ liệu SQL quan hệ, dựa trên hệ quản trị cơ sở dữ liệu quen thuộc là MySQL.

Google Cloud Storagecung cấp một dịch vụ lưu trữ cho các đối tượng và file với kích cỡ lên tới terabyte.

Datastore cung cấp một kho dữ liệu đối tượng mà không có tính lược đồ NoSQL.

Trong báo cáo này, chúng tôi đi tìm hiểu và sử dụng về dạng cơ sở dữ liệu Datastore bởi đây là một loại dữ liệu mới, chưa được phổ biến và có nhiều ưu điểm mà hệ thống cơ sở dữ liệu của GAE gần đây đã đưa vào sử dụng. Tiếp theo là phần cấu hình đối với đặc tả JPA để có thể sử dụng theo kỹ thuật này đối với Datastore.

4.1. Làm việc với Entity, Key và Property

Datastore được hiểu tốt nhất như là một cơ sở dữ liệu đối tượng. Một đối tượng trong datastore được biết điến như là một entity.

Một entity có một cái key (khóa) để phân biệt đối tượng duy nhất trong toàn bộ hệ thống. Nếu như ta có khóa, ta có thể lấy được một entity một cách nhanh chóng. Các key có thể được lưu trữ như là dữ liệu trong các entity, như để tạo ra mộ cái tham chiếu từ mộ entity này tới entity khác. Một key có một số phần sau đây:

+ Một phần của key là ID của ứng dụng, nó đảm bảo rằng không có cái key nào khác có thể va chạm với các entity của bất kỳ ứng dụng nào khá. Nó cũng đảm bảo rằng không có một ứng dụng nào có thể truy cập vào dữ liệu ứng dụng của ta và ngược lại.

+ Một phần quan trọng nữa của key là loại. Một loại của entity phân loại các entity cho các mục đích truy vấn và để đảm bảo cho tính duy nhất của phần còn lại của key.Ví dụ, Một ứng dụng mua sắm có thể thể thiện một hóa đơn khách hàng với một entity của loại “Order”. Ứng dụng chỉ ra loại cụ thể khi nó tạo entity. Key cũng chứa

một entity ID. Cái này có thể là một chuỗi ký tự tùy ý theo quy định của ứng dụng hoặc nó có thể được tạo một cách tự động bởi datastore. API gọi một entity ID hoặc là thông qua một key hoặc một ID, nhưng không cả hai.

Các tên của key được gán bởi app là các chuỗi, trong khi các ID được gán bở hệ thống là những loại số nguyên (integer). Các ID thường được gán một cách tăng dần. Một khi một entity đã được tạo, key của nó không thể thay đổi.Cái này áp dụng cho tất cả các phần của key của nó, bao gồm loại và tên key hoặc ID.

Dữ liệu cho entity được lưu trữ trong một hoặc nhiều property. Mỗi property có một cái tên và ít nhất một giá trị. Mỗi giá trị làm một trong số một vài kiểu dữ liệu được hỗ trợ, như là string, integer, date-time hoăc là null.

4.2 Sử dụng Entity

4.2.1. Lấy một entity thông qua key

Đưa vào một key cho một entity, ta có thể hoàn toàn lấy được một entity từ datastore.

Dùng API của Java, ta có thể lấy một entity dựa vào key của nó, sử dụng một thể hiện Datastore. Thể hiện này cung cấp một phương thức get() nhận một key để lấy ra một entity.

DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); Entity e1 = ds.get(k1);

Chúng ta cũng có một cách khác để lấy ra được một entity thông qua đối tượng query như sau :

+ Khai báo một Query trả về chỉ các key, gọi phương thức setKeysOnly() trên đối tượng Query:

Query q = new Query("Book"); q.setKeysOnly();

Khi một query trả về một tập hợp chỉ các key, các kết quả của query là các đối tượng Entity không có bất kỳ tập property nào. Ta có thể lấy key thừ những đối tượng này bằng việc dùng phương thức Key().

PreparedQuery pq = ds.prepare(q); for (Entity result : pq.asIterable()) { Key k = result.getKey();

// ... }

4.2.2 Lưu entity

Sử dụng phương thức put() của thể hiện DatastoreService lưu một entity hoặc một mảng entity :

DatastoreService db = DatastoreServiceFactory.getDatastoreService(); db.put(e)

db.put([e1, e2, e3])

4.2.3 Xóa entity

Sử dụng phương thức delete() của thể hiện DatastoreService lưu một entity hoặc một mảng entity :

DatastoreService db = DatastoreServiceFactory.getDatastoreService(); db.delete (e)

db.delete ([e1, e2, e3])

4.3. Sử dụng JPA với Datastore

Việc tạo entity có thuộc tính động mang lại những lợi ích như ta hoàn toàn thoải mái định nghĩa kiểu dữ liệu, hoặc có thể thay đổi số lượng thuộc tính. Thế nhưng ta phải tự định nghĩa ra cơ chế để có thể không nhầm lẫn giữa các kiểu dữ liệu của các thuộc tính động do chính ta tạo ra. Bạn có thể biết thuộc tính x của thể hiện A kiểu integer nhưng chưa chắc thuộc tính x của thể hiện B là kiểu integer mặc dù A và B là 2 thể hiện của cùng 1 loại. Datastore không có cơ chế kiểm tra dùm cho bạn.

4.3.1. Cấu hình

Chúng ta cần tạo file persistence.xml trong thư mục war/WEBINF/classes/META- INF/:

<?xml version="1.0" encoding="UTF-8"?>

<persistencexmlns="http://java.sun.com/xml/ns/persistence"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/persistence_1_0.xs" version="1.0">

<persistence-unitname="transactions-optional"> <provider>

org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider

</provider> <properties>

<propertyname="datanucleus.NontransactionalRead"

value="true"/>

<propertyname="datanucleus.NontransactionalWrite"

value="true"/>

<propertyname="datanucleus.ConnectionURL"value="appengine"/> </properties>

<!--cấu hình chế độ đọc và thời gian đọc ghi dữ liệu: -->

<propertyname="datanucleus.appengine.datastoreReadConsistency"

value="EVENTUAL"/>

<propertyname="javax.persistence.query.timeout"value="5000"/> <propertyname="datanucleus.datastoreWriteTimeout"value="10000"/> </persistence-unit>

Và chúng ta cũng có thể có nhiều thẻ <persistence-unit> trong file cấu hình, và sử dụng phần cấu hình nào tùy thuộc vào thuộc tính name mà ta khai báo khi tạo đối tượng EntityManagerFactory:

EntityManagerFactory emf =

Persistence.createEntityManagerFactory("transactions-optional");

4.3.2. Các truy vấn

Ví dụ tạo ra entity loại “Employee” theo kiểu JPA:

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import com.google.appengine.api.datastore.Key; @Entity publicclass Employee { @Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Key key;

private String firstName;

private String lastName;

private Date hireDate;

private Address address;

//các phương thức get…() set…()

public Key getKey() {}

publicvoid setKey(Key key) {} }

Lưu một đối tượng

import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; EntityManagerFactory emf = Persistence.createEntityManagerFactory("transactions-optional"); EntityManager em = emf.createEntityManager();

Employee employee = newEmployee("Tien", "Vo", new Date());

try{

em.persist(employee); }finally{

em.close(); }

Tìm một đối tượng

Sử dụng phương thức find của tối tượng Employee

EntityManagerFactory emf =

Persistence.createEntityManagerFactory("transactions-optional"); EntityManager em = emf.createEntityManager();

Employee e =em.find(Employee.class, k);

hay:

Employee e =em.find(Employee.class,"demoKey");

Xóa một đối tượng

Sử dụng phương thức remove của tối tượng Employee

EntityManagerFactory emf =

Persistence.createEntityManagerFactory("transactions-optional"); EntityManager em = emf.createEntityManager();

CHƯƠNG 5. PHÁT TRIỂN ỨNG DỤNG WEB TRÊN NỀN

Một phần của tài liệu Vai trò của điện toán lưới đối với điện toán đám mây xây dựng ứng dụng web trên nền GAE (Trang 67)