BaşlayınÜcretsiz Başlayın

Kitap Kulübü Cumartesileri

Metropolitan Halk Kütüphanesi, her ay 30-40 üyenin sabah 10'da gelip aylık seçimlerini ödünç aldığı, çok popüler “Kitap Kulübü Cumartesileri” etkinliğini düzenliyor. Mevcut sistem, otomatik commit açıkken her ödünç alma işlemini tek tek işliyor ve bu da iki kritik soruna yol açıyor:

  1. Veri tutarsızlığı: Geçen ay, sistem bir üyenin dört kitaplık ödünç alma işlemini işlerken çöktü. İki kitap ödünç alınmış göründü, diğer iki kitap kayda geçmedi; bu da envanterde tutarsızlığa ve hayal kırıklığı yaşayan kullanıcılara neden oldu.
  2. Performans darboğazı: Her ödünç almayı ayrı bir veritabanı işlemi olarak işlemek 15-20 dakika sürüyor; bu da uzun kuyruklara ve mutsuz kütüphane personeline yol açıyor.

Görevin, işlem kontrolü ile birlikte toplu işlemeyi (batch processing) uygulamak.

Bu egzersiz

Java ile PostgreSQL Veritabanına Sorgu Yazma

kursunun bir parçasıdır
Kursu Görüntüle

Egzersiz talimatları

  • 32. satırda manuel işlem kontrolünü etkinleştirmek için autoCommit değerini false yap.
  • 43. satırda birden fazla ödünç alma kaydını batch'e ekle.
  • 49. satırda tüm işlemler başarılıysa işlemi commit et.

Uygulamalı interaktif egzersiz

Bu örnek kodu tamamlayarak bu egzersizi bitirin.

public class BatchLoanProcessor {
    private static final String DB_URL = "jdbc:postgresql://localhost:5432/library_db";
    private static final String USERNAME = "postgres";
    private static final String PASSWORD = "postgres";
    
    public static void main(String[] args) {
        Object[][] loanData = {
            {1, 1, LocalDate.now(), LocalDate.now().plusDays(14), "borrowed"},
            {2, 2, LocalDate.now(), LocalDate.now().plusDays(14), "borrowed"},
            {3, 3, LocalDate.now(), LocalDate.now().plusDays(7), "borrowed"},
            {4, 1, LocalDate.now(), LocalDate.now().plusDays(14), "borrowed"}
        };
        
        try {
            boolean success = processBatchLoans(loanData);
            if (success) {
                System.out.println("All loans were processed successfully.");
            } else {
                System.out.println("Loan processing failed. Transaction was rolled back.");
            }
        } catch (SQLException e) {
            System.err.println("Database error: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    public static boolean processBatchLoans(Object[][] loanData) throws SQLException {
        String insertSQL = "INSERT INTO loans (book_id, member_id, loan_date, due_date, status) VALUES (?, ?, ?, ?, ?)";
        
        try (Connection conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD)) {
            // Set autoCommit to false
            conn.____(____);
            
            try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
                for (Object[] loan : loanData) {
                    pstmt.setInt(1, (Integer) loan[0]);  
                    pstmt.setInt(2, (Integer) loan[1]);  
                    pstmt.setDate(3, java.sql.Date.valueOf((LocalDate) loan[2]));  
                    pstmt.setDate(4, java.sql.Date.valueOf((LocalDate) loan[3]));  
                    pstmt.setString(5, (String) loan[4]);  
                    
                    // Add to batch
                    pstmt.____();
                }
                
                int[] results = pstmt.executeBatch();
                                
                // Commit the transaction if all operations are successful
                conn.____();
                
                return true;
            } catch (SQLException e) {
                conn.rollback();
                
                System.err.println("Error during batch processing: " + e.getMessage());
                return false;
            }
        }
    }
}
Kodu Düzenle ve Çalıştır