12
K thut “Batch update” trong JDBC Như bn đ bit, đ thc hin tc đng lên cơ s d liu khi lp trnh vi JDBC, ta c th to ra đi tưng ca cc Interface Statement, PreparedStatement v CallableStatement đ tc đng lên cơ s d liu (Ghi, xa, sa, khai thc thông tin, …). Tuy nhiên, mi khi c mt nhu cu cn tc đng lên cơ s d liu l ta li tin hnh to ra 1 connection, thc hin tc đng lên Database ti thi đim tương ng, sau đ đng connection li. Hy tưng tưng, vi 1 chc năng no đ ca chương trnh, v d ghi thông tin ca n ngưi (C th thông tin ca n=20 ngưi ) th cng vn cng 1 công vic ghi thông tin, chương trnh ca ta s tin hnh to ln lưt liên tip 20 connection đ chuyn d liu t Client v ghi vo Database server. Nu trong h thng mng c nhiu my tnh cng thc hin công vic loi ny ti 1 thi đim th sao nh ????; c th thy ngay vn đ đu tiên m Database server ca chng ta gp phi chnh l lưu trưng truyn v cho Database Server tăng lên đng k (Increase traffic) Lưu lưng truyn thông gia Client v Database server c th rt ln Chưa k đn gi thit mt nhân viên no đ sau khi nhp thông tin ti ngưi th 3 th cht nh ra thông tin ca nhng ngưi trưc đ mnh đ nhp không hon ton chnh xc, cn đu chnh li, vy l li to Connection, đc d liu t Database lên, cho php điu chnh thông tin v li ghi tr li, r rng vic đnh hưng cho vic phc hi v điu chnh thông tin cn phi tnh ti trong chương trnh. Cch lm vic cha chương trnh như gi thit trên s to ra nhng kh khăn c th l rt ln trong vic đnh hưng v pht trin ng dng, hơn na hiu qu không cao trong qu trnh thc thi ng dng ti Client. Batch Update l mt k thut m Java cho php chương trnh c th thc thi đng thi nhiu lnh đ tc đng lên Database ch vi 1 Connection. Trong chương trnh, bn c th to ra 1 Connection gn lin vi 1 Statement Object

Kỹ thuật “Batch update” trong JDBC

  • Upload
    banh-my

  • View
    22

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Kỹ thuật “Batch update” trong JDBC

Ky thuât “Batch update” trong JDBC

Như ban đa biêt, đê thưc hiên tac đông lên cơ sơ dư liêu khi lâp trinh vơi JDBC, ta co thê tao ra đôi tương cua cac Interface Statement, PreparedStatement va CallableStatement đê tac đông lên cơ sơ dư liêu (Ghi, xoa, sưa, khai thac thông tin, …). Tuy nhiên, môi khi co môt nhu câu cân tac đông lên cơ sơ dư liêu la ta lai tiên hanh tao ra 1 connection, thưc hiên tac đông lên Database tai thơi điêm tương ưng, sau đo đong connection lai. Hay tương tương, vơi 1 chưc năng nao đo cua chương trinh, vi du ghi thông tin cua n ngươi (Cu thê thông tin cua n=20 ngươi) thi cung vân cung 1 công viêc ghi thông tin, chương trinh cua ta se tiên hanh tao lân lươt liên tiêp 20 connection đê chuyên dư liêu tư Client va ghi vao Database server. Nêu trong hê thông mang co nhiêu may tinh cung thưc hiên công viêc loai nay tai 1 thơi điêm thi sao nhi ????; co thê thây ngay vân đê đâu tiên ma Database server cua chung ta găp phai chinh la lưu trương truyên vê cho Database Server tăng lên đang kê (Increase traffic)

Lưu lương truyên thông giưa Client va Database server co thê rât lơn

Chưa kê đên gia thiêt môt nhân viên nao đo sau khi nhâp thông tin tơi ngươi thư 3 thi chơt nhơ ra thông tin cua nhưng ngươi trươc đo minh đa nhâp không hoan toan chinh xac, cân đêu chinh lai, vây la lai tao Connection, đoc dư liêu tư Database lên, cho phep điêu chinh thông tin va lai ghi trơ lai, ro rang viêc đinh hương cho viêc phuc hôi va điêu chinh thông tin cân phai tinh tơi trong chương trinh. Cach lam viêc chua chương trinh như gia thiêt ơ trên se tao ra nhưng kho khăn co thê la rât lơn trong viêc đinh hương va phat triên ưng dung, hơn nưa hiêu qua không cao trong qua trinh thưc thi ưng dung tai Client.

Batch Update la môt ky thuât ma Java cho phep chương trinh co thê thưc thi đông thơi nhiêu lênh đê tac đông lên Database chi vơi 1 Connection. Trong chương trinh, ban co thê tao ra 1 Connection găn liên vơi 1 Statement Object (Hoăc PreparedStatement, CallableStatement), sau đo tich hơp cac lênh cân thiêt trươc khi tac đông lên Database. Khi đa hôi đu điêu kiên (VD: Ngươi dung sau khi nhâp dư liêu, ra soat lai tât ca cac thông tin va chăc chăn muôn ghi lai nhưng thay đôi trong qua trinh lam viêc cua minh) thi tiên hanh chon chưc năng lênh phu hơp, luc nay Connection mơi thưc sư tao ra va chuyên thông tin đên cho Database Server.

Ta thây ky thuât nay thê hiên ưu điêm đâu tiên chinh la giup lâp trinh viên co thê đinh hương va triên khai chưc năng lênh cua chương trinh cho muc đich lam giam lưu lương truyên thông đên Database tôt hơn, hơn nưa viêc thưc thi va xư ly thông tin khi co nhu câu điêu chinh ngay tai Client

Page 2: Kỹ thuật “Batch update” trong JDBC

vơi dư liêu đang co trong bô nhơ se lam hiêu xuât thưc thi ưng dung tai Client tôt hơn, thuât toan phuc vu cho kha năng hô trơ hoan tac trong qua trinh lam viêc đôi vơi ngươi dung se đơn gian hơn rât nhiêu.

Trong bai viêt nay, tôi muôn mô ta ky thuât Batch Update lân lươt cho ca 3 loai đôi tương cua cac interface Statement, PreparedStatement va CallableStatement vơi mong muôn cac ban co thê hiêu nhiêu hơn môt chut vê 3 loai đôi tương trên, biêt cach chon ra giai phap thich hơp cho cac chưc năng lênh cua ưng dung ma minh se triên khai khi lâp trinh vơi JDBC cua Java

Batch Update vơi Statement, PreparedStatement va CallableStatement

Trong phân minh hoa nay, tôi chi minh hoa vơi 1 tinh huông duy nhât la chương trinh cua chung ta se tiên hanh phân nhâp dư liêu cho table ttNguoiQuen trong Database qlLichHen. Tôi nhăc lai hinh mô ta Database qlLichHen thông qua hinh dươi đây đê cac ban tiên theo doi cho phân ma lênh ơ nhưng vi du minh hoa phia dươi.

Gia thiêt chung ta se nhâp thông tin cho 3 ngươi thuôc 3 nhom ngươi : Ngươi thân (maPN:NT), Ban hoc (maPN:HT) va Đôi tac kinh doanh (maPN:DT). Như vây theo gia thiêt nay, ban phai co tôi thiêu thông tin cua 3 phân nhom lưu trư trong table ttPhanNhom vi dư liêu trong Table nay đong vai tro la PrimaryKey đê thông tin trong table ttNguoiQuen tham chiêu tơi (Nêu không co đu 3 ma phân nhom nay thi khi thưc thi phân Code ơ phia dươi se bi bao lôi vi phân nhâp dư liêu cua chung ta se vi pham vê rang buôc toan ven trong Database)

Tôi cung gia sư ưng vơi table ttNguoiQuen, ban đa tao ra 1 lơp co tên la iNguoiQuen vơi cac biên thanh viên cua lơp như mô ta dươi đây cung cac Setter, Getter va constructor cân thiêt:

Page 3: Kỹ thuật “Batch update” trong JDBC

    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ơ, chung ta se băt đâu thưc hiên Batch update ưng vơi tưng loai đôi tương đa đê câp

1 – Batch update sư dung Statement object

Đê sư dung Batch Update vơi đôi tương cua giao diên Statement, ban phai năm vưng cac bươc cơ ban như sau:

Bươc 1: Tăt chê đô Auto-Commit cua connection đa tao. Măc nhiên, 1 Connection tao ra trong JDBC se co thuôc tinh AutoCommit la true. Co nghia la ưng vơi 1 câu lênh SQL thiêt lâp cho object tai thơi điêm đo thi Connection object se tư đông thưc thi đê tac đông đên Database ma không cân phai goi lênh commit cua Connection đo. Ơ đây, khi dung ky thuât Batch Update thi lâp trinh viên muôn khi nao yêu câu, cac lênh đa găn cho Connection object mơi đươc thưc thi, vi thê Auto-Commit phai đươc thiêt lâp la false. Đê lam điêu nay, ban se goi phương thưc setAutoCommit() cua Connection đa tao va truyên tham sô la false. Cu phap cua phương thưc nay như sau

public void setAutoCommit(boolean mode) throws  SQLException

Bươc 2: tao 1 thê hiên cua Statement thông qua phương thưc CreateStatement() cua Connection object đa tao

public Statement createStatement() throws SQLException

Bươc 3: Tao cac Query string dang SQL tương ưng vơi môi lênh cân tac đông lên Database va găn vao đôi tương Statement thông qua phương thưc addBatch cua đôi tương nay. Cu phap cua phương thưc nay mô ta như sau

public void addBatch(String strQuery) throws SQLException

Lưu y :     Ơ đây strQuery chi sư dung nhưng câu SQL dung cho muc đich tac đông lên Database như insert, update,… hoăc cac câu SQL dang DDL (Data Definition

Page 4: Kỹ thuật “Batch update” trong JDBC

Language). Cac lênh dung cho muc đich khai thac thông tin tư cơ sơ dư liêu như Select không dung đươc vơi Batch Update

Bươc 4: Goi phương thưc executeBatch() cua Statement object thi hanh (Muc đich biên dich cac câu lênh SQL thanh dang thưc ma DBMS co thê hiêu đươc trươc khi gưi đi). Cu phap cua phương thưc nay như sau

public int[] executeBatch() throws SQLException

Chu thich: Phương thưc nay tra vê kêt qua la mang cac sô nguyên mô ta cho trang thai thưc thi cua tưng lênh SQL đa đươc găn vao cho đôi tương trươc đo. Nêu kêt qua cua phân tư tương ưng trong mang sô nguyên nay co gia tri lơn hơn hoăc băng 0 tưc la lênh đo đa thưc thi thanh công trên Database server

Bươc 5: Goi lênh commit cua Connection object đê tac đông trưc tiêp lên Database, thưc hiên cac lênh SQL đa găn cho đôi tương Statement. (Trong chê đô Auto-Commit thi lâp trinh viên không cân phai goi lênh nay, JDBC se tư đông thưc thi ngay sau khi chung ta goi lênh executeQuery hay executeUpdate cua đôi tương). Cu phap cua lênh commit như sau

public void commit() throws SQLException

Bươc 6: Bươc cuôi cung kha đơn gian, chi đơn thuân la xoa bo cac lênh đa găn cho “Batch” cua Statement object (Cung giông như lam xong thi don dep ây ma !!!!)

public void clearBatch() throws SQLException

Trên đây tôi đa giơi thiêu vơi ban 6 bươc cơ ban khi sư dung ky thuât Batch update vơi đôi tương Statement cua JDBC, dươi đây se la đoan code minh hoa cho ky thuât nay trong viêc nhâp thông tin cho đông thơi 3 ngươi quen cua chung ta vao table ttNguoiQuen trong cơ sơ dư liêu qlLichHen

Page 5: Kỹ thuật “Batch update” trong JDBC

Trong lơp View cua chương trinh, ban tao ra 1 JMenuItem va găn cho sư kiên cua lênh actionPerformed nay đoan code đê goi phương thưc trên cua lơp connectSQL như sau

Page 6: Kỹ thuật “Batch update” trong JDBC

Khi chương trinh thi hanh, ban chon lênh đa tao trong menu. Nêu thanh công, ban mơ giao table ttNguoiQuen trong Database se thây thông tin cua 3 ngươi quen vưa nhâp đươc như sau

2 – Batch update sư dung PreparedStatement object

Ky thuât Batch update vơi đôi tương PreparedStatement đươc thê hiên thông qua 5 bươc cơ ban như sau

Bươc 1: Tăt chê đô Auto-Commit cua connection đa tao. Giông như đa đê câp ơ trên

Bươc 2: tao 1 query string vơi cac tham sô cân thiêt (nêu co) va khơi tao đôi tương PreparedStatement thông qua phương thưc prepareStatement cua Connection object

Bươc 3: tiên hanh truyên tham sô cho query string đa tao ơ bươc 2 rôi goi lênh addBatch đê đong goi thông tin tương ưng vơi môi đôi tương cân tac đông lên Database

Bươc 4: Biên dich trươc khi tac đông lên Database băng cach goi lênh executeBatch()

Bươc 5: Goi lênh commit đê thưc thi yêu câu đôi vơi Database

Cac bươc cua ky thuât Batch update đôi vơi PreparedStatement object đươc minh hoa thông qua đoan code sau (phương thưc nay tôi tao trong lơp connectSQL)

Page 7: Kỹ thuật “Batch update” trong JDBC

Trong chương trinh, ta se gan dư liêu la thông tin cua nhưng ngươi quen cân nhâp cho 1 ArrayList sau đo goi phương thưc đa tao ơ trên va truyên ArrayList chưa thông tin ngươi quen cho no

Page 8: Kỹ thuật “Batch update” trong JDBC

3 – Batch update sư dung CallableStatement object

Cac bươc đê sư dung ky thuât Batch update đôi vơi CallableStatement kha giông vơi PreparedStatement, chi khac ơ 2 điêm.

-          do CallableStatement dung đê goi thưc thi 1 Store Procedure nên trươc khi thưc hiên ky thuât Batch Update ta phai co săng 1 stored procedure trong Database

-          Cu phap đê truyên cho Query string khi tao đôi tương CallableStatement la lênh goi thu tuc theo quy đinh cua Java, không giông như SQL thông thương.

Cac bươc sư dung Batch update vơi đôi tương loai nay mô ta như sau:

Bươc 1: Tăt chê đô Auto-Commit cua connection đa tao. Giông như đa đê câp ơ trên

Bươc 2: tao 1 query string vơi cac tham sô cân thiêt (nêu co) va khơi tao đôi tương CallableStatement thông qua phương thưc prepareCall cua Connection object

Page 9: Kỹ thuật “Batch update” trong JDBC

Bươc 3: tiên hanh truyên tham sô cho query string đa tao ơ bươc 2 rôi goi lênh addBatch đê đong goi thông tin tương ưng vơi môi đôi tương cân tac đông lên Database

Bươc 4: Biên dich trươc khi tac đông lên Database băng cach goi lênh executeBatch()

Bươc 5: Goi 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 loai nay, ban cung phai tao ra 1 store procedure đê phuc vu cho viêc nhâp dư liêu cho table ttNguoiQuen trên database qlLichHen. Phân code minh hoa cho tao thu tuc cua tôi như mô ta dươi đây (Cu phap tao Stored procedure xem như cac ban đa biêt, tôi chi minh hoa phân code, không giai thich vê cu phap tao Stored procedure trong bai viêt nay)

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 tao ra thu tuc sau

Page 10: Kỹ thuật “Batch update” trong JDBC

Trong tinh huông nay, viêc goi thu tuc nhapTT2NQ trong đoan code trên thưc thi cung giông như vi du đôi vơi PreparedStatement. Cac ban hay thưc hiên lây đê kiêm tra kêt qua

Nguồn : Đua ca- bodua.vn