「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Aurora PostgreSQL のマスタリー: チームが泣いて喜ぶ防弾 Java モデルと DAO

Aurora PostgreSQL のマスタリー: チームが泣いて喜ぶ防弾 Java モデルと DAO

2024 年 11 月 8 日に公開
ブラウズ:656

聞いてください、コードジョッキー。 Aurora PostgreSQL ゲームをアマチュア時代から大リーグまで変えるための知識をいくつか紹介します。私たちが話しているのは、上級開発者が泣いて喜び、DBA がビールをおごってくれるかどうか (年齢によって異なります) をもたらす Java モデルとデータベース アクセサーについてです。

これが重要な理由:

  1. パフォーマンス: ずさんなモデルと DAO は、超高速の Aurora を鎮静剤を飲んだナマケモノに変える可能性があります。
  2. 保守性: これを正しく理解すれば、将来的には感謝状を送ることになります。間違えると午前 3 時にデバッグすることになります。
  3. スケーラビリティ: これらのパターンは、何百万ものレコードを苦労せずに処理するためのチケットです。
  4. コスト効率: コードが効率的であるということは、Aurora のコストが低いことを意味します。あなたの CFO があなたの名前を知るかもしれません。

Aurora PostgreSQL モデルと DAO の黄金律:

  1. モデルはただの愚かなデータ コンテナではありません: モデルは、単に美しく見えるだけでなく、生活のために機能する必要があります。
  2. DAO はデータベースの用心棒です: DAO は、何が入ってくるか、何が流出するか、そしてそれがどのように起こるかを決定します。
  3. JDBC のパワーを活用する: Aurora PostgreSQL は JDBC を流暢に話します。言い返す方法を学びましょう。
  4. 予期せぬ事態に備える: オーロラは信頼できますが、マーフィーの法則は無敵です。これらの例外をプロのように処理します。

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

それでは、詳しく見ていきましょう:

1. モデル

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
}

これが機能する理由:

  • ただのデータバッグではありません。ビジネス ロジックをカプセル化するメソッドがあります。
  • 適切なデータ型 (ID には UUID、タイムスタンプには Instant) が使用されます。
  • 独自のパスワード検証と更新を処理します。

2. DAOインターフェース

public interface UserDao {
    Optional findById(UUID id);
    List findByEmail(String email);
    void save(User user);
    void update(User user);
    void delete(UUID id);
    List findRecentUsers(int limit);
}

これが素晴らしい理由:

  • すっきりしていて要点を押さえています。
  • 存在しない可能性のある結果にはオプションを使用します。
  • 基本的な CRUD とより複雑な操作が混在しています。

3. DAOの実装

public class AuroraPostgresUserDao implements UserDao {
    private final DataSource dataSource;

    public AuroraPostgresUserDao(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public Optional 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()
        );
    }
}

これが天才である理由:

  • SQL インジェクションを防ぐために準備されたステートメントを使用します。
  • try-with-resources を使用してリソース管理を適切に処理します。
  • Java 型と PostgreSQL 型の間で正しくマッピングされます。
  • スタックのエラー処理を改善するためにカスタム例外をスローします。

100万ドルのヒント:

1. 接続プーリングを使用する

Aurora は多くの接続を処理できますが、無駄にしないでください。接続プーリングには、HikariCP などを使用します。

2. 一括アクションのバッチ操作

多くのレコードを挿入または更新する必要がある場合は、バッチ操作を使用します。

public void saveUsers(List 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);
    }
}

Aurora PostgreSQL Mastery: Bulletproof Java Models and DAOs That

3. Aurora のリードレプリカを活用する

負荷を分散するために、読み取り操作に別の DataSource を使用します。

4. トランザクションを無視しないでください

アトミックである必要がある操作にはトランザクションを使用します。

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 PostgreSQL Mastery: Bulletproof Java Models and DAOs That

5. Aurora 固有の機能を使用する

テスト用の Aurora の高速クローン作成と、接続処理における優れたフェイルオーバー機能を活用してください。

結論:

Aurora PostgreSQL 用の堅牢な Java モデルと DAO を作成するということは、機能するコードを書くだけではありません。それは、堅牢で効率的で、どんなことにも対応できるデータ レイヤーを作成することです。

モデルと DAO がアプリケーションの基礎であることを思い出してください。それらを正しく理解すれば、成功への準備が整います。誤解すると、流砂の上に建物を建てることになります。

さあ、読むのをやめてコーディングを始めてください。 Aurora PostgreSQL データベースは飼い慣らされるのを待っています。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/nislamov/aurora-postgresql-mastery-bulletproof-java-models-and-daos-thatll-make-your-team-weep-with-joy-1jkb?1権利侵害、削除するには[email protected]までご連絡ください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3