質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Q&A

解決済

1回答

1094閲覧

DAO設計パターン DB接続の取得、OpenとCloseの場所のベストプラクティス

yuusakuri

総合スコア6

DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

0グッド

0クリップ

投稿2022/11/04 04:53

編集2022/11/08 15:56

前提

DAO設計パターンにて、SQLite Databaseへのデータアクセスを行います。

SQLiteデータベースには複数のテーブルがあり、各テーブルごとに一つのDAOを作成します。よって、複数のDAOが同じ接続先に対してデータアクセスを行います。

DAO1とDAO2は、同じトランザクションでクエリを実行する場合があります。よって、DAOのデータアクセスメソッドで接続をCloseすることはできません。

大抵のフレームワークなどはDBへの接続プールを持っているため、Open、Closeのコストはかかりません。「DB接続が開かれたら都度閉じられることを保証する」ため、「使い終わった接続は都度閉じる」ようにするべきとのことです。

言語はQtを使ったC++です。

クラス構成

ビジネスロジッククラス
DAO1, DAO2, TransactionManagerインスタンスを作成してトランザクションやDAOメソッドの呼び出し

DatabaseConnectionManager
データベース接続を設定、取得、開く、閉じるなどの機能を提供する。

TransactionManager
トランザクションを開始、コミット、ロールバックする機能を提供する。

DAO1
テーブル1へのデータアクセスを提供する。

DAO2
テーブル2へのデータアクセスを提供する。

質問したいこと

DB接続を取得する、開く、閉じる、より良いタイミング(場所)はどこでしょうか。

現在の実装 - ビジネスロジッククラスで接続を管理

ビジネスロジッククラスがDatabaseConnectionManagerを呼んで接続を管理
接続をDAOとトランザクションクラスに渡す
トランザクションクラスやDAOのメソッドを呼び出す

現在の実装 - 懸念

この方法だとデータソースへの接続が何であるかをビジネスロジックが知らなければなりません。

データソースがデータベースからCSVファイルとなった際にビジネスロジックにも影響してしまいます。DAOの利点はデータソースの変更の影響をビジネスロジックに与えないことでもあったと記憶していますが、これが覆ってしまいませんでしょうか。

改善案1 - DAOで接続を管理

DAOのコンストラクタもしくは各メソッドにて、DatabaseConnectionManagerを呼び出して接続を取得し、接続が閉じていれば開きます。ビジネスロジックが接続を管理する必要は無くなります。

改善案1 - 懸念

Daoに接続のCloseをさせる場合、Dao1でもDao2でも同じ接続先のCloseを行えてしまい、なんだか統一感がない気がします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

調べた結果解決しました。

DAOの責任は、データアクセスを提供することです。下記の責任はありません。

  • データソースへの接続の管理
  • トランザクションの管理

したがって、データソースへの接続をDAOの外部で開き、接続をDAOのコンストラクタ等に渡すようにします。

投稿2022/11/08 06:56

yuusakuri

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問