NƠI ĐẶT BANNER QUẢNG CÁO


Như bạn đã biết, để thực hiện tác động lên cơ sở dữ liệu khi lập trình với JDBC, ta có thể tạo ra đối tượng của các Interface StatementPreparedStatement và CallableStatement để tác động lên cơ sở dữ liệu (Ghi, xóa, sửa, khai thác thông tin, …). Tuy nhiên, mỗi khi có một nhu cầu cần tác động lên cơ sở dữ liệu là ta lại tiến hành tạo ra 1 connection, thực hiện tác động lên Database tại thời điểm tương ứng, sau đó đóng connection lại. Hãy tưởng tượng, với 1 chức năng nào đó của chương trình, ví dụ ghi thông tin của n người (Cụ thể thông tin của n=20 người) thì cũng vẫn cùng 1 công việc ghi thông tin, chương trình của ta sẽ tiến hành tạo lần lượt liên tiếp 20 connection để chuyển dữ liệu từ Client và ghi vào Database server. Nếu trong hệ thống mạng có nhiều máy tính cùng thực hiện công việc loại này tại 1 thời điểm thì sao nhỉ ????; có thể thấy ngay vấn đề đầu tiên mà Database server của chúng ta gặp phải chính là lưu trượng truyền về cho Database Server tăng lên đáng kể (Increase traffic)

Lưu lượng truyền thông giữa Client và Database server có thể rất lớn
Chưa kể đến giả thiết một nhân viên nào đó sau khi nhập thông tin tới người thứ 3 thì chợt nhớ ra thông tin của những người trước đó mình đã nhập không hoàn toàn chính xác, cần đều chỉnh lại, vậy là lại tạo Connection, đọc dữ liệu từ Database lên, cho phép điều chỉnh thông tin và lại ghi trở lại, rõ ràng việc định hướng cho việc phục hồi và điều chỉnh thông tin cần phải tính tới trong chương trình. Cách làm việc chủa chương trình như giả thiết ở trên sẽ tạo ra những khó khăn có thể là rất lớn trong việc định hướng và phát triển ứng dụng, hơn nữa hiệu quả không cao trong quá trình thực thi ứng dụng tại Client.
Batch Update là một kỹ thuật mà Java cho phép chương trình có thể thực thi đồng thời nhiều lệnh để tác động lên Database chỉ với 1 Connection. Trong chương trình, bạn có thể tạo ra 1 Connectiongắn liền với 1 Statement Object (Hoặc PreparedStatement, CallableStatement), sau đó tích hợp các lệnh cần thiết trước khi tác động lên Database. Khi đã hội đủ điều kiện (VD: Người dùng sau khi nhập dữ liệu, rà soát lại tất cả các thông tin và chắc chắn muốn ghi lại những thay đổi trong quá trình làm việc của mình) thì tiến hành chọn chức năng lệnh phù hợp, lúc này Connection mới thực sự tạo ra và chuyển thông tin đến cho Database Server.
Ta thấy kỹ thuật này thể hiện ưu điểm đầu tiên chính là giúp lập trình viên có thể định hướng và triển khai chức năng lệnh của chương trình cho mục đích làm giảm lưu lượng truyền thông đến Database tốt hơn, hơn nữa việc thực thi và xử lý thông tin khi có nhu cầu điều chỉnh ngay tại Client với dữ liệu đang có trong bộ nhớ sẽ làm hiệu xuất thực thi ứng dụng tại Client tốt hơn, thuật toán phục vụ cho khả năng hỗ trợ hoàn tác trong quá trình làm việc đối với người dùng sẽ đơn giản hơn rất nhiều.
Trong bài viết này, tôi muốn mô tả kỹ thuật Batch Update lần lượt cho cả 3 loại đối tượng của các interface StatementPreparedStatement và CallableStatement với mong muốn các bạn có thể hiểu nhiều hơn một chút về 3 loại đối tượng trên, biết cách chọn ra giải pháp thích hợp cho các chức năng lệnh của ứng dụng mà mình sẽ triển khai khi lập trình với JDBC của Java
Batch Update với Statement, PreparedStatement và CallableStatement
Trong phần minh họa này, tôi chỉ minh họa với 1 tình huống duy nhất là chương trình của chúng ta sẽ tiến hành phần nhập dữ liệu cho table ttNguoiQuen trong Database qlLichHen. Tôi nhắc lại hình mô tả Database qlLichHen thông qua hình dưới đây để các bạn tiện theo dõi cho phần mã lệnh ở những ví dụ minh họa phía dưới.
Giả thiết chúng ta sẽ nhập thông tin cho 3 người thuộc 3 nhóm người : Người thân (maPN:NT), Bạn học (maPN:HT) và Đối tác kinh doanh (maPN:DT). Như vậy theo giả thiết này, bạn phải có tối thiểu thông tin của 3 phân nhóm lưu trữ trong table ttPhanNhom vì dữ liệu trong Table này đóng vai trò là PrimaryKey để thông tin trong table ttNguoiQuen tham chiếu tới (Nếu không có đủ 3 mã phân nhóm này thì khi thực thi phần Code ở phía dưới sẽ bị báo lỗi vì phần nhập dữ liệu của chúng ta sẽ vi phạm về ràng buộc toàn vẹn trong Database)
Tôi cũng giả sử ứng với table ttNguoiQuen, bạn đã tạo ra 1 lớp có tên là iNguoiQuen với các biến thành viên của lớp như mô tả dưới đây cùng các SetterGetter và constructor cần thiết:

    private String  _maNQ;
    private String  _hoNQ;
    private String  _tenNQ;
    private String  _maPN;
    private boolean  _gioiTinh;
    private Date   _ngaySinhNQ;
    private String  _soDD;
    private String  _soCD;
    private String  _EMailNQ;
    private String  _diaChiNQ;
Bây giờ, chúng ta sẽ bắt đầu thực hiện Batch update ứng với từng loại đối tượng đã đề cập
1 – Batch update sử dụng Statement object
Để sử dụng Batch Update với đối tượng của giao diện Statement, bạn phải nắm vững các bước cơ bản như sau:
Bước 1: Tắt chế độ Auto-Commit của connection đã tạo. Mặc nhiên, 1 Connection tạo ra trong JDBC sẽ có thuộc tính AutoCommit là true. Có nghĩa là ứng với 1 câu lệnh SQL thiết lập cho object tại thời điểm đó thì Connection object sẽ tự động thực thi để tác động đến Database mà không cần phải gọi lệnh commit của Connection đó. Ở đây, khi dùng kỹ thuật Batch Update thì lập trình viên muốn khi nào yêu cầu, các lệnh đã gắn cho Connection object mới được thực thi, vì thế Auto-Commit phải được thiết lập là false. Để làm điều này, bạn sẽ gọi phương thức setAutoCommit() của Connection đã tạo và truyền tham số là false. Cú pháp của phương thức này như sau

public void setAutoCommit(boolean mode) throws  SQLException
Bước 2: tạo 1 thể hiện của Statement thông qua phương thức CreateStatement() của Connection object đã tạo

public Statement createStatement() throws SQLException 
Bước 3: Tạo các Query string dạng SQL tương ứng với mỗi lệnh cần tác động lên Database và gắn vào đối tượng Statement thông qua phương thức addBatch của đối tượng này. Cú pháp của phương thức này mô tả như sau

public void addBatch(String strQuery) throws SQLException
Lưu ý :     Ở đây strQuery chỉ sử dụng những câu SQL dùng cho mục đích tác động lên Database như insert, update,… hoặc các câu SQL dạng DDL (Data Definition Language). Các lệnh dùng cho mục đích khai thác thông tin từ cơ sở dữ liệu như Select không dùng được với Batch Update
Bước 4: Gọi phương thức executeBatch() của Statement object thi hành (Mục đích biên dịch các câu lệnh SQL thành dạng thức mà DBMS có thể hiểu được trước khi gửi đi). Cú pháp của phương thức này như sau

public int[] executeBatch() throws SQLException
Chú thích: Phương thức này trả về kết quả là mảng các số nguyên mô tả cho trạng thái thực thi của từng lệnh SQL đã được gắn vào cho đối tượng trước đó. Nếu kết quả của phần tử tương ứng trong mảng số nguyên này có giá trị lớn hơn hoặc bằng 0 tức là lệnh đó đã thực thi thành công trên Database server
Bước 5: Gọi lệnh commit của Connection object để tác động trực tiếp lên Database, thực hiện các lệnh SQL đã gắn cho đối tượng Statement. (Trong chế độ Auto-Commit thì lập trình viên không cần phải gọi lệnh này, JDBC sẽ tự động thực thi ngay sau khi chúng ta gọi lệnhexecuteQuery hay executeUpdate của đối tượng). Cú pháp của lệnh commit như sau

public void commit() throws SQLException
Bước 6: Bước cuối cùng khá đơn giản, chỉ đơn thuần là xóa bỏ các lệnh đã gắn cho “Batch” củaStatement object (Cũng giống như làm xong thì dọn dep ấy mà !!!!)

public void clearBatch() throws SQLException
Trên đây tôi đã giới thiệu với bạn 6 bước cơ bản khi sử dụng kỹ thuật Batch update với đối tượng Statement của JDBC, dưới đây sẽ là đoạn code minh họa cho kỹ thuật này trong việc nhập thông tin cho đồng thời 3 người quen của chúng ta vào table ttNguoiQuen trong cơ sở dữ liệu qlLichHen
Trong lớp View của chương trình, bạn tạo ra 1 JMenuItem và gắn cho sự kiện của lệnh actionPerformed này đoạn code để gọi phương thức trên của lớp connectSQL như sau
Khi chương trình thi hành, bạn chọn lệnh đã tạo trong menu. Nếu thành công, bạn mở giao tablettNguoiQuen trong Database sẽ thấy thông tin của 3 người quen vừa nhập được như sau
2 – Batch update sử dụng PreparedStatement object
Kỹ thuật Batch update với đối tượng PreparedStatement được thể hiện thông qua 5 bước cơ bản như sau
Bước 1: Tắt chế độ Auto-Commit của connection đã tạo. Giống như đã đề cập ở trên
Bước 2: tạo 1 query string với các tham số cần thiết (nếu có) và khởi tạo đối tượngPreparedStatement thông qua phương thức prepareStatement của Connection object
Bước 3: tiến hành truyền tham số cho query string đã tạo ở bước 2 rồi gọi lệnh addBatch để đóng gói thông tin tương ứng với mỗi đối tượng cần tác động lên Database
Bước 4: Biên dịch trước khi tác động lên Database bằng cách gọi lệnh executeBatch()
Bước 5: Gọi lệnh commit để thực thi yêu cầu đối với Database
Các bước của kỹ thuật Batch update đối với PreparedStatement object được minh họa thông qua đoạn code sau (phương thức này tôi tạo trong lớp connectSQL)
Trong chương trình, ta sẽ gán dữ liệu là thông tin của những người quen cần nhập cho 1 ArrayList sau đó gọi phương thức đã tạo ở trên và truyền ArrayList chứa thông tin người quen cho nó
3 – Batch update sử dụng CallableStatement object
Các bước để sử dụng kỹ thuật Batch update đối với CallableStatement khá giống với PreparedStatement, chỉ khác ở 2 điểm.
-          do CallableStatement dùng để gọi thực thi 1 Store Procedure nên trước khi thực hiện kỹ thuật Batch Update ta phải có sẵng 1 stored procedure trong Database
-          Cú pháp để truyền cho Query string khi tạo đối tượng CallableStatement là lệnh gọi thủ tục theo quy định của Java, không giống như SQL thông thường.
Các bước sử dụng Batch update với đối tượng loại này mô tả như sau:
Bước 1: Tắt chế độ Auto-Commit của connection đã tạo. Giống như đã đề cập ở trên
Bước 2: tạo 1 query string với các tham số cần thiết (nếu có) và khởi tạo đối tượngCallableStatement thông qua phương thức prepareCall của Connection object
Bước 3: tiến hành truyền tham số cho query string đã tạo ở bước 2 rồi gọi lệnh addBatch để đóng gói thông tin tương ứng với mỗi đối tượng cần tác động lên Database
Bước 4: Biên dịch trước khi tác động lên Database bằng cách gọi lệnh executeBatch()
Bước 5: Gọi lệnh commit để thực thi yêu cầu đối với Database
Đương nhiên trước khi thực hiện batch update cho đối tượng loại này, bạn cũng phải tạo ra 1 store procedure để phục vụ cho việc nhập dữ liệu cho table ttNguoiQuen trên database qlLichHen. Phần code minh họa cho tạo thủ tục của tôi như mô tả dưới đây (Cú pháp tạo Stored procedure xem như các bạn đã biết, tôi chỉ minh họa phần code, không giải thích về cú pháp tạo Stored procedure trong bài viết này)

create
 procedure nhapTTNQ
      @manq varchar(7),
      @honq nvarchar(30),
      @tennq nvarchar(30),
      @mapn nvarchar(30),
      @gioitinh bit,
      @ngaysinh datetime,
      @sodd nvarchar(10),
      @socd nvarchar(10),
      @email nvarchar(35),
      @diachi nvarchar(90)
As      insert into ttNguoiQuen (maNQ, tenNQ, hoNQ, maPN, gioiTinh, 
                               ngaySinhNQ, soDD, soCD, eMailNQ, diaChiNQ)               values (@manq, @tennq, @honq, @mapn, @gioitinh, 
                               @ngaysinh, @sodd, @socd, @email, @diachi)
Trong lớp connectSQL ta tạo ra thủ tục sau
Trong tình huống này, việc gọi thủ tục nhapTT2NQ trong đoạn code trên thực thi cũng giống như ví dụ đối với PreparedStatement. Các bạn hãy thực hiện lấy để kiểm tra kết quả

0 nhận xét:

Đăng nhận xét