बुक क्लब Saturdays
Metropolitan Public Library हर महीने "बुक क्लब Saturdays" आयोजित करती है — यह बहुत लोकप्रिय इवेंट है, जहाँ 30-40 सदस्य सुबह 10 बजे अपनी मासिक पसंद की किताबें इश्यू कराने आते हैं. मौजूदा सिस्टम auto-commit चालू रखकर हर loan को अलग-अलग प्रोसेस करता है, जिससे दो बड़ी दिक्कतें पैदा होती हैं:
- डेटा असंगति: पिछले महीने, एक सदस्य के चार-किताब चेकआउट को प्रोसेस करते समय सिस्टम क्रैश हो गया. दो किताबें loaned के रूप में रिकॉर्ड हुईं, लेकिन बाकी दो नहीं हुईं, जिससे इन्वेंटरी में गड़बड़ी हुई और पाठक नाराज़ हुए.
- परफॉर्मेंस bottleneck: हर loan को अलग database ट्रांज़ैक्शन की तरह प्रोसेस करने में 15-20 मिनट लग जाते हैं, लंबी कतारें लगती हैं और लाइब्रेरी स्टाफ परेशान होता है.
आपका कार्य है कि ट्रांज़ैक्शन कंट्रोल के साथ बैच प्रोसेसिंग लागू करें.
यह अभ्यास पाठ्यक्रम का हिस्सा है
Java में PostgreSQL डेटाबेस को क्वेरी करना
अभ्यास निर्देश
- लाइन 32 में
autoCommitकोfalseसेट करें ताकि manual ट्रांज़ैक्शन कंट्रोल सक्षम हो जाए. - लाइन 43 में कई loans को बैच में जोड़ें.
- लाइन 49 में, अगर सारी operations सफल हों, तो ट्रांज़ैक्शन commit करें.
इंटरैक्टिव व्यावहारिक अभ्यास
इस अभ्यास को इस नमूना कोड को पूरा करके आज़माएँ।
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;
}
}
}
}