2.3.3.1. Kết nối đến cơ sở dữ liệu VoltDB
Bước đầu của chương trình là kết nối đến VoltDB cơ sở dữ liệu. Thực hiện bằng cách :
1. Định nghĩa cấu hình kết nối
2. Tạo một thể hiện (instance) của lớp VoltDB Client 3. Gọi phương thức createConnection
org.voltdb.client.Client client = null; ClientConfig config = null;
config = new ClientConfig("username","password"); client = ClientFactory.createClient(config);
2.3.3.2. Triệu gọi thủ tục
Khi tạo kết nối, gọi thủ tục sử dụng phương thức callProcedure, truyền tên thủ tục và tham số:
VoltTable[] results;
results = client.callProcedure("LookupFlight",origin,dest,departtime).getResults();
2.3.3.3. Triệu gọi thủ tục không đồng bộ
Triệu gọi thủ tục đồng bộ có ích bởi vì nó đơn giản logic của chương trình. Ứng dụng Client phải đợi thủ tục hoàn thành mới thực hiện thủ tục khác. Tuy nhiên, cho ứng dụng với hiệu năng cao và tăng băng thông cao, cách tốt nhất là tổ chức hàng đợi cho thủ tục bằng cơ chế không đồng bộ.
Để gọi thủ tục không đồng bộ, sử dụng phương thức callProcedure với một tham số đặc biệt, đó là chỉ thị callback có khả năng thông báo khi thủ tục hoàn thành hoặc có lỗi xuất hiện. Ví dụ gọi một thủ tục thêm khách hàng mới một cách không đồng bộ :
client.callProcedure(new MyCallback(), `"NewCustomer", firstname, lastname, custID};
Thủ tục callback (trong ví dụ này là MyCallback) được gọi mỗi khi một thủ tục hoàn thành. Nó được truyền một cấu trúc ClientResponse, nó được trả lại bởi lời triệu gọi đồng bộ. ClientResponse chứa các thông tin về kết quả thực hiện. Cụ thể, phương getStatus và getResults nhằm xác định thủ tục thành công hay không và ước lượng giá trị trả về của thủ tục :
static class MyCallback implements ProcedureCallback { @Override
public void clientCallback(ClientResponse clientResponse) {
if (clientResponse.getStatus() != ClientResponse.SUCCESS) { System.err.println(clientResponse.getStatusString());
} else {
myEvaluateResultsProc(clientResponse.getResults());}}}
2.3.3.4. Điều khiển lỗi
1. Phiên dịch các lỗi thực thi
Nếu một lỗi xuất hiện trong thủ tục, VoltDB bắt lỗi và trả lại thông tin cho ứng dụng như là một phần của lớp ClientResponse.
Lớp ClientResponse cung cấp nhiều phương thức giúp ứng dụng xác định liệu thủ tục thành công hay không và nguyên nhân nào gây lỗi. Hai phương thức quan trọng nhất getStatus() và getStatusString().
Phương thức getStatus() cho biết liệu thủ tục thành công hay không và kiểu lỗi nào xuất. Các giá trị của getStatus() là:
• CONNECTION_LOST — Mất kết nối mạng.
• GRACEFUL_FAILURE — Một lỗi xuất hiện và thủ tục được rollback. • SUCCESS — Thủ tục thành công.
• UNEXPECTED_FAILURE — Thủ tục lỗi.
• USER_ABORT — Thủ tục ném ra ngoại lệ UserAbort và được rollback.
2. Phiên dịch các lỗi khác
Các kiểu lỗi khác có thể xuất hiện nhưng ClientResponse không thông báo ngay lập tức. Những lỗi đó bao gồm :
Backpressure : Client sẽ phải đợi, thủ tục không thể đưa vào hàng đợi và ứng dụng không nhận được điều khiển sau khi backpressure được xóa bỏ. Lỗi này có thể xảy ra nếu ứng dụng Client đưa các thủ tục vào hàng đợi nhanh hơn tốc độ xử lý cơ sở dữ liệu Cluster
Lost Connection : Kết nối bị mất.
Exceptions in a Procedure Callback : Một lỗi xuất hiện trong thực hiện gọi ngược không đồng bộ sau khi thủ tục hoàn thành. Những ngoại lệ này cũng được bẫy bởi VoltDB client nhưng xuất hiện sau khi ClientResponse trả lại ứng dụng.
Trong mỗi trường hợp, một lỗi xảy ra và có thể bắt bởi client interface ở bên ngoài vòng đời thực thi của thủ tục bình thường. Nếu muốn ứng dụng của mình giải mã được các tình huống này, chúng ta cần tạo một listener, đó là một kiểu callback không đồng thời đặc biệt, giao tiếp này sẽ thông báo bất cứ khi nào lỗi xuất hiện.
Định nghĩa listener trước khi định nghĩa VoltDB client hoặc mở một kết nối. ClientStatusListener interface có 3 phương thức có thể cài đặt, tương ứng với 3 kiểu lỗi, connectionLost, backpressure, và uncaughtException. Khi khai báo ClientStatusListener, chúng ta thêm nó tới đối tượng ClientConfig.
Thực hiện thao tác theo đúng thứ tự, đảm bảo tất cả kết nối tới VoltDB sử dụng cùng cơ chế xác thực và sẽ thông báo trạng thái listener.
Ví dụ theo sau miêu tả :
Khai báo ClientStatusListener
Tạo Client với cấu hình cụ thể
ClientStatusListener mylistener = new ClientStatusListener()
{
@Override
public void connectionLost(String hostname, int connectionsLeft) {
System.out.printf("A connection to the database been lost. " + "There are %d connections remaining.\n", conectionsleft); }
@Override
public void backpressure(boolean status) {
System.out.println("Backpressure from the database " + "is causing a delay in processing requests."); }
@Override
public void uncaughtException(ProcedureCallback callback, ClientResponse r, Throwable e)
{
System.out.println("An error has occured in a callback " + "procedure. Check the following stack trace for details."); e.printStackTrace();
} }
ClientConfig myconfig = new ClientConfig("username", "password", mylistener);
2.3.3.5. Đóng kết nối
Khi một ứng dụng Client thực hiện xong tương tác với VoltDB, cần đóng kết. Điều này đảm bảo bất cứ giao dịch đang chờ nào được hoàn thành theo đúng trật tự. Có 2 bước đóng kết nối :
1.Gọi drain() để đảm bảo tất cả các cuộc gọi không đồng bộ được hoàn thành 2.Gọi close() để đóng tất cả các kết nối và giải phóng tài nguyên.