잘 들어보세요, 코드자키 여러분. 저는 여러분의 Aurora PostgreSQL 게임을 아마추어 게임에서 빅 리그로 변화시킬 몇 가지 지식을 전달하려고 합니다. 우리는 고위 개발자를 기쁨으로 눈물 흘리게 만들고 DBA가 맥주를 사줄지 말지(나이에 따라 다름)를 만들 수 있는 Java 모델 및 데이터베이스 접근자에 대해 이야기하고 있습니다.
이제 분석해 보겠습니다.
public class User { private UUID id; private String email; private String hashedPassword; private Instant createdAt; private Instant updatedAt; // Constructors, getters, and setters omitted for brevity public boolean isPasswordValid(String password) { // Implement password hashing and validation logic } public void updatePassword(String newPassword) { this.hashedPassword = // Hash the new password this.updatedAt = Instant.now(); } // Other business logic methods }
이것이 효과적인 이유:
public interface UserDao { Optional<User> findById(UUID id); List<User> findByEmail(String email); void save(User user); void update(User user); void delete(UUID id); List<User> findRecentUsers(int limit); }
이것이 중요한 이유:
public class AuroraPostgresUserDao implements UserDao { private final DataSource dataSource; public AuroraPostgresUserDao(DataSource dataSource) { this.dataSource = dataSource; } @Override public Optional<User> findById(UUID id) { String sql = "SELECT * FROM users WHERE id = ?"; try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setObject(1, id); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { return Optional.of(mapResultSetToUser(rs)); } } } catch (SQLException e) { throw new DatabaseException("Error finding user by ID", e); } return Optional.empty(); } @Override public void save(User user) { String sql = "INSERT INTO users (id, email, hashed_password, created_at, updated_at) VALUES (?, ?, ?, ?, ?)"; try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setObject(1, user.getId()); pstmt.setString(2, user.getEmail()); pstmt.setString(3, user.getHashedPassword()); pstmt.setTimestamp(4, Timestamp.from(user.getCreatedAt())); pstmt.setTimestamp(5, Timestamp.from(user.getUpdatedAt())); pstmt.executeUpdate(); } catch (SQLException e) { throw new DatabaseException("Error saving user", e); } } // Other method implementations... private User mapResultSetToUser(ResultSet rs) throws SQLException { return new User( (UUID) rs.getObject("id"), rs.getString("email"), rs.getString("hashed_password"), rs.getTimestamp("created_at").toInstant(), rs.getTimestamp("updated_at").toInstant() ); } }
이것이 천재인 이유:
Aurora는 많은 연결을 처리할 수 있지만 낭비하지 마세요. 연결 풀링에는 HikariCP 또는 이와 유사한 것을 사용하십시오.
많은 레코드를 삽입하거나 업데이트해야 하는 경우 일괄 작업을 사용하세요.
public void saveUsers(List<User> users) { String sql = "INSERT INTO users (id, email, hashed_password, created_at, updated_at) VALUES (?, ?, ?, ?, ?)"; try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { for (User user : users) { pstmt.setObject(1, user.getId()); pstmt.setString(2, user.getEmail()); pstmt.setString(3, user.getHashedPassword()); pstmt.setTimestamp(4, Timestamp.from(user.getCreatedAt())); pstmt.setTimestamp(5, Timestamp.from(user.getUpdatedAt())); pstmt.addBatch(); } pstmt.executeBatch(); } catch (SQLException e) { throw new DatabaseException("Error batch saving users", e); } }
로드를 분산하려면 읽기 작업에 별도의 DataSource를 사용하세요.
원자적이어야 하는 작업에 트랜잭션을 사용하세요.
public void transferMoney(UUID fromId, UUID toId, BigDecimal amount) { String debitSql = "UPDATE accounts SET balance = balance - ? WHERE id = ?"; String creditSql = "UPDATE accounts SET balance = balance + ? WHERE id = ?"; try (Connection conn = dataSource.getConnection()) { conn.setAutoCommit(false); try (PreparedStatement debitStmt = conn.prepareStatement(debitSql); PreparedStatement creditStmt = conn.prepareStatement(creditSql)) { debitStmt.setBigDecimal(1, amount); debitStmt.setObject(2, fromId); debitStmt.executeUpdate(); creditStmt.setBigDecimal(1, amount); creditStmt.setObject(2, toId); creditStmt.executeUpdate(); conn.commit(); } catch (SQLException e) { conn.rollback(); throw new DatabaseException("Error transferring money", e); } finally { conn.setAutoCommit(true); } } catch (SQLException e) { throw new DatabaseException("Error managing transaction", e); } }
테스트를 위해 Aurora의 빠른 복제 기능과 연결 처리 시 탁월한 장애 조치 기능을 활용해 보세요.
Aurora PostgreSQL을 위한 견고한 Java 모델 및 DAO를 만드는 것은 단순히 작동하는 코드를 작성하는 것이 아닙니다. 강력하고 효율적이며 어떤 조치를 취하더라도 대비할 수 있는 데이터 계층을 만드는 것이 중요합니다.
모델과 DAO는 애플리케이션의 기초라는 점을 기억하세요. 이를 올바르게 수행하면 성공을 위한 준비를 갖추게 됩니다. 잘못 이해하면 유사 위에 건물을 짓게 됩니다.
이제 읽기를 멈추고 코딩을 시작해 보세요. 귀하의 Aurora PostgreSQL 데이터베이스가 길들여지기를 기다리고 있습니다.
위 내용은 Aurora PostgreSQL 숙달: 팀이 기뻐서 눈물 흘리게 만드는 방탄 Java 모델 및 DAO의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!