Слушайте, программисты. Я собираюсь поделиться некоторыми знаниями, которые превратят вашу игру Aurora PostgreSQL из любительского часа в высшую лигу. Мы говорим о моделях 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 { OptionalfindById(UUID id); List findByEmail(String email); void save(User user); void update(User user); void delete(UUID id); List findRecentUsers(int limit); }
Почему это круто:
public class AuroraPostgresUserDao implements UserDao { private final DataSource dataSource; public AuroraPostgresUserDao(DataSource dataSource) { this.dataSource = dataSource; } @Override public OptionalfindById(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() ); } }
Почему это гениально:
Аврора может обрабатывать множество соединений, но не будьте расточительны. Используйте HikariCP или аналогичный для пула соединений.
Если вам нужно вставить или обновить множество записей, используйте пакетные операции.
public void saveUsers(Listusers) { 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); } }
Используйте отдельный источник данных для операций чтения, чтобы распределить нагрузку.
Используйте транзакции для операций, которые должны быть атомарными.
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 для тестирования и превосходными возможностями аварийного переключения при обработке соединений.
Создание надежных моделей Java и DAO для Aurora PostgreSQL — это не просто написание работающего кода. Речь идет о создании надежного, эффективного и готового к любым задачам уровня данных.
Помните, что ваши модели и DAO являются основой вашего приложения. Сделайте их правильно, и вы настроитесь на успех. Поймите их неправильно, и вы будете строить на зыбучих песках.
Теперь прекратите читать и приступайте к кодированию. Ваша база данных Aurora PostgreSQL ждет, чтобы ее приручили.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3