De cuong lap trinh mang

Màu nền
Font chữ
Font size
Chiều cao dòng

Phần III - Lập trình Socket cho giao thức TCP và Lập trình ứng dụng cho giao thức UDP.

Câu 1: Viết chương trình Client và Server theo giao thức UDP trong đó Client gửi cho Server số nguyên dương a, Server gửi về cho Client bình phương của a.

Client:

public class De1Cau3Client {

    public static void main(String[] args) throws IOException {

        BufferedReader red = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Nhập số cần gửi: ");

        String so = red.readLine();

        InetAddress inet = InetAddress.getByName("localhost");

        DatagramSocket sokda = new DatagramSocket(6868);

        DatagramPacket datp = new DatagramPacket(so.getBytes(),so.getBytes().length,inet,8888);

        sokda.send(datp);

        //nhận dữ liệu từ server

        Datp = new DatagramPacket(new byte[1000],1000);

        sokda.receive(datp);

        ByteArrayInputStream arr = new ByteArrayInputStream(datp.getData());

        BufferedReader redRecevie = new BufferedReader(new InputStreamReader(arr));

        System.out.println("Giá trị server trả về là: "+redRecevie.readLine());

    }

}

------------------

Server:

public class De1Cau3Server {

    public static void main(String[] args) throws SocketException, IOException {

        DatagramSocket sock= new DatagramSocket (8888);

        DatagramPacket datp= new DatagramPacket(new byte[1000],1000);

        sock.receive(datp);

        ByteArrayInputStream inut= new ByteArrayInputStream(datp.getData());

        BufferedReader red= new BufferedReader(new InputStreamReader(inut));

        String so = String.valueOf(Math.pow(Integer.parseInt(red.readLine().trim()),2));

        //gửi trả về client

        datp.setData(so.getBytes());

        datp.setLength(so.getBytes().length);

        sock.send(datp);

    }

}

Câu 2: Viết chương trình Client và Server theo giao thức TCP trong đó Client gửi cho Server số nguyên dương a, Server gửi về cho Client bình phương của a.

Client:

public class De2Cau3Client {

    public static void main(String[] args) throws IOException {

        Socket sock = new Socket("localhost",8888);

        BufferedReader red= new BufferedReader(new InputStreamReader(System.in));

        DataOutputStream dataout = new DataOutputStream(sock.getOutputStream());

        DataInputStream datain = new DataInputStream(sock.getInputStream());

        System.out.println("Nhập dữ liệu cần chuyển:");

        dataout.writeUTF(red.readLine());

        System.out.println("Dữ liệu server gửi về: "+datain.readUTF());

    }

}

-----------------

Server:

public class De2Cau3Server {

    public static void main(String[] args) throws IOException {

        ServerSocket svs = new ServerSocket(8888);

        Socket sk = svs.accept();

        DataInputStream datain = new DataInputStream(sk.getInputStream());

        DataOutputStream dataout = new DataOutputStream(sk.getOutputStream());

       ataout.writeUTF(String.valueOf(Math.pow(Integer.parseInt(datain.readUTF()),2)));

    }

}

Câu 3: Viết chương trình Client và Server theo giao thức UDP trong đó Client gửi cho Server một chuỗi, Server gửi trả về cho Client độ dài chuỗi đó.

Client:

public class De3Cau3Client {

    public static void main(String[] args) throws IOException {

        InetAddress inet = InetAddress.getByName("localhost");

        DatagramSocket sok = new DatagramSocket(888);

        BufferedReader red = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Nhập chuỗi ký tự cần chuyển :");

        byte databyte[] = red.readLine().getBytes();

        DatagramPacket datap = new DatagramPacket(databyte,databyte.length,inet,8888);

        sok.send(datap);

        //phần nhận

        datap = new DatagramPacket(new byte[1000],1000);

        sok.receive(datap);

        ByteArrayInputStream datain = new ByteArrayInputStream(datap.getData());

        BufferedReader redreceive = new BufferedReader(new InputStreamReader( datain));

        System.out.println("Dữ liệu Server trả về: "+redreceive.readLine());

    }

}

-----------------

Server:

public class De3Cau3Server {

    public static void main(String[] args) throws IOException {

        DatagramSocket dataso= new DatagramSocket(8888);

        DatagramPacket datp= new DatagramPacket( new byte[1000],1000);

        dataso.receive(datp);

        ByteArrayInputStream input= new ByteArrayInputStream(datp.getData());

        BufferedReader red= new BufferedReader(new InputStreamReader(input));

        String Chuoi=String.valueOf((red.readLine().trim()).length());        

        datp.setData(Chuoi.getBytes());

        datp.setLength(Chuoi.getBytes().length);

        dataso.send(datp);        

    }

}

Câu 4: Viết chương trình Client và Server theo giao thức TCP trong đó Client gửi cho Server một chuỗi, Server gửi trả về cho Client độ dài chuỗi đó.

Client:

public class De4Cau3Client {

    public static void main(String[] args) throws IOException {

        BufferedReader red= new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Nhập dãy các ký tự:");

        Socket sok= new Socket("localhost",8888);

        DataOutputStream dataout= new DataOutputStream(sok.getOutputStream());

        DataInputStream datain= new DataInputStream(sok.getInputStream());

        dataout.writeUTF(red.readLine());      

        System.out.println("Dữ liệu Server trả về: "+datain.readUTF());

    }

}

-----------------

Server:

public class De4Cau3Server {

    public static void main(String[] args) throws IOException{

        ServerSocket svs= new ServerSocket(8888);

        Socket sok= svs.accept();

        DataInputStream datain= new DataInputStream(sok.getInputStream());

        DataOutputStream dataout= new DataOutputStream(sok.getOutputStream());

        dataout.writeUTF(String.valueOf(datain.readUTF().length()));

    }

}

Phần IV - Xử lý cơ sở dữ liệu trong Java.

Câu 1: Viết chương trình in ra số cột của bảng “MyTable” trong một cơ sở dữ liệu “MyDB”.

public class De1Cau4 {

    final static String jdbcURL ="jdbc:odbc:MyDB";

    final static String jdbcDriver ="sun.jdbc:odbc:JdbcOdbcDriver";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName(jdbcDriver);

        Connection conec = DriverManager.getConnection(jdbcURL,"user","pass");

        Statement stm = (Statement) conec.createStatement();

        ResultSet result = stm.executeQuery("Select * from MyTable");

        ResultSetMetaData rs = result.getMetaData();

        System.out.println("Tổng số cột trong bảng này là: "+rs.getColumnCount());

    }

}

Câu 2: Viết chương trình in ra số hàng của bảng “MyTable” trong cơ sở dữ liệu “MyDB”.

public class De2Cau4 {

    final static String;

    final static String;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName(jdbcDriver);

        Connection conec= DriverManager.getConnection(jdbcURL);

        Statement stm= (Statement) conec.createStatement();

        ResultSet result= stm.executeQuery("Select * from MyTable1");        

        int rowCout=0;

        while(result.next())

        {

            rowCout++;

        }

        System.out.println("Tổng số hàng trong bảng này là: "+rowCout);

    }

}

Câu 3: Viết chương trình in ra kiểu dữ liệu của cột thứ 3 của bảng “MyTable” trong cơ sở dữ liệu “MyDB”. Cho rằng bảng có nhiều hơn 3 cột.

public class De3Cau4 {

    final static String;

    final static String;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName(jdbcDriver);

        Connection conec= DriverManager.getConnection(jdbcURL,"","");

        Statement stm= (Statement) conec.createStatement();

        ResultSet result= stm.executeQuery("select * from MyTable");

        ResultSetMetaData data =  result.getMetaData();

        System.out.println("Type column 3:"+data.getColumnType(3));

    }

}

Câu 4: Viết chương trình in ra tên của cột thứ 3 của bảng “MyTable” trong cơ sở dữ liệu “MyDB”. Cho rằng bảng có nhiều hơn 3 cột.

public class De4Cau4 {

    final static String;

    final static String;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName(jdbcDriver);

        Connection con= DriverManager.getConnection(jdbcURL, "user", "pass");

        Statement stm= (Statement) con.createStatement();

        ResultSet result= stm.executeQuery("Select *from MyTable1");

        ResultSetMetaData rs=result.getMetaData();

        System.out.print(rs.getColumnLabel(3));

    }

}

Phần V – Lý thuyết

Câu 1: Thế nào là lập trình đa tuyến đoạn?

Lập trình đa tuyến đoạn (Multi-thread):

Đa tuyến đoạn mở rộng khái niệm đa nhiệm bằng cách cho phép một chương trình thực hiện một số tác vụ đồng thời.

Mỗi tác vụ được xem như là một tuyến đoạn và nó có một luồng điều khiển riêng.

Đa tuyến đoạn rất hữu ích trong các ứng dụng thực tế.

Để lập trình đa tuyến đoạn, ngoài việc xử lý tuần tự, các tác vụ còn có thể được xử lý đồng thời - nghĩa là nhiều tác vụ được thực hiện cùng một lúc mà không cần đợi tác vụ này hoàn thành mới tiến hành tác vụ khác.

Đa tuyến đoạn còn có nghĩa là nhiều tuyến xử lý, cho phép một chương trình có nhiều thể hiện cùng hoạt động, cùng sử dụng chung bộ nhớ.

Một ứng dụng có thể thực hiện nhiều tác vụ đồng thời và các tuyến đoạn có thể truy xuất tới các biến dữ liệu dùng chung để cùng làm việc hợp tác với nhau.

Mục đích của tiến trình và tuyến đoạn đều là cho phép nhiều máy tính thực hiện nhiều tác vụ đồng thời.

Một ứng dụng có thể có nhiều tuyến đoạn. Khả năng làm việc với nhiều tuyến đoạn được gọi là đa tuyến đoạn. Đa tuyến đoạn cho phép bạn viết các chương trình hiệu quả tận dụng tối đa CPU bằng cách duy trì thời gian trễ là tối thiểu.

Vòng đời của một tuyến đoạn:

Một tuyến đoạn có thể ở một trong bốn trạng thái sau:

New - Một tuyến đoạn mới là một tuyến đoạn được tạo ra bằng cách sử dụng toán tử new nhưng vẫn chưa được khởi động.

Runnable – Một tuyến đoạn ở trạng thái runnable mỗi khi phương thức start() của nó được kích hoạt. Điều này nghĩa là mã lệnh trong phương thức run() có thể được xử lý bất kỳ khi nào giành được quyền xử lý từ hệ điều hành.

Blocked (bị phong tỏa) – Một tuyến đoạn chuyển vào trạng thái blocked nếu một trong các sự kiện sau xảy ra:

Phương thức sleep() của tuyến đoạn được gọi.

Tuyến đoạn gọi phương thức wait() của một đối tượng.

Tuyến đoạn phong tỏa một thao tác vào/ra.

Dead (chết) – Một tuyến đoạn thường ở trạng thái dead khi phương thức run() hoàn thành việc xử lý.

Câu 2: Bế tắc - Deadlock

Một kiểu lỗi đặc biệt mà ta cần phải tránh có liên quan đến đa nhiệm là bế tắc (deadlock), bế tắc xảy ra khi hai tuyến đoạn có một sự phụ thuộc xoay vòng trên một cặp đối tượng đồng bộ.

Ví dụ, giả sử một tuyến đoạn chiếm dụng đối tượng X và một tuyến đoạn chiếm dụng đối tượng Y. Nếu tuyến đoạn chiếm dụng X cố gắng gọi bất kỳ phương thức đồng bộ trên Y, thì nó sẽ bị phong tỏa. Nếu tuyến đoạn chiếm dụng Y gọi phương thức đồng bộ trên X, tuyến đoạn sẽ chờ vô hạn.

Câu 3: Mô hình Client – Server

Là mô hình được phổ biến nhất và được chấp nhận rộng rãi trong các hệ thống phân tán.

Trong mô hình này sẽ có một tập các tiến trình mà mỗi tiến trình đóng vai trò như là một trình quản lý tài nguyên cho một tập hợp các tài nguyên cho trước và một tập hợp các tiến trình client trong đó mỗi tiến trình thực hiện một tác vụ nào đó cần truy xuất tới tài nguyên phần cứng hoặc phần mềm dùng chung.

Bản thân các trình quản lý tài nguyên cần phải truy xuất tới các tài nguyên dùng chung được quản lý bởi một tiến trình khác, vì vậy một số tiến trình vừa là tiến trình client vừa là tiến trình server.

Các tiến trình phát ra các yêu cầu tới các server bất kỳ khi nào chúng cần truy xuất tới một trong các tài nguyên của các server. Nếu yêu cầu là đúng đắn thì server sẽ thực hiện hành động yêu cầu và gửi một đáp ứng trả lời tới tiến trình client.

Mô hình client/server cung cấp một cách tiếp cận tổng quát để chia sẻ tài nguyên trong các hệ thống phân tán.

Mô hình này có thể được cài đặt bằng rất nhiều môi trường phần mềm và phần cứng khác nhau.

Các máy tính được sử dụng để chạy các tiến trình client/server có nhiều kiểu khác nhau và không cần thiết phải phân biệt giữa chúng; cả tiến trình client và tiến trình server đều có thể chạy trên cùng một máy tính.

Một tiến trình server có thể sử dụng dịch vụ của một server khác.

Mô hình truyền tin client/server hướng tới việc cung cấp dịch vụ. Quá trình trao đổi dữ liệu bao gồm:

Truyền một yêu cầu từ tiến trình client tới tiến trình server.

Yêu cầu được server xử lý.

Truyền đáp ứng cho client.

Mô hình truyền tin này liên quan đến việc truyền hai thông điệp và một dạng đồng bộ hóa cụ thể client và server. Tiến trình server phải nhận thức được thông điệp yêu cầu ở bước một ngay khi nó đến và hành động phát ra yêu cầu trong client phải được tạm dừng (bị phong tỏa) và buộc tiến trình client ở trạng thái chờ cho tới khi nó nhận được đáp ứng do server gửi về ở bước 3.

Mô hình client/server thường được cài đặt dựa trên các thao tác cơ bản là gửi (send) và nhận (receive).

Quá trình giao tiếp client và server có thể diễn ra theo một trong hai chế độ bị phong tỏa (blocked) và không bị phong tỏa (non-blocked).

Chế độ bị phong tỏa (blocked):

Trong chế độ bị phong tỏa, khi tiến trình client hoặc server phát ra lệnh gửi dữ liệu (send), việc thực thi của tiến trình sẽ bị tạm ngừng cho tới khi tiến trình nhận phát ra lệnh nhận dữ liệu (receive).

Tương tự đối với tiến trình nhận dữ liệu, nếu tiến trình nào đó (client hoặc server) phát ra lệnh nhận dữ liệu, mà tại thời điểm đó chưa có dữ liệu gửi tới thì việc thực thi của tiến trình cũng sẽ bị tạm ngừng cho tới khi có dữ liệu gửi tới.

Chế độ không bị phong tỏa (non-blocked):

Trong chế độ này, khi tiến trình client hay server phát ra lệnh gửi dữ liệu thực sự, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra lệnh nhận dữ liệu đó hay không.

Tương tự cho trường hợp nhận dữ liệu, khi tiến trình phát ra lệnh nhận dữ liệu, nó sẽ nhận dữ liệu hiện có, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra lệnh gửi dữ liệu tiếp theo hay không.

Câu 4: Mô hình truyền tin socket

Một socket có thể thực hiện bảy thao tác cơ bản:

Kết nối với một máy ở xa

Gửi dữ liệu

Nhận dữ liệu

Ngắt liên kết

Gán cổng

Nghe dữ liệu đến

Chấp nhận liên kết từ các máy ở xa trên cổng đã được gán

Lớp Socket của Java được sử dụng bởi cả client và server, có các phương thức tương ứng với bốn thao tác đầu tiên. Ba thao tác cuối chỉ cần cho server để chờ các client liên kết với chúng. Các thao tác này được cài đặt bởi lớp ServerSocket. Các socket cho client thường được sử dụng theo mô hình sau:

Một socket mới được tạo ra bằng cách sử dụng hàm Socket().

Mỗi khi liên kết được thiết lập, các host ở xa nhận các luồng vào và luồng ra từ socket, và sử dụng các luồng này để gửi dữ liệu cho nhau. Kiểu liên kết này được gọi là song công (full-deplex) – các host có thể nhận và gửi dữ liệu đồng thời. Ý nghĩa của dữ liệu phụ thuộc vào giao thức.

Khi việc truyền dữ liệu hoàn thành, một hoặc cả hai phía ngắt liên kết. Một số giao thức như HTTP đòi hỏi mỗi liên kết phải bị đóng sau mỗi khi yêu cầu được phục vụ. Các giao thức khác chẳng hạn FTP cho phép nhiều yêu cầu được xử lý trong một liên kết đơn.

Câu 5: Các ưu, nhược điểm của UDP và khi nào thì sử dụng UDP?

Ưu điểm của UDP:

Không cần thiết lập liên kết: UDP là giao thức phi liên kết, vì thế không cần phải thiết lập liên kết. Vì UDP không sử dụng các tín hiệu handshaking, nên có thể tránh được thời gian trễ. Đó chính là lý do tại sao DNS thường sử dụng giao thức UDP hơn là TCP-DNS.

Tốc độ: UDP nhanh hơn so với TCP. Bởi vì điều này, nhiều ứng dụng thường được cài đặt trên giao thức UDP hơn so với giao thức TCP.

Hỗ trợ hình trạng (Topology): UDP hỗ trợ các liên kết 1-1, 1-n, ngược lại TCP chỉ hỗ trợ liên kết 1-1.

Kích thước header: UDP chỉ có 8 byte header cho mỗi đoạn, ngược lại TCP cần các header 20 byte, vì vậy sử dụng băng thông ít hơn.

Bảng so sánh sự khác nhau giữa hai gia thức UDP và TCP:

Các đặc trưngUDPTCP   

Hướng liên kếtKhôngCó   

Sử dụng phiênKhôngCó   

Độ tin cậyKhôngCó   

Xác thựcKhôngCó   

Đánh thứ tựKhôngCó   

Điều khiển luồngKhôngCó   

Bảo mậtÍtNhiều hơn 

Nhược điểm của UDP:

Thiếu các tín hiệu bắt tay: Trước khi gửi một đoạn, UDP không gửi các tín hiệu bắt tay giữa bên gửi và bên nhận. Vì thế phía gửi không có cách nào để biết datagram đã đến đích hay chưa. Do vậy, UDP không đảm bảo việc dữ liệu đã đến đích hay chưa.

Sử dụng các phiên: Để TCP là hướng liên kết, các phiên được duy trì giữa các host. TCP sử dụng các chỉ số phiên (session ID) để duy trì các liên kết giữa hai host. UDP không hỗ trợ bất kỳ phiên nào do bản chất phi liên kết của nó.

Độ tin cậy: UDP không đảm bảo rằng chỉ có một bản sao dữ liệu tới đích. Để gửi dữ liệu tới các hệ thống cuối, UDP phân chia dữ liệu thành các đoạn nhỏ. UDP không đảm bảo rằng các đoạn này sẽ đến đích đúng thứ tự như chúng đã được tạo ra ở nguồn. Ngược lại, TCP sử dụng các số thứ tự cùng với số hiệu cổng và các gói tin xác thực thường xuyên, điều này đảm bảo rằng các gói tin đến đích đúng thứ tự mà nó đã được tạo ra.

Bảo mật: TCP có tính bảo mật cao hơn UDP. Trong nhiều tổ chức, firewall và router cấm các gói tin UDP, điều này là vì các hacker thường sử dụng các cổng UDP.

Kiểm soát luồng: UDP không có kiểm soát luồng, kết quả là một ứng dụng UDP được thiết kế tồi có thể làm giảm băng thông của mạng.

Khi nào thì sử dụng UDP:

Rất nhiều ứng dụng trên Internet sử dụng UDP. Dựa trên các ưu và nhược điểm của UDP chúng ta có thể kết luận UDP có ích khi:

Sử dụng cho các phương thức truyền broadcasting và multicasting khi chúng ta muốn truyền tin với nhiều host.

Kích thước datagram nhỏ và trình tự đoạn là không quan trọng.

Không cần thiết lập liên kết.

Ứng dụng không gửi các dữ liệu quan trọng.

Không cần truyền lại các gói tin.

Băng thông của mạng đóng vai trò quan trọng.

Câu 6: Nhận các gói tin và gửi các gói tin DatagramSocket

Nhận các gói tin:

Trước khi một ứng dụng có thể đọc các gói tin UDP được gửi bởi các máy ở xa, nó phải gán một socket với một cổng UDP bằng cách sử dụng DatagramSocket, và tạo ra một DatagramPacket sẽ đóng vai trò như là một bộ chứa cho dữ liệu của gói tin UDP.

Khi một ứng dụng muốn đọc các gói tin UDP, nó gọi phương thức DatagramSocket.receive(), phương thức này sao chép gói tin UDP vào một DatagramPacket xác định. Xử lý nội dung gói tin và tiến trình lặp lại khi cần.

Khi xử lý gói tin ứng dụng phải làm việc trực tiếp với một mảng byte. Tuy nhiên nếu ứng dụng là đọc văn bản thì ta có thể sử dụng các lớp từ gói vào ra để chuyển đổi giữa mảng byte, luồng stream và reader. Bằng cách gắn kết luồng nhập ByteArrayInputStream với nội dung của một datagram và sau đó kết nối với một kiểu luồng khác, khi đó bạn có thể truy xuất tới nội dung của gói UDP một cách dễ dàng.

Gửi các gói tin:

Lớp DatagramSocket cũng được sử dụng để gửi các gói tin. Khi gửi gói tin, ứng dụng phải tạo ra một DatagramPacket, thiết lập địa chỉ và thông tin cổng, và ghi dữ liệu cần truyền vào mảng byte. Nếu muốn gửi thông tin phúc đáp thì ta cũng đã biết địa chỉ và số hiệu cổng của gói tin nhận được. Mỗi khi gói tin sẵn sàng để gửi, ta sử dụng phương thức send() của lớp DatagramSocket để gửi gói tin đi.

Câu 7: Cơ chế hoạt động RMI

RMI là một cơ chế gọi phương thức từ xa giữa 2 máy cài đặt máy ảo Java, dùng để gọi một phương thức trên một đối tượng từ xa giống như trên máy cục bộ.

Cơ chế hoạt động RMI như sau:

RMI hoạt động dựa trên cơ chế stub/skeleton nghĩa là phát sinh bộ khung sườn của đối tượng remote, đặt trên máy remote và máy local.

Stub hoạt động phía client và Sekeleton hoạt động phía server.

Stub và Skeleton sẽ có nhiệm vụ trao đổi dữ liệu cho nhau, khi có một yêu cầu dưới client, stub có nhiệm vụ Serialize mọi tham số (là object) và truyền lên Server, sau đó Skeleton sẽ deSerialize đối tượng này và xử lý, sau đó là một quá trình ngược lại với quá trình trên, dữ liệu được trả về cho Client.

Câu 8: Kiến trúc RMI

Server là chương trình cung cấp các đối tượng có thể được gọi từ xa.

Client là chương trình có tham chiếu đến các phương thức của các đối tượng ở xa trên Server.

Stub chứa các tham chiếu đến các phương thức ở xa trên Server.

Skeleton đón nhận các tham chiếu từ Stub để kích hoạt phương thức tương ứng trên Server.

Remote Reference Layer là hệ thống truyền thông của RMI.

Transport là tầng giao vận được dựa trên giao thức TCP/IP.

Bằng cách sử dụng kiến trúc phân tầng như trên mà mỗi tầng có thể phân cấp hoặc thay thế mà không ảnh hưởng tới các tầng còn lại của hệ thống.

Câu 9: Kết nối cơ sở dữ liệu

Mô hình kết nối cơ sở dữ liệu:

Các bước cơ bản để kết nối với cơ sở dữ liệu từ một ứng dụng Java:

Bước 1: Nạp trình điều khiển

Bước 2: Xác định URL cơ sở dữ liệu

Bước 3: Thiết lập liên kết

Bước 4: Tạo ra một đối tượng Statement

Bước 5: Xử lý truy vấn

Bước 6: Xử lý kết quả

Bước 7: Đóng liên kết

Câu 10: Sử dụng các giao tác

Quản lý giao tác:

Một giao tác là một tập hợp một hoặc nhiều lệnh được xử lý cùng với nhau như một chỉnh thể thống nhất (đơn vị).

Khi xử lý một giao tác: tất cả các lệnh được xử lý hoặc không lệnh nào được xử lý.

Điều này có thể được thực hiện nhờ phương thức setAutoCommit() của đối tượng Connection. Phương thức này nhận một giá trị boolean làm tham số.

Ngăn chế độ Auto-conmit.

Khi một liên kết được tạo ra thì liên kết đó ở chế độ auto-commit.

Mỗi lệnh SQL được xem như là một giao tác và sẽ được tự động hoàn thành ngay khi nó được xử lý.

Cách để cho phép hai hoặc nhiều lệnh được nhóm cùng với nhau thành một giao tác là cấm chế độ auto-commit.

Xác nhận hoàn thành một giao tác:

Mỗi khi chế độ auto-commit bị cấm, không có lệnh SQL nào sẽ được xác nhận hoàn thành cho tới khi ta gọi phương thức commit().

Ta có thể thực hiện điều này bằng cách gọi phương thức commit() của một đối tượng liên kết.

Nếu ta cố gắng xử lý một hay nhiều lệnh trong một giao tác và nhận được một ngoại lệ SQLException, ta cần gọi phương thức rollback() để hủy bỏ giao tác và khởi động lại toàn bộ giao tác.

Bạn đang đọc truyện trên: Truyen2U.Pro