前提
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を行えてしまい、なんだか統一感がない気がします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。