إسمعوا يا فرسان الكود. أنا على وشك إسقاط بعض المعرفة التي ستحول لعبة Aurora PostgreSQL الخاصة بك من ساعة للهواة إلى لعبة الدوري الكبير. نحن نتحدث عن نماذج Java وأدوات الوصول إلى قواعد البيانات التي ستجعل كبار المطورين لديك يبكون من الفرح وسيشتري لك مسؤولو قواعد البيانات (DBAs) بيرة أم لا (يعتمد على عمرك).
الآن، دعونا نقسمها:
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() ); } }
لماذا هذا عبقري:
يمكن لـ Aurora التعامل مع الكثير من الاتصالات، لكن لا تهدرها. استخدم 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 وDAOs القوية لـ Aurora PostgreSQL على كتابة تعليمات برمجية فعالة فحسب. يتعلق الأمر بصياغة طبقة بيانات قوية وفعالة وجاهزة لأي شيء تريده.
تذكر أن نماذجك و DAOs هي أساس تطبيقك. افعلها بشكل صحيح، وأنت تهيئ نفسك للنجاح. أخطأوا في فهمهم، وأنتم تبنيون على الرمال المتحركة.
توقف الآن عن القراءة وابدأ بالبرمجة. قاعدة بيانات Aurora PostgreSQL الخاصة بك في انتظار ترويضها.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3