質問編集履歴

3

見た目を変更

2022/11/04 05:14

投稿

yuusakuri
yuusakuri

スコア6

test CHANGED
File without changes
test CHANGED
@@ -31,16 +31,19 @@
31
31
 
32
32
  DB接続を取得する、開く、閉じる、より良いタイミング(場所)はどこでしょうか。
33
33
 
34
- #### 現在の実装
34
+ #### 現在の実装 - ビジネスロジッククラスで接続を管理
35
+ ビジネスロジッククラスがDatabaseConnectionManagerを呼んで接続を管理
36
+ 接続をDAOとトランザクションクラスに渡す
37
+ トランザクションクラスやDAOのメソッドを呼び出す
35
38
 
36
- ビジネスロジッククラスで接続を管理し、接続をDAOとトランザクションクラスに渡し、トランザクションクラスやDAO各データアクセスメソッドを呼び出しています。
39
+ ##### 現在実装 - 懸念
37
-
38
- ただ、この方法だとデータソースへの接続が何であるかをビジネスロジックが知らなければなりません。
40
+ この方法だとデータソースへの接続が何であるかをビジネスロジックが知らなければなりません。
39
41
 
40
42
  データソースがデータベースからCSVファイルとなった際にビジネスロジックにも影響してしまいます。DAOの利点はデータソースの変更の影響をビジネスロジックに与えないことでもあったと記憶していますが、これが覆ってしまいませんでしょうか。
41
43
 
42
- #### 改善案1
44
+ #### 改善案1 - DAOで接続を管理
43
45
 
44
46
  DAOのコンストラクタもしくは各メソッドにて、DatabaseConnectionManagerを呼び出して接続を取得し、接続が閉じていれば開きます。ビジネスロジックが接続を管理する必要は無くなります。
45
47
 
48
+ ##### 改善案1 - 懸念
46
- ただ、Daoに接続のCloseをさせる場合、Dao1でもDao2でも同じ接続先のCloseを行えてしまい、なんだか統一感がない気がします。
49
+ Daoに接続のCloseをさせる場合、Dao1でもDao2でも同じ接続先のCloseを行えてしまい、なんだか統一感がない気がします。

2

見た目を変更

2022/11/04 05:08

投稿

yuusakuri
yuusakuri

スコア6

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  言語はQtを使ったC++です。
12
12
 
13
- クラス構成は以下のように考えています。
13
+ #### クラス構成
14
14
 
15
15
  ビジネスロジッククラス
16
16
  DAO1, DAO2, TransactionManagerインスタンスを作成してトランザクションやDAOメソッドの呼び出し

1

改善案を追加

2022/11/04 05:07

投稿

yuusakuri
yuusakuri

スコア6

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  SQLiteデータベースには複数のテーブルがあり、各テーブルごとに一つのDAOを作成します。よって、複数のDAOが同じ接続先に対してデータアクセスを行います。
6
6
 
7
- DAO1とDAO2は、同じトランザクションでクエリを実行する場合があります。
7
+ DAO1とDAO2は、同じトランザクションでクエリを実行する場合があります。よって、DAOのデータアクセスメソッドで接続をCloseすることはできません。
8
8
 
9
9
  大抵のフレームワークなどはDBへの接続プールを持っているため、Open、Closeのコストはかかりません。「DB接続が開かれたら都度閉じられることを保証する」ため、「使い終わった接続は都度閉じる」ようにするべきとのことです。
10
10
 
@@ -31,8 +31,16 @@
31
31
 
32
32
  DB接続を取得する、開く、閉じる、より良いタイミング(場所)はどこでしょうか。
33
33
 
34
+ #### 現在の実装
35
+
34
- 現在は、ビジネスロジッククラスで接続を管理し、接続をDAOとトランザクションクラスに渡し、トランザクションクラスやDAOの各データアクセスメソッドを呼び出しています。
36
+ ビジネスロジッククラスで接続を管理し、接続をDAOとトランザクションクラスに渡し、トランザクションクラスやDAOの各データアクセスメソッドを呼び出しています。
35
37
 
36
38
  ただ、この方法だとデータソースへの接続が何であるかをビジネスロジックが知らなければなりません。
37
39
 
38
40
  データソースがデータベースからCSVファイルとなった際にビジネスロジックにも影響してしまいます。DAOの利点はデータソースの変更の影響をビジネスロジックに与えないことでもあったと記憶していますが、これが覆ってしまいませんでしょうか。
41
+
42
+ #### 改善案1
43
+
44
+ DAOのコンストラクタもしくは各メソッドにて、DatabaseConnectionManagerを呼び出して接続を取得し、接続が閉じていれば開きます。ビジネスロジックが接続を管理する必要は無くなります。
45
+
46
+ ただ、Daoに接続のCloseをさせる場合、Dao1でもDao2でも同じ接続先のCloseを行えてしまい、なんだか統一感がない気がします。