Bokklubblördagar
Stadsbiblioteket arrangerar "Bokklubblördagar" – ett populärt evenemang där 30–40 medlemmar anländer klockan 10 för att låna sina månatliga bokval. Det befintliga systemet hanterar varje lån individuellt med auto-commit aktiverat, vilket skapar två allvarliga problem:
- Datainkonsekvens: Förra månaden kraschade systemet mitt under en medlems utcheckning av fyra böcker. Två böcker registrerades som utlånade, men inte de andra två – vilket ledde till lagerfel och missnöjda besökare.
- Prestandaflaskhals: Att behandla varje lån som en separat databastransaktion tar 15–20 minuter, vilket skapar långa köer och frustrerad bibliotekspersonal.
Din uppgift är att implementera batchbearbetning med transaktionskontroll.
Den här övningen är en del av kursen
Fråga en PostgreSQL-databas i Java
Övningsinstruktioner
- Sätt
autoCommittillfalseför att aktivera manuell transaktionskontroll på rad 32. - Lägg till flera lån i batchen på rad 43.
- Bekräfta transaktionen om alla operationer lyckades på rad 49.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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;
}
}
}
}