質問編集履歴

11

ソースの追記

2018/02/15 09:44

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -44,6 +44,8 @@
44
44
 
45
45
  簡略化してるので抜けがあるかもしれません。
46
46
 
47
+ 複数のトランザクションで処理
48
+
47
49
  ```Java
48
50
 
49
51
  public class RecordEdit() {
@@ -128,6 +130,8 @@
128
130
 
129
131
  try {
130
132
 
133
+ // トランザクションの開始
134
+
131
135
  sqlMapClient.startTransaction();
132
136
 
133
137
 
@@ -180,6 +184,8 @@
180
184
 
181
185
  try {
182
186
 
187
+ // トランザクションの開始
188
+
183
189
  sqlMapClient.startTransaction();
184
190
 
185
191
 
@@ -252,6 +258,180 @@
252
258
 
253
259
 
254
260
 
261
+ **追記**
262
+
263
+ 1つのトランザクションで処理
264
+
265
+ ```Java
266
+
267
+ public class RecordEdit() {
268
+
269
+ // DBにアクセスするためのもの
270
+
271
+ final SqlMapClient sqlMapClient = baseDao.getSqlMapClient();
272
+
273
+ // フェッチしてくる数を設定(1000件)
274
+
275
+ final int RECS_AT_ONCE = 1000;
276
+
277
+
278
+
279
+ // レコードIDを格納するリスト
280
+
281
+ Linkedlist<Long> recordIdList;
282
+
283
+ // カーソル名(本来は動的に決める)
284
+
285
+ String cursorName;
286
+
287
+
288
+
289
+ // コンストラクタ
290
+
291
+ public RecordEdit() {
292
+
293
+ recordIdList = new LinkedList<>();
294
+
295
+ cursorName = "cursorTest";
296
+
297
+ }
298
+
299
+
300
+
301
+ /** 宣言されたカーソルを使いフェッチしてくる **/
302
+
303
+ private Linkedlist<Long> fetchRecordIds() {
304
+
305
+ String query = "FORWARD " + RECS_AT_ONCE " FROM " + cursorName;
306
+
307
+ List<Map<String, String>> recordList = null;
308
+
309
+ // レコード情報の取得(FETCH)
310
+
311
+ recordList = sqlMapClient.queryForList("Record.fetch", query);
312
+
313
+ List<Long> resIdList = /** 取得したレコード情報からIDだけ抜き取る処理 **/
314
+
315
+ return resIdList;
316
+
317
+ }
318
+
319
+
320
+
321
+ /** カーソルを宣言する **/
322
+
323
+ private void declareCursor() {
324
+
325
+ String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
326
+
327
+ // カーソルの宣言(DECLARE)
328
+
329
+ sqlMapClient.queryForList("Record.declareCursor", query);
330
+
331
+ }
332
+
333
+
334
+
335
+ /** カーソルで取得したレコードIDリストからIDを一個ずつとりだす **/
336
+
337
+ private Long getNextId() {
338
+
339
+ // リストが空ならフェッチしてくる
340
+
341
+ if (recordIdList.isEmpty()) {
342
+
343
+ recordIdList = fetchRecordIds(cursorName);
344
+
345
+ }
346
+
347
+ // nullかidをを返す
348
+
349
+ return recordIdList.isEmpty() ? null : recordIdList.removeFirst();
350
+
351
+ }
352
+
353
+
354
+
355
+ /** UPDATE処理を行う **/
356
+
357
+ private void update(Long id) {
358
+
359
+ /** 指定されたIDに対してUPDATE処理 **/
360
+
361
+ }
362
+
363
+
364
+
365
+ /** カーソルのクローズ処理 **/
366
+
367
+ private void closeCursor() {
368
+
369
+ // カーソルを閉じる(CLOSE)
370
+
371
+ sqlMapClient.queryForList("Record.closeCursor", cursorName);
372
+
373
+ }
374
+
375
+
376
+
377
+ /** メイン処理 **/
378
+
379
+ public void execute() {
380
+
381
+ try {
382
+
383
+ // トランザクションの開始
384
+
385
+ sqlMapClient.startTransaction();
386
+
387
+ // カーソルを宣言
388
+
389
+ declareCursor();
390
+
391
+ while (true) {
392
+
393
+ // idを取得
394
+
395
+ long recordId = getNextId();
396
+
397
+ // 次のレコードが無いならループを抜ける
398
+
399
+ if (recordId == null) {
400
+
401
+ break;
402
+
403
+ }
404
+
405
+ // UPDATE処理を行う
406
+
407
+ update(recordId);
408
+
409
+ // 処理が成功したなら都度コミット
410
+
411
+ sqlMapClient.commitTransaction();
412
+
413
+ }
414
+
415
+ } finally {
416
+
417
+ // 成功/失敗に関わらず、トランザクションの終了
418
+
419
+ sqlMapClient.endTransaction();
420
+
421
+ // 無事ループを抜けたならカーソルを閉じる
422
+
423
+ closeCursor();
424
+
425
+ }
426
+
427
+ }
428
+
429
+ }
430
+
431
+ ```
432
+
433
+
434
+
255
435
  ### 試したこと
256
436
 
257
437
  トランザクションを別々にせずに、同じトランザクション内で処理を行えば、カーソルでの処理はできました。

10

ソースコードの修正

2018/02/15 09:44

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -50,7 +50,13 @@
50
50
 
51
51
  // DBにアクセスするためのもの
52
52
 
53
- final SqlMapClient sqlMapClient;
53
+ final SqlMapClient sqlMapClient = baseDao.getSqlMapClient();
54
+
55
+ // フェッチしてくる数を設定(1000件)
56
+
57
+ final int RECS_AT_ONCE = 1000;
58
+
59
+
54
60
 
55
61
  // レコードIDを格納するリスト
56
62
 
@@ -66,8 +72,6 @@
66
72
 
67
73
  public RecordEdit() {
68
74
 
69
- sqlMapClient = baseDao.getSqlMapClient();
70
-
71
75
  recordIdList = new LinkedList<>();
72
76
 
73
77
  cursorName = "cursorTest";
@@ -76,7 +80,7 @@
76
80
 
77
81
 
78
82
 
79
- /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
83
+ /** 宣言されたカーソルを使フェッチしてくる **/
80
84
 
81
85
  private Linkedlist<Long> fetchRecordIds() {
82
86
 
@@ -88,9 +92,7 @@
88
92
 
89
93
 
90
94
 
91
- // 1000件ずつ取得
92
-
93
- String query = "FORWARD 1000 FROM " + cursorName;
95
+ String query = "FORWARD " + RECS_AT_ONCE " FROM " + cursorName;
94
96
 
95
97
  List<Map<String, String>> recordList = null;
96
98
 
@@ -122,7 +124,7 @@
122
124
 
123
125
  /** カーソルを宣言する **/
124
126
 
125
- private String declareCursor() {
127
+ private void declareCursor() {
126
128
 
127
129
  try {
128
130
 
@@ -142,7 +144,7 @@
142
144
 
143
145
  } finally {
144
146
 
145
- // ここで宣言したカーソルが消える
147
+ // ここで宣言したカーソルが消える
146
148
 
147
149
  sqlMapClient.endTransaction();
148
150
 
@@ -154,9 +156,9 @@
154
156
 
155
157
  /** カーソルで取得したレコードIDリストからIDを一個ずつとりだす **/
156
158
 
157
- private Long next() {
159
+ private Long getNextId() {
158
-
160
+
159
- // リストが空なら再びフェッチしてくる
161
+ // リストが空ならフェッチしてくる
160
162
 
161
163
  if (recordIdList.isEmpty()) {
162
164
 
@@ -222,7 +224,7 @@
222
224
 
223
225
  // idを取得
224
226
 
225
- long recordId = next();
227
+ long recordId = getNextId();
226
228
 
227
229
  // 次のレコードが無いならループを抜ける
228
230
 

9

修正

2018/02/15 02:20

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
  // DBにアクセスするためのもの
52
52
 
53
- final SqlMapClient sqlMapClientent;
53
+ final SqlMapClient sqlMapClient;
54
54
 
55
55
  // レコードIDを格納するリスト
56
56
 
@@ -66,7 +66,7 @@
66
66
 
67
67
  public RecordEdit() {
68
68
 
69
- sqlMapClientent = baseDao.getSqlMapClient();
69
+ sqlMapClient = baseDao.getSqlMapClient();
70
70
 
71
71
  recordIdList = new LinkedList<>();
72
72
 

8

修正

2018/02/15 02:03

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -200,7 +200,7 @@
200
200
 
201
201
  /** カーソルのクローズ処理 **/
202
202
 
203
- private void cursorClose() {
203
+ private void closeCursor() {
204
204
 
205
205
  // カーソルを閉じる(CLOSE)
206
206
 
@@ -240,7 +240,7 @@
240
240
 
241
241
  // 無事ループを抜けたならカーソルを閉じる
242
242
 
243
- cursorClose();
243
+ closeCursor();
244
244
 
245
245
  }
246
246
 

7

修正

2018/02/15 02:02

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- /** カーソルを宣言し、カーソル名を返す **/
123
+ /** カーソルを宣言す **/
124
124
 
125
125
  private String declareCursor() {
126
126
 

6

ソースコードの修正

2018/02/15 02:00

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -70,13 +70,15 @@
70
70
 
71
71
  recordIdList = new LinkedList<>();
72
72
 
73
+ cursorName = "cursorTest";
74
+
73
75
  }
74
76
 
75
77
 
76
78
 
77
79
  /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
78
80
 
79
- private Linkedlist<Long> fetchRecordIds(String cursorName) {
81
+ private Linkedlist<Long> fetchRecordIds() {
80
82
 
81
83
  try {
82
84
 
@@ -120,7 +122,7 @@
120
122
 
121
123
  /** カーソルを宣言し、カーソル名を返す **/
122
124
 
123
- private String getCursorName() {
125
+ private String declareCursor() {
124
126
 
125
127
  try {
126
128
 
@@ -128,8 +130,6 @@
128
130
 
129
131
 
130
132
 
131
- cursorName = "cursorTest";
132
-
133
133
  String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
134
134
 
135
135
  // カーソルの宣言(DECLARE)
@@ -140,8 +140,6 @@
140
140
 
141
141
  sqlMapClient.commitTransaction();
142
142
 
143
- return cursorName;
144
-
145
143
  } finally {
146
144
 
147
145
  // ここで宣言したカーソルが消える
@@ -218,7 +216,7 @@
218
216
 
219
217
  // カーソルを宣言
220
218
 
221
- cursorName = getCursorName();
219
+ declareCursor();
222
220
 
223
221
  while (true) {
224
222
 

5

いろいろ修正

2018/02/15 01:59

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -70,8 +70,6 @@
70
70
 
71
71
  recordIdList = new LinkedList<>();
72
72
 
73
- cursorName = "cursorTest";
74
-
75
73
  }
76
74
 
77
75
 
@@ -90,7 +88,7 @@
90
88
 
91
89
  // 1000件ずつ取得
92
90
 
93
- String newSqlStr = "FORWARD 1000 FROM " + cursorName;
91
+ String query = "FORWARD 1000 FROM " + cursorName;
94
92
 
95
93
  List<Map<String, String>> recordList = null;
96
94
 
@@ -130,6 +128,8 @@
130
128
 
131
129
 
132
130
 
131
+ cursorName = "cursorTest";
132
+
133
133
  String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
134
134
 
135
135
  // カーソルの宣言(DECLARE)
@@ -254,9 +254,11 @@
254
254
 
255
255
  ### 試したこと
256
256
 
257
- 同じトランザクション内で処理を行えば、うまくできました。
257
+ トランザクションを別々にせずに、同じトランザクション内で処理を行えば、カーソルの処理はできました。
258
-
258
+
259
- しかし、件数が多すぎるとUPDATE処理にすごく時間がかかり、あまりよろしくありません(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)
259
+ しかし、件数が多すぎるとUPDATE処理にすごく時間がかかり、あまりよろしくありません(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)
260
+
261
+ UPDATE処理は別のトランザクションで処理した方が速いというのはこれまでの試験でわかっており(1レコード15msくらい)、どうしても別々のトランザクションで処理を行いたいと考えています。
260
262
 
261
263
 
262
264
 

4

ソースコードの更新

2018/02/15 01:53

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -82,6 +82,8 @@
82
82
 
83
83
  try {
84
84
 
85
+ // トランザクションの開始
86
+
85
87
  sqlMapClient.startTransaction();
86
88
 
87
89
 
@@ -100,12 +102,16 @@
100
102
 
101
103
 
102
104
 
105
+ // 処理が成功したならコミット
106
+
103
107
  sqlMapClient.commitTransaction();
104
108
 
105
109
  return resIdList;
106
110
 
107
111
  } finally {
108
112
 
113
+ // 成功/失敗に関わらず、トランザクションの終了
114
+
109
115
  sqlMapClient.endTransaction();
110
116
 
111
117
  }
@@ -174,8 +180,6 @@
174
180
 
175
181
  try {
176
182
 
177
- // トランザクションの開始
178
-
179
183
  sqlMapClient.startTransaction();
180
184
 
181
185
 
@@ -184,14 +188,10 @@
184
188
 
185
189
 
186
190
 
187
- // 処理が成功したならコミット
188
-
189
191
  sqlMapClient.commitTransaction();
190
192
 
191
193
  } finally {
192
194
 
193
- // 成功/失敗に関わらず、トランザクションの終了
194
-
195
195
  sqlMapClient.endTransaction();
196
196
 
197
197
  }

3

ソースコードの更新

2018/02/15 00:59

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -46,146 +46,208 @@
46
46
 
47
47
  ```Java
48
48
 
49
- // メイン処理
50
-
51
- public void recordEdit() {
52
-
53
- // カーソルを宣言
54
-
55
- String cursorName = getCursorName();
56
-
57
- while (true) {
58
-
59
- long recordId = next(cursorName);
60
-
61
- // 次のレコードが無いならループを抜ける
62
-
63
- if (recordId == null) {
64
-
65
- break;
66
-
67
- }
68
-
69
- // UPDATE処理を行う
70
-
71
- update(recordId);
72
-
73
- }
49
+ public class RecordEdit() {
50
+
51
+ // DBにアクセスするためのもの
52
+
53
+ final SqlMapClient sqlMapClientent;
54
+
55
+ // レコードIDを格納するリスト
56
+
57
+ Linkedlist<Long> recordIdList;
58
+
59
+ // カーソル名(本来は動的に決める)
60
+
61
+ String cursorName;
62
+
63
+
64
+
65
+ // コンストラクタ
66
+
67
+ public RecordEdit() {
68
+
69
+ sqlMapClientent = baseDao.getSqlMapClient();
70
+
71
+ recordIdList = new LinkedList<>();
72
+
73
+ cursorName = "cursorTest";
74
+
75
+ }
76
+
77
+
78
+
79
+ /** 宣言されたカーソルを使って1000件ずつフェッチしてくる **/
80
+
81
+ private Linkedlist<Long> fetchRecordIds(String cursorName) {
82
+
83
+ try {
84
+
85
+ sqlMapClient.startTransaction();
86
+
87
+
88
+
89
+ // 1000件ずつ取得
90
+
91
+ String newSqlStr = "FORWARD 1000 FROM " + cursorName;
92
+
93
+ List<Map<String, String>> recordList = null;
94
+
95
+ // レコード情報の取得(FETCH)
96
+
97
+ recordList = sqlMapClient.queryForList("Record.fetch", query);
98
+
99
+ List<Long> resIdList = /** 取得したレコード情報からIDだけ抜き取る処理 **/
100
+
101
+
102
+
103
+ sqlMapClient.commitTransaction();
104
+
105
+ return resIdList;
106
+
107
+ } finally {
108
+
109
+ sqlMapClient.endTransaction();
110
+
111
+ }
112
+
113
+ }
114
+
115
+
116
+
117
+ /** カーソルを宣言し、カーソル名を返す **/
118
+
119
+ private String getCursorName() {
120
+
121
+ try {
122
+
123
+ sqlMapClient.startTransaction();
124
+
125
+
126
+
127
+ String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
128
+
129
+ // カーソルの宣言(DECLARE)
130
+
131
+ sqlMapClient.queryForList("Record.declareCursor", query);
132
+
133
+
134
+
135
+ sqlMapClient.commitTransaction();
136
+
137
+ return cursorName;
138
+
139
+ } finally {
140
+
141
+ // ここで宣言したカーソルが消える
142
+
143
+ sqlMapClient.endTransaction();
144
+
145
+ }
146
+
147
+ }
148
+
149
+
150
+
151
+ /** カーソルで取得したレコードIDリストからIDを一個ずつとりだす **/
152
+
153
+ private Long next() {
154
+
155
+ // リストが空なら再びフェッチしてくる
156
+
157
+ if (recordIdList.isEmpty()) {
158
+
159
+ recordIdList = fetchRecordIds(cursorName);
160
+
161
+ }
162
+
163
+ // nullかidをを返す
164
+
165
+ return recordIdList.isEmpty() ? null : recordIdList.removeFirst();
166
+
167
+ }
168
+
169
+
170
+
171
+ /** UPDATE処理を行う **/
172
+
173
+ private void update(Long id) {
174
+
175
+ try {
176
+
177
+ // トランザクションの開始
178
+
179
+ sqlMapClient.startTransaction();
180
+
181
+
182
+
183
+ /** 指定されたIDに対してUPDATE処理 **/
184
+
185
+
186
+
187
+ // 処理が成功したならコミット
188
+
189
+ sqlMapClient.commitTransaction();
190
+
191
+ } finally {
192
+
193
+ // 成功/失敗に関わらず、トランザクションの終了
194
+
195
+ sqlMapClient.endTransaction();
196
+
197
+ }
198
+
199
+ }
200
+
201
+
202
+
203
+ /** カーソルのクローズ処理 **/
204
+
205
+ private void cursorClose() {
206
+
207
+ // カーソルを閉じる(CLOSE)
208
+
209
+ sqlMapClient.queryForList("Record.closeCursor", cursorName);
210
+
211
+ }
212
+
213
+
214
+
215
+ /** メイン処理 **/
216
+
217
+ public void execute() {
218
+
219
+ // カーソルを宣言
220
+
221
+ cursorName = getCursorName();
222
+
223
+ while (true) {
224
+
225
+ // idを取得
226
+
227
+ long recordId = next();
228
+
229
+ // 次のレコードが無いならループを抜ける
230
+
231
+ if (recordId == null) {
232
+
233
+ break;
234
+
235
+ }
236
+
237
+ // UPDATE処理を行う
238
+
239
+ update(recordId);
240
+
241
+ }
242
+
243
+ // 無事ループを抜けたならカーソルを閉じる
244
+
245
+ cursorClose();
246
+
247
+ }
74
248
 
75
249
  }
76
250
 
77
-
78
-
79
- // カーソルで取得したレコードIDリストからIDを一個ずつとりだす
80
-
81
- Linkedlist<Long> recordIds = new LinkedList<>();
82
-
83
- private Long next(String cursorName) {
84
-
85
- if (recordIds.isEmpty()) {
86
-
87
- recordIds = fetchRecordIds(cursorName);
88
-
89
- }
90
-
91
- retrun recordIds.isEmpty() ? null : recordIds.removeFirst();
92
-
93
- }
94
-
95
-
96
-
97
- // UPDATE処理を行う
98
-
99
- private void update(long id) {
100
-
101
- try {
102
-
103
- sqlMapClient.startTransaction(); // トランザクションの開始
104
-
105
-
106
-
107
- // 指定されたIDに対してUPDATE処理を行っている //
108
-
109
-
110
-
111
- sqlMapClient.commitTransaction(); // 処理が成功したならコミット
112
-
113
- } finally {
114
-
115
- sqlMapClient.endTransaction(); // 成功/失敗に関わらず、トランザクションの終了
116
-
117
- }
118
-
119
- }
120
-
121
-
122
-
123
- // カーソルを宣言し、カーソル名を返す
124
-
125
- private String getCursorName() {
126
-
127
- try {
128
-
129
- sqlMapClient.startTransaction();
130
-
131
-
132
-
133
- String cursorName = "cursorTest"; // カーソル名
134
-
135
- String query = cursorName + " CURSOR WITH HOLD FOR SELECT * FROM testTable";
136
-
137
- sqlMapClient.queryForList("Record.declareCursor", query); // カーソルの宣言
138
-
139
-
140
-
141
- sqlMapClient.commitTransaction();
142
-
143
-
144
-
145
- return cursorName;
146
-
147
- } finally {
148
-
149
- sqlMapClient.endTransaction();
150
-
151
- }
152
-
153
- }
154
-
155
-
156
-
157
- // 宣言されたカーソルを使って1000件ずつフェッチしてくる
158
-
159
- private Linkedlist<Long> fetchRecordIds(String cursorName) {
160
-
161
- try {
162
-
163
- sqlMapClient.startTransaction(); // ここでカーソルが消えており処理ができない。
164
-
165
-
166
-
167
- String newSqlStr = "FORWARD 1000 FROM " + cursorName; // 1000件ずつ取得
168
-
169
- List<Map<String, String>> recordList = sqlMapClient.queryForList("Record.fetch", query); // レコード情報の取得
170
-
171
- List<Long> resIdList = //取得したレコード情報からIDだけ抜き取る処理
172
-
173
-
174
-
175
- sqlMapClient.commitTransaction();
176
-
177
-
178
-
179
- return resIdList;
180
-
181
- } finally {
182
-
183
- sqlMapClient.endTransaction();
184
-
185
- }
186
-
187
- }
188
-
189
251
  ```
190
252
 
191
253
 

2

2018/02/15 00:57

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -10,21 +10,21 @@
10
10
 
11
11
  ・実現したいこと
12
12
 
13
- PostgreSQLのカーソルを使用して、大量にあるレコードを少しずつ取得しながらUPDATEをしようと考えた。
13
+ PostgreSQLのカーソルを使用して、大量にあるレコードを少しずつ取得しながらUPDATEをした
14
-
14
+
15
- これまでの実装から、カーソル取得するトランザクションと、実際にUPDATE処理を行うトランザクションとで分けて実装する必要があった。
15
+ 既存実装から、カーソルを宣言するトランザクションと、実際にUPDATE処理を行うトランザクションとで分けて実装する必要があった。
16
-
17
-
18
-
16
+
17
+
18
+
19
- そこで[ここ](https://www.postgresql.jp/document/9.6/html/sql-declare.html)に書いてあるとおりにカーソルを宣言する際に`CURSOR WITH HOLD FOR SELECT`とし、宣言したトランザクション外でも使えるようにした。
19
+ そこで[ここ](https://www.postgresql.jp/document/9.6/html/sql-declare.html)に書いてあるとおりにカーソルを宣言する際に`CURSOR WITH HOLD FOR SELECT`とし、宣言したトランザクション外でもカーソルが使えるようにしました。
20
-
21
-
22
-
20
+
21
+
22
+
23
- 別のトランザクションでカーソルを使おうとしたが、宣言したカーソルは存在しなくなっており、UPDATE処理がうまくできな
23
+ しかし、別のトランザクションでカーソルを使おうとしても、宣言したカーソルは存在しないとエラーが発生し、UPDATE処理ができなかった
24
-
25
-
26
-
24
+
25
+
26
+
27
- どうすればカーソルをほかのトランザクションでも使えるようになるか、他に何か気をつけなればならないことがあるのであればご教授お願いいたします。
27
+ どうすればカーソルをほかのトランザクションでも使えるようになるか、また、他に何か気をつけなればならないことがあるのであればご教授お願いいたします。
28
28
 
29
29
 
30
30
 
@@ -80,7 +80,7 @@
80
80
 
81
81
  Linkedlist<Long> recordIds = new LinkedList<>();
82
82
 
83
- private Long next(cursorName) {
83
+ private Long next(String cursorName) {
84
84
 
85
85
  if (recordIds.isEmpty()) {
86
86
 
@@ -194,7 +194,7 @@
194
194
 
195
195
  同じトランザクション内で処理を行えば、うまくできました。
196
196
 
197
- しかし、件数が多すぎると、UPDATE処理にすごく時間がかかり、あまりよろしくありません。(列が10個レコード40㎳ぐらい)
197
+ しかし、件数が多すぎると、UPDATE処理にすごく時間がかかり、あまりよろしくありません。(テーブルの列が10個で1レコード40㎳ぐらい、1万レコードだと400sかかる)
198
198
 
199
199
 
200
200
 

1

2018/02/14 15:48

投稿

tomy0732
tomy0732

スコア7

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- 他に何か気をつけなればならないことがあるとかそういうことがあればご教授お願いいたします。
27
+ どうすればカーソルをほかのトランザクションでも使えるようになるか、他に何か気をつけなればならないことがあるのであればご教授お願いいたします。
28
28
 
29
29
 
30
30
 
@@ -42,6 +42,8 @@
42
42
 
43
43
  ### 該当のソースコード
44
44
 
45
+ 簡略化してるので抜けがあるかもしれません。
46
+
45
47
  ```Java
46
48
 
47
49
  // メイン処理