teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

11

ソースの追記

2018/02/15 09:44

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -21,6 +21,7 @@
21
21
 
22
22
  ### 該当のソースコード
23
23
  簡略化してるので抜けがあるかもしれません。
24
+ 複数のトランザクションで処理
24
25
  ```Java
25
26
  public class RecordEdit() {
26
27
  // DBにアクセスするためのもの
@@ -63,6 +64,7 @@
63
64
  /** カーソルを宣言する **/
64
65
  private void declareCursor() {
65
66
  try {
67
+ // トランザクションの開始
66
68
  sqlMapClient.startTransaction();
67
69
 
68
70
  String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
@@ -89,6 +91,7 @@
89
91
  /** UPDATE処理を行う **/
90
92
  private void update(Long id) {
91
93
  try {
94
+ // トランザクションの開始
92
95
  sqlMapClient.startTransaction();
93
96
 
94
97
  /** 指定されたIDに対してUPDATE処理 **/
@@ -125,6 +128,93 @@
125
128
  }
126
129
  ```
127
130
 
131
+ **追記**
132
+ 1つのトランザクションで処理
133
+ ```Java
134
+ public class RecordEdit() {
135
+ // DBにアクセスするためのもの
136
+ final SqlMapClient sqlMapClient = baseDao.getSqlMapClient();
137
+ // フェッチしてくる数を設定(1000件)
138
+ final int RECS_AT_ONCE = 1000;
139
+
140
+ // レコードIDを格納するリスト
141
+ Linkedlist<Long> recordIdList;
142
+ // カーソル名(本来は動的に決める)
143
+ String cursorName;
144
+
145
+ // コンストラクタ
146
+ public RecordEdit() {
147
+ recordIdList = new LinkedList<>();
148
+ cursorName = "cursorTest";
149
+ }
150
+
151
+ /** 宣言されたカーソルを使いフェッチしてくる **/
152
+ private Linkedlist<Long> fetchRecordIds() {
153
+ String query = "FORWARD " + RECS_AT_ONCE " FROM " + cursorName;
154
+ List<Map<String, String>> recordList = null;
155
+ // レコード情報の取得(FETCH)
156
+ recordList = sqlMapClient.queryForList("Record.fetch", query);
157
+ List<Long> resIdList = /** 取得したレコード情報からIDだけ抜き取る処理 **/
158
+ return resIdList;
159
+ }
160
+
161
+ /** カーソルを宣言する **/
162
+ private void declareCursor() {
163
+ String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
164
+ // カーソルの宣言(DECLARE)
165
+ sqlMapClient.queryForList("Record.declareCursor", query);
166
+ }
167
+
168
+ /** カーソルで取得したレコードIDリストからIDを一個ずつとりだす **/
169
+ private Long getNextId() {
170
+ // リストが空ならフェッチしてくる
171
+ if (recordIdList.isEmpty()) {
172
+ recordIdList = fetchRecordIds(cursorName);
173
+ }
174
+ // nullかidをを返す
175
+ return recordIdList.isEmpty() ? null : recordIdList.removeFirst();
176
+ }
177
+
178
+ /** UPDATE処理を行う **/
179
+ private void update(Long id) {
180
+ /** 指定されたIDに対してUPDATE処理 **/
181
+ }
182
+
183
+ /** カーソルのクローズ処理 **/
184
+ private void closeCursor() {
185
+ // カーソルを閉じる(CLOSE)
186
+ sqlMapClient.queryForList("Record.closeCursor", cursorName);
187
+ }
188
+
189
+ /** メイン処理 **/
190
+ public void execute() {
191
+ try {
192
+ // トランザクションの開始
193
+ sqlMapClient.startTransaction();
194
+ // カーソルを宣言
195
+ declareCursor();
196
+ while (true) {
197
+ // idを取得
198
+ long recordId = getNextId();
199
+ // 次のレコードが無いならループを抜ける
200
+ if (recordId == null) {
201
+ break;
202
+ }
203
+ // UPDATE処理を行う
204
+ update(recordId);
205
+ // 処理が成功したなら都度コミット
206
+ sqlMapClient.commitTransaction();
207
+ }
208
+ } finally {
209
+ // 成功/失敗に関わらず、トランザクションの終了
210
+ sqlMapClient.endTransaction();
211
+ // 無事ループを抜けたならカーソルを閉じる
212
+ closeCursor();
213
+ }
214
+ }
215
+ }
216
+ ```
217
+
128
218
  ### 試したこと
129
219
  トランザクションを別々にせずに、同じトランザクション内で処理を行えば、カーソルでの処理はできました。
130
220
  しかし、件数が多すぎるとUPDATE処理にすごく時間がかかり、あまりよろしくありません(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)。

10

ソースコードの修正

2018/02/15 09:44

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -24,7 +24,10 @@
24
24
  ```Java
25
25
  public class RecordEdit() {
26
26
  // DBにアクセスするためのもの
27
- final SqlMapClient sqlMapClient;
27
+ final SqlMapClient sqlMapClient = baseDao.getSqlMapClient();
28
+ // フェッチしてくる数を設定(1000件)
29
+ final int RECS_AT_ONCE = 1000;
30
+
28
31
  // レコードIDを格納するリスト
29
32
  Linkedlist<Long> recordIdList;
30
33
  // カーソル名(本来は動的に決める)
@@ -32,19 +35,17 @@
32
35
 
33
36
  // コンストラクタ
34
37
  public RecordEdit() {
35
- sqlMapClient = baseDao.getSqlMapClient();
36
38
  recordIdList = new LinkedList<>();
37
39
  cursorName = "cursorTest";
38
40
  }
39
41
 
40
- /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
42
+ /** 宣言されたカーソルを使フェッチしてくる **/
41
43
  private Linkedlist<Long> fetchRecordIds() {
42
44
  try {
43
45
  // トランザクションの開始
44
46
  sqlMapClient.startTransaction();
45
47
 
46
- // 1000件ずつ取得
47
- String query = "FORWARD 1000 FROM " + cursorName;
48
+ String query = "FORWARD " + RECS_AT_ONCE " FROM " + cursorName;
48
49
  List<Map<String, String>> recordList = null;
49
50
  // レコード情報の取得(FETCH)
50
51
  recordList = sqlMapClient.queryForList("Record.fetch", query);
@@ -60,7 +61,7 @@
60
61
  }
61
62
 
62
63
  /** カーソルを宣言する **/
63
- private String declareCursor() {
64
+ private void declareCursor() {
64
65
  try {
65
66
  sqlMapClient.startTransaction();
66
67
 
@@ -70,14 +71,14 @@
70
71
 
71
72
  sqlMapClient.commitTransaction();
72
73
  } finally {
73
- // ここで宣言したカーソルが消える
74
+ // ここで宣言したカーソルが消える
74
75
  sqlMapClient.endTransaction();
75
76
  }
76
77
  }
77
78
 
78
79
  /** カーソルで取得したレコードIDリストからIDを一個ずつとりだす **/
79
- private Long next() {
80
+ private Long getNextId() {
80
- // リストが空なら再びフェッチしてくる
81
+ // リストが空ならフェッチしてくる
81
82
  if (recordIdList.isEmpty()) {
82
83
  recordIdList = fetchRecordIds(cursorName);
83
84
  }
@@ -110,7 +111,7 @@
110
111
  declareCursor();
111
112
  while (true) {
112
113
  // idを取得
113
- long recordId = next();
114
+ long recordId = getNextId();
114
115
  // 次のレコードが無いならループを抜ける
115
116
  if (recordId == null) {
116
117
  break;

9

修正

2018/02/15 02:20

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -24,7 +24,7 @@
24
24
  ```Java
25
25
  public class RecordEdit() {
26
26
  // DBにアクセスするためのもの
27
- final SqlMapClient sqlMapClientent;
27
+ final SqlMapClient sqlMapClient;
28
28
  // レコードIDを格納するリスト
29
29
  Linkedlist<Long> recordIdList;
30
30
  // カーソル名(本来は動的に決める)
@@ -32,7 +32,7 @@
32
32
 
33
33
  // コンストラクタ
34
34
  public RecordEdit() {
35
- sqlMapClientent = baseDao.getSqlMapClient();
35
+ sqlMapClient = baseDao.getSqlMapClient();
36
36
  recordIdList = new LinkedList<>();
37
37
  cursorName = "cursorTest";
38
38
  }

8

修正

2018/02/15 02:03

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -99,7 +99,7 @@
99
99
  }
100
100
 
101
101
  /** カーソルのクローズ処理 **/
102
- private void cursorClose() {
102
+ private void closeCursor() {
103
103
  // カーソルを閉じる(CLOSE)
104
104
  sqlMapClient.queryForList("Record.closeCursor", cursorName);
105
105
  }
@@ -119,7 +119,7 @@
119
119
  update(recordId);
120
120
  }
121
121
  // 無事ループを抜けたならカーソルを閉じる
122
- cursorClose();
122
+ closeCursor();
123
123
  }
124
124
  }
125
125
  ```

7

修正

2018/02/15 02:02

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -59,7 +59,7 @@
59
59
  }
60
60
  }
61
61
 
62
- /** カーソルを宣言し、カーソル名を返す **/
62
+ /** カーソルを宣言す **/
63
63
  private String declareCursor() {
64
64
  try {
65
65
  sqlMapClient.startTransaction();

6

ソースコードの修正

2018/02/15 02:00

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -34,10 +34,11 @@
34
34
  public RecordEdit() {
35
35
  sqlMapClientent = baseDao.getSqlMapClient();
36
36
  recordIdList = new LinkedList<>();
37
+ cursorName = "cursorTest";
37
38
  }
38
39
 
39
40
  /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
40
- private Linkedlist<Long> fetchRecordIds(String cursorName) {
41
+ private Linkedlist<Long> fetchRecordIds() {
41
42
  try {
42
43
  // トランザクションの開始
43
44
  sqlMapClient.startTransaction();
@@ -59,17 +60,15 @@
59
60
  }
60
61
 
61
62
  /** カーソルを宣言し、カーソル名を返す **/
62
- private String getCursorName() {
63
+ private String declareCursor() {
63
64
  try {
64
65
  sqlMapClient.startTransaction();
65
66
 
66
- cursorName = "cursorTest";
67
67
  String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
68
68
  // カーソルの宣言(DECLARE)
69
69
  sqlMapClient.queryForList("Record.declareCursor", query);
70
70
 
71
71
  sqlMapClient.commitTransaction();
72
- return cursorName;
73
72
  } finally {
74
73
  // ここで宣言したカーソルが消える
75
74
  sqlMapClient.endTransaction();
@@ -108,7 +107,7 @@
108
107
  /** メイン処理 **/
109
108
  public void execute() {
110
109
  // カーソルを宣言
111
- cursorName = getCursorName();
110
+ declareCursor();
112
111
  while (true) {
113
112
  // idを取得
114
113
  long recordId = next();

5

いろいろ修正

2018/02/15 01:59

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -34,7 +34,6 @@
34
34
  public RecordEdit() {
35
35
  sqlMapClientent = baseDao.getSqlMapClient();
36
36
  recordIdList = new LinkedList<>();
37
- cursorName = "cursorTest";
38
37
  }
39
38
 
40
39
  /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
@@ -44,7 +43,7 @@
44
43
  sqlMapClient.startTransaction();
45
44
 
46
45
  // 1000件ずつ取得
47
- String newSqlStr = "FORWARD 1000 FROM " + cursorName;
46
+ String query = "FORWARD 1000 FROM " + cursorName;
48
47
  List<Map<String, String>> recordList = null;
49
48
  // レコード情報の取得(FETCH)
50
49
  recordList = sqlMapClient.queryForList("Record.fetch", query);
@@ -64,6 +63,7 @@
64
63
  try {
65
64
  sqlMapClient.startTransaction();
66
65
 
66
+ cursorName = "cursorTest";
67
67
  String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
68
68
  // カーソルの宣言(DECLARE)
69
69
  sqlMapClient.queryForList("Record.declareCursor", query);
@@ -126,8 +126,9 @@
126
126
  ```
127
127
 
128
128
  ### 試したこと
129
- 同じトランザクション内で処理を行えば、うまくできました。
129
+ トランザクションを別々にせずに、同じトランザクション内で処理を行えば、カーソルの処理はできました。
130
- しかし、件数が多すぎるとUPDATE処理にすごく時間がかかり、あまりよろしくありません(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)
130
+ しかし、件数が多すぎるとUPDATE処理にすごく時間がかかり、あまりよろしくありません(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)
131
+ UPDATE処理は別のトランザクションで処理した方が速いというのはこれまでの試験でわかっており(1レコード15msくらい)、どうしても別々のトランザクションで処理を行いたいと考えています。
131
132
 
132
133
  ### 補足情報(FW/ツールのバージョンなど)
133
134
 

4

ソースコードの更新

2018/02/15 01:53

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -40,6 +40,7 @@
40
40
  /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
41
41
  private Linkedlist<Long> fetchRecordIds(String cursorName) {
42
42
  try {
43
+ // トランザクションの開始
43
44
  sqlMapClient.startTransaction();
44
45
 
45
46
  // 1000件ずつ取得
@@ -49,9 +50,11 @@
49
50
  recordList = sqlMapClient.queryForList("Record.fetch", query);
50
51
  List<Long> resIdList = /** 取得したレコード情報からIDだけ抜き取る処理 **/
51
52
 
53
+ // 処理が成功したならコミット
52
54
  sqlMapClient.commitTransaction();
53
55
  return resIdList;
54
56
  } finally {
57
+ // 成功/失敗に関わらず、トランザクションの終了
55
58
  sqlMapClient.endTransaction();
56
59
  }
57
60
  }
@@ -86,15 +89,12 @@
86
89
  /** UPDATE処理を行う **/
87
90
  private void update(Long id) {
88
91
  try {
89
- // トランザクションの開始
90
92
  sqlMapClient.startTransaction();
91
93
 
92
94
  /** 指定されたIDに対してUPDATE処理 **/
93
95
 
94
- // 処理が成功したならコミット
95
96
  sqlMapClient.commitTransaction();
96
97
  } finally {
97
- // 成功/失敗に関わらず、トランザクションの終了
98
98
  sqlMapClient.endTransaction();
99
99
  }
100
100
  }

3

ソースコードの更新

2018/02/15 00:59

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -22,75 +22,106 @@
22
22
  ### 該当のソースコード
23
23
  簡略化してるので抜けがあるかもしれません。
24
24
  ```Java
25
- // メイン処理
26
- public void recordEdit() {
25
+ public class RecordEdit() {
26
+ // DBにアクセスするためのもの
27
+ final SqlMapClient sqlMapClientent;
28
+ // レコードIDを格納するリスト
29
+ Linkedlist<Long> recordIdList;
30
+ // カーソル名(本来は動的に決める)
31
+ String cursorName;
32
+
27
- // カーソルを宣言
33
+ // コンストラクタ
34
+ public RecordEdit() {
35
+ sqlMapClientent = baseDao.getSqlMapClient();
36
+ recordIdList = new LinkedList<>();
28
- String cursorName = getCursorName();
37
+ cursorName = "cursorTest";
29
- while (true) {
30
- long recordId = next(cursorName);
31
- // 次のレコードが無いならループを抜ける
32
- if (recordId == null) {
33
- break;
34
38
  }
39
+
35
- // UPDATE処理行う
40
+ /** 宣言されたカーソル使って1000件ずつフェッチしてくる **/
41
+ private Linkedlist<Long> fetchRecordIds(String cursorName) {
42
+ try {
36
- update(recordId);
43
+ sqlMapClient.startTransaction();
37
- }
38
- }
39
44
 
45
+ // 1000件ずつ取得
46
+ String newSqlStr = "FORWARD 1000 FROM " + cursorName;
47
+ List<Map<String, String>> recordList = null;
40
- // カーソルで取得したレコードIDリストからIDを一個ずつとりだす
48
+ // レコード情報の取得(FETCH)
49
+ recordList = sqlMapClient.queryForList("Record.fetch", query);
41
- Linkedlist<Long> recordIds = new LinkedList<>();
50
+ List<Long> resIdList = /** 取得したレコード情報からIDだけ抜き取る処理 **/
42
- private Long next(String cursorName) {
43
- if (recordIds.isEmpty()) {
44
- recordIds = fetchRecordIds(cursorName);
45
- }
46
- retrun recordIds.isEmpty() ? null : recordIds.removeFirst();
47
- }
48
51
 
49
- // UPDATE処理を行う
50
- private void update(long id) {
51
- try {
52
- sqlMapClient.startTransaction(); // トランザクションの開始
52
+ sqlMapClient.commitTransaction();
53
+ return resIdList;
54
+ } finally {
55
+ sqlMapClient.endTransaction();
56
+ }
57
+ }
53
58
 
54
- // 指定されたIDに対てUPDATE処理行っている //
59
+ /** カーソルを宣言、カーソル名返す **/
60
+ private String getCursorName() {
61
+ try {
62
+ sqlMapClient.startTransaction();
55
63
 
56
- sqlMapClient.commitTransaction(); // 処理が成功したならコミット
64
+ String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
57
- } finally {
65
+ // カーソルの宣言(DECLARE)
58
- sqlMapClient.endTransaction(); // 成功/失敗に関わらず、トランザクションの終了
66
+ sqlMapClient.queryForList("Record.declareCursor", query);
59
- }
60
- }
61
67
 
62
- // カーソルを宣言し、カーソル名を返す
63
- private String getCursorName() {
64
- try {
65
- sqlMapClient.startTransaction();
68
+ sqlMapClient.commitTransaction();
69
+ return cursorName;
70
+ } finally {
71
+ // ここで宣言したカーソルが消える
72
+ sqlMapClient.endTransaction();
73
+ }
74
+ }
75
+
76
+ /** カーソルで取得したレコードIDリストからIDを一個ずつとりだす **/
77
+ private Long next() {
78
+ // リストが空なら再びフェッチしてくる
79
+ if (recordIdList.isEmpty()) {
80
+ recordIdList = fetchRecordIds(cursorName);
81
+ }
82
+ // nullかidをを返す
83
+ return recordIdList.isEmpty() ? null : recordIdList.removeFirst();
84
+ }
66
85
 
86
+ /** UPDATE処理を行う **/
67
- String cursorName = "cursorTest"; // カーソル名
87
+ private void update(Long id) {
88
+ try {
68
- String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
89
+ // トランザクションの開始
69
- sqlMapClient.queryForList("Record.declareCursor", query); // カーソルの宣言
90
+ sqlMapClient.startTransaction();
70
91
 
71
- sqlMapClient.commitTransaction();
92
+ /** 指定されたIDに対してUPDATE処理 **/
72
93
 
94
+ // 処理が成功したならコミット
73
- return cursorName;
95
+ sqlMapClient.commitTransaction();
74
- } finally {
96
+ } finally {
97
+ // 成功/失敗に関わらず、トランザクションの終了
75
- sqlMapClient.endTransaction();
98
+ sqlMapClient.endTransaction();
76
- }
99
+ }
77
- }
100
+ }
78
101
 
102
+ /** カーソルのクローズ処理 **/
103
+ private void cursorClose() {
79
- // 宣言されたカーソルを使って1000件ずつフェッチしてく
104
+ // カーソルを閉じ(CLOSE)
80
- private Linkedlist<Long> fetchRecordIds(String cursorName) {
105
+ sqlMapClient.queryForList("Record.closeCursor", cursorName);
81
- try {
106
+ }
82
- sqlMapClient.startTransaction(); // ここでカーソルが消えており処理ができない。
83
-
84
- String newSqlStr = "FORWARD 1000 FROM " + cursorName; // 1000件ずつ取得
85
- List<Map<String, String>> recordList = sqlMapClient.queryForList("Record.fetch", query); // レコード情報の取得
86
- List<Long> resIdList = //取得したレコード情報からIDだけ抜き取る処理
87
107
 
108
+ /** メイン処理 **/
88
- sqlMapClient.commitTransaction();
109
+ public void execute() {
89
-
90
- return resIdList;
110
+ // カーソルを宣言
91
- } finally {
92
- sqlMapClient.endTransaction();
111
+ cursorName = getCursorName();
112
+ while (true) {
113
+ // idを取得
114
+ long recordId = next();
115
+ // 次のレコードが無いならループを抜ける
116
+ if (recordId == null) {
117
+ break;
93
- }
118
+ }
119
+ // UPDATE処理を行う
120
+ update(recordId);
121
+ }
122
+ // 無事ループを抜けたならカーソルを閉じる
123
+ cursorClose();
124
+ }
94
125
  }
95
126
  ```
96
127
 

2

2018/02/15 00:57

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -4,14 +4,14 @@
4
4
  少し古めのサービスでMyBatisではなく、iBATISにて動的なSQLを作成をしています。
5
5
 
6
6
  ・実現したいこと
7
- PostgreSQLのカーソルを使用して、大量にあるレコードを少しずつ取得しながらUPDATEをしようと考えた。
7
+ PostgreSQLのカーソルを使用して、大量にあるレコードを少しずつ取得しながらUPDATEをした
8
- これまでの実装から、カーソル取得するトランザクションと、実際にUPDATE処理を行うトランザクションとで分けて実装する必要があった。
8
+ 既存実装から、カーソルを宣言するトランザクションと、実際にUPDATE処理を行うトランザクションとで分けて実装する必要があった。
9
9
 
10
- そこで[ここ](https://www.postgresql.jp/document/9.6/html/sql-declare.html)に書いてあるとおりにカーソルを宣言する際に`CURSOR WITH HOLD FOR SELECT`とし、宣言したトランザクション外でも使えるようにした。
10
+ そこで[ここ](https://www.postgresql.jp/document/9.6/html/sql-declare.html)に書いてあるとおりにカーソルを宣言する際に`CURSOR WITH HOLD FOR SELECT`とし、宣言したトランザクション外でもカーソルが使えるようにしました。
11
11
 
12
- 別のトランザクションでカーソルを使おうとしたが、宣言したカーソルは存在しなくなっており、UPDATE処理がうまくできな
12
+ しかし、別のトランザクションでカーソルを使おうとしても、宣言したカーソルは存在しないとエラーが発生し、UPDATE処理ができなかった
13
13
 
14
- どうすればカーソルをほかのトランザクションでも使えるようになるか、他に何か気をつけなればならないことがあるのであればご教授お願いいたします。
14
+ どうすればカーソルをほかのトランザクションでも使えるようになるか、また、他に何か気をつけなればならないことがあるのであればご教授お願いいたします。
15
15
 
16
16
  ### 発生している問題・エラーメッセージ
17
17
 
@@ -39,7 +39,7 @@
39
39
 
40
40
  // カーソルで取得したレコードIDリストからIDを一個ずつとりだす
41
41
  Linkedlist<Long> recordIds = new LinkedList<>();
42
- private Long next(cursorName) {
42
+ private Long next(String cursorName) {
43
43
  if (recordIds.isEmpty()) {
44
44
  recordIds = fetchRecordIds(cursorName);
45
45
  }
@@ -96,7 +96,7 @@
96
96
 
97
97
  ### 試したこと
98
98
  同じトランザクション内で処理を行えば、うまくできました。
99
- しかし、件数が多すぎると、UPDATE処理にすごく時間がかかり、あまりよろしくありません。(列が10個レコード40㎳ぐらい)
99
+ しかし、件数が多すぎると、UPDATE処理にすごく時間がかかり、あまりよろしくありません。(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)
100
100
 
101
101
  ### 補足情報(FW/ツールのバージョンなど)
102
102
 

1

2018/02/14 15:48

投稿

tomy0732
tomy0732

スコア7

title CHANGED
File without changes
body CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  別のトランザクション内でカーソルを使おうとしたが、宣言したカーソルは存在しなくなっており、UPDATE処理がうまくできない。
13
13
 
14
- 他に何か気をつけなればならないことがあるとかそういうことがあればご教授お願いいたします。
14
+ どうすればカーソルをほかのトランザクションでも使えるようになるか、他に何か気をつけなればならないことがあるのであればご教授お願いいたします。
15
15
 
16
16
  ### 発生している問題・エラーメッセージ
17
17
 
@@ -20,6 +20,7 @@
20
20
  ちなみにカーソルが存在するかの確認は`SELECT * FROM pg_cursors;`を使い確認していた。
21
21
 
22
22
  ### 該当のソースコード
23
+ 簡略化してるので抜けがあるかもしれません。
23
24
  ```Java
24
25
  // メイン処理
25
26
  public void recordEdit() {