• R/O
  • SSH

JdbcAcsess2: Commit

全てを再実装したJdbcAcsessです。


Commit MetaInfo

Revisionf120f1ba90be074b9e16741c2c44bfcccd54bdfc (tree)
Time2012-02-19 11:05:21
Authorshimakazuro
Commitershimakazuro

Log Message

statement cancel を入れてみる。問題あるかも…

Change Summary

Incremental Difference

diff -r 27d3e75b898e -r f120f1ba90be src/jdbcacsess2/connect/ConnectView.java
--- a/src/jdbcacsess2/connect/ConnectView.java Sat Feb 18 20:11:31 2012 +0900
+++ b/src/jdbcacsess2/connect/ConnectView.java Sun Feb 19 11:05:21 2012 +0900
@@ -21,6 +21,7 @@
2121 import java.awt.GridBagConstraints;
2222 import java.awt.GridBagLayout;
2323 import java.awt.Insets;
24+import java.awt.Point;
2425 import java.awt.event.KeyEvent;
2526 import java.sql.SQLException;
2627
@@ -99,8 +100,9 @@
99100 public void collectViewConnect(ConfigViewConnect c) throws SQLException {
100101 c.setWidth(getWidth());
101102 c.setHeight(getHeight());
102- c.setX(getX());
103- c.setY(getY());
103+ Point p = getLocationOnScreen();
104+ c.setX(p.x);
105+ c.setY(p.y);
104106 c.setDividerLocation(jSplitPane.getDividerLocation());
105107 c.setLastDividerLocation(jSplitPane.getLastDividerLocation());
106108 }
diff -r 27d3e75b898e -r f120f1ba90be src/jdbcacsess2/main/MainController.java
--- a/src/jdbcacsess2/main/MainController.java Sat Feb 18 20:11:31 2012 +0900
+++ b/src/jdbcacsess2/main/MainController.java Sun Feb 19 11:05:21 2012 +0900
@@ -467,6 +467,7 @@
467467 public void dataBaseConnectionOpened(DataBaseConnection dbc) {
468468 Jdbcacsess2.logger.info(dbc + " " + dbc.getUrl());
469469
470+ // sessionボタンで、接続/切断を行った時は、接続後処理を行わない。
470471 if (view.getCurrentJPanelSession().getJTabbedPaneSql().indexOfComponent(jPanelSql) == -1) {
471472 SwingUtilities.invokeLater(openedWorker);
472473 }
diff -r 27d3e75b898e -r f120f1ba90be src/jdbcacsess2/main/MainView.java
--- a/src/jdbcacsess2/main/MainView.java Sat Feb 18 20:11:31 2012 +0900
+++ b/src/jdbcacsess2/main/MainView.java Sun Feb 19 11:05:21 2012 +0900
@@ -17,6 +17,7 @@
1717
1818 import java.awt.BorderLayout;
1919 import java.awt.Event;
20+import java.awt.Point;
2021 import java.awt.event.KeyEvent;
2122
2223 import javax.swing.JFrame;
@@ -130,8 +131,9 @@
130131 public void collectViewMain(ConfigViewMain c) {
131132 c.setWidth(getWidth());
132133 c.setHeight(getHeight());
133- c.setX(getX());
134- c.setY(getY());
134+ Point p = getLocationOnScreen();
135+ c.setX(p.x);
136+ c.setY(p.y);
135137
136138 // JPanelSession 関連
137139 JPanelSession jPanelSession = getCurrentJPanelSession();
diff -r 27d3e75b898e -r f120f1ba90be src/jdbcacsess2/sqlService/SqlAsyncExecute.java
--- a/src/jdbcacsess2/sqlService/SqlAsyncExecute.java Sat Feb 18 20:11:31 2012 +0900
+++ b/src/jdbcacsess2/sqlService/SqlAsyncExecute.java Sun Feb 19 11:05:21 2012 +0900
@@ -218,6 +218,13 @@
218218
219219 @Override
220220 public void dataBaseConnectionClosing(DataBaseConnection dataBaseConnection) {
221+ if (preparedStatement != null) {
222+ try {
223+ preparedStatement.cancel();
224+ } catch (Exception e) {
225+ ShowDialog.errorMessage(e);
226+ }
227+ }
221228 taskCancel();
222229 taskJoin(DataBaseConnection.TIMEOUT_SECONDS);
223230 }
@@ -231,287 +238,287 @@
231238 /**
232239 * コンストラクタ。
233240 */
234- public SqlTask(DataBaseConnection dataBaseConnection) {
235- this.dataBaseConnection = dataBaseConnection;
236- }
237-
238- /**
239- * スレッド実行メソッド
240- */
241- public void run() {
242- Jdbcacsess2.logger.info("(task)beging.");
243-
244- // コネクションクローズ時に、スレッドの後始末を自動的に行う為、リスナー登録
245- dataBaseConnection.addConnectionListener(changeConnection);
246-
247- for (SqlExecuteSentence sentence : sqlExecuteSentenceList) {
248- if (Thread.interrupted()) {
249- Jdbcacsess2.logger.info(" (task)canceled.");
250- break;
251- }
252- sqlExec(sentence);
253- }
254-
255- // 全てのSQLが終了した時にロックを開放する
256- try {
257- dataBaseConnection.unlockConnection();
258- } catch (DbConnectIllgalStateException e) {
259- // ありえない例外
260- e.printStackTrace();
261- throw new RuntimeException(e);
262- }
263-
264- // 後始末リスナーの削除
265- dataBaseConnection.removeConnectionlisteners(changeConnection);
266-
267- for (SqlExecutedListener l : sqlExecutedListeners) {
268- l.executeAllEnd();
269- }
270- }
271-
272- private void sqlExec(SqlExecuteSentence sqlExecuteSentence) {
273- sqlTaskThrow = null;
274- timeMillisThreadStart = System.currentTimeMillis();
275- timeMillisThreadEnd = 0;
276- rowCnt = 0;
277- try {
278- Jdbcacsess2.logger.info(" (Statement)EXECSQL=[" + sqlExecuteSentence.getSqlSentence() + "]");
279- for (SqlExecutedListener l : sqlExecutedListeners) {
280- l.executBegin(sqlExecuteSentence);
281- }
282-
283- if (sqlExecuteSentence.getSqlCommand().equals("CALL")) {
284- preparedStatement = dataBaseConnection.prepareCall(sqlExecuteSentence.getSqlSentence());
285- } else {
286- preparedStatement = dataBaseConnection.prepareStatement(sqlExecuteSentence.getSqlSentence());
287- }
288-
289- // パラメータ取り込み処理がfalseを返すまで繰り返す
290- SqlInputParameter sqlInputParameter = sqlExecuteSentence.getSqlInputParameter();
291-
292- while (sqlInputParameter.getSqlExecuteParmeter().hasNext()) {
293- if (Thread.interrupted()) {
294- Jdbcacsess2.logger.info(" (task)canceled.");
295- break;
296- }
297-
298- // パラメータ設定を呼び出す
299- Parameter parameter = sqlInputParameter.getSqlExecuteParmeter().getParameter();
300-
301- // preparedStatementのパラメータ設定
302- setParameters(sqlInputParameter.getInputItemNames(), parameter);
303-
304- // SQL実行し、結果により受け取る方法を振り分ける
305- if (preparedStatement.execute()) {
306- readResultSet();
307- } else {
308- rowCnt += preparedStatement.getUpdateCount();
309- }
310-
311- }
312-
313- } catch (Throwable t) {
314- t.printStackTrace();
315- sqlTaskThrow = t;
316- } finally {
317- try {
318- if (preparedStatement != null) {
319- preparedStatement.close();
320- Jdbcacsess2.logger.info(" (task)Statement closed");
321- }
322- } catch (SQLException e) {
323- Jdbcacsess2.logger.log(Level.WARNING, "WARNING", e);
324- } finally {
325- preparedStatement = null;
326-
327- timeMillisThreadEnd = System.currentTimeMillis();
328-
329- if (sqlTaskThrow == null) {
330- for (SqlExecutedListener l : sqlExecutedListeners) {
331- l.executNormalFinish(rowCnt);
332- }
333- Jdbcacsess2.logger.info(" (task)noramal end. cnt=[" + rowCnt + "] "
334- + (timeMillisThreadEnd - timeMillisThreadStart) + "ms");
335- } else {
336- for (SqlExecutedListener l : sqlExecutedListeners) {
337- l.executeException(sqlTaskThrow);
338- }
339- Jdbcacsess2.logger.info(" (task)abnormal end. cnt=[" + rowCnt + "] "
340- + (timeMillisThreadEnd - timeMillisThreadStart) + "ms");
341- }
342-
343- }
344- }
345- }
346-
347- /**
348- * JDBCprepareステートメントのパラメータを設定する。
349- *
350- * @param sqlInputItems
351- * パラメータ名称リスト
352- * @param p
353- * KEY=パラメータリストのインデックス/VALUE=SQL型 のマップ。
354- */
355- private void setParameters(ArrayList<String> sqlInputItems, Parameter p)
356- throws SQLException {
357-
358- Jdbcacsess2.logger.fine(" (setParameters)VALUES=" + p.values + "SQLTYPES=" + p.sqlTypes + "");
359-
360- if (sqlInputItems.size() != p.values.size()) {
361- throw new IllegalArgumentException("入力パラ数が分析結果と不一致:" + "Input=" + p.values.size() + " analized="
362- + sqlInputItems);
363- }
364-
365- for (int i = 0; i < p.values.size(); i++) {
366- Object o = p.values.get(i);
367- ConstSqlTypes constSqlTypes = p.sqlTypes.get(i);
241+ public SqlTask(DataBaseConnection dataBaseConnection) {
242+ this.dataBaseConnection = dataBaseConnection;
243+ }
368244
369- if (constSqlTypes == null) {
370- preparedStatement.setObject(i + 1, o);
371- } else {
372- preparedStatement.setObject(i + 1, o, constSqlTypes.getValue());
373- Jdbcacsess2.logger.fine(" (setParameters)" + constSqlTypes);
374- }
375- }
376- }
377-
378- /**
379- * 検索結果を取り出す
380- *
381- * @throws Throwable
382- */
383- private void readResultSet() throws Throwable {
384-
385- ResultSet resultSet = preparedStatement.getResultSet();
386- // getMetaData()は、getResultSet()を実行してから行う。
387- // sqliteは、"IllegalStateException: SQLite JDBC: inconsistent internal state"
388- // 例外が発生する。
389- List<ColumnAttributeResult> list = ColumnAttributeResult.convColumnAttributeResult(resultSet.getMetaData());
390-
391- Jdbcacsess2.logger.info(" (task)resultSet opened.");
392- for (SqlExecutedListener l : sqlExecutedListeners) {
393- l.resultHeader(list);
394- }
395-
396- int columnCnt = list.size();
397-
398- try {
399- while (resultSet.next()) {
400- synchronized (this) {
401- if (Thread.interrupted()) {
402- Jdbcacsess2.logger.info(" (task)canceled.");
403- break;
404- }
405- ArrayList<Object> results = new ArrayList<Object>(columnCnt);
406- for (int i = 1; i <= columnCnt; i++) {
407- results.add(resultSet.getObject(i));
408- }
409-
410- rowCnt++;
411- for (SqlExecutedListener l : sqlExecutedListeners) {
412- l.resultDetail(rowCnt, results);
413- }
414- Jdbcacsess2.logger.finest(" (task)results notified.");
415-
416- if (rowCnt % resultRowLimitCnt == 0) {
417-
418- available = true;
419- new Thread() {
420- @Override
421- public void run() {
422- for (SqlExecutedListener l : sqlExecutedListeners) {
423- l.statusContinue(rowCnt);
424- }
425- }
426- }.start();
427- Jdbcacsess2.logger.info(" (task)waiting.");
245+ /**
246+ * スレッド実行メソッド
247+ */
248+ public void run() {
249+ Jdbcacsess2.logger.info("(task)beging.");
428250
429- while (available) {
430- try {
431- wait();
432- } catch (InterruptedException e) {
433- Jdbcacsess2.logger.fine(" (task)interrupted.");
434- // wait() により割り込みフラグがクリアされたので、
435- // 自身にもう一度割り込みをかける。ループ脱出をを検知させる為。
436- Thread.currentThread().interrupt();
437- break;
438- }
439- }
440- Jdbcacsess2.logger.info(" (task)wake up.");
441- }
442- }
443- }
444- } catch (Throwable t) {
445- throw t;
446- } finally {
447- resultSet.close();
448- Jdbcacsess2.logger.info(" (task)resultSet closed.");
449- }
450- }
451-
452- /**
453- * 待機中のSQL実行スレッドを再開する
454- */
455- @Override
456- public void taskWakeUp() {
457- synchronized (this) {
458- available = false;
459- notifyAll();
460- }
461- }
462-
463- /**
464- * 実行中のSQL実行スレッドを中止を要求する
465- */
466- @Override
467- public void taskCancel() {
468- thread.interrupt();
469- }
251+ // コネクションクローズ時に、スレッドの後始末を自動的に行う為、リスナー登録
252+ dataBaseConnection.addConnectionListener(changeConnection);
470253
471- /**
472- * SQL実行スレッドの終了を待ち合わせる
473- */
474- @Override
475- public void taskJoin(int timeoutSeconds) {
476- Jdbcacsess2.logger.info(" (join)joining...");
477- try {
478- Executors.newSingleThreadExecutor().submit(new Callable<Object>() {
479- @Override
480- public Object call() throws Exception {
481- thread.join();
482- return null;
483- }
484- }).get(timeoutSeconds, TimeUnit.SECONDS);
485- } catch (InterruptedException e) {
486- Jdbcacsess2.logger.log(Level.WARNING, "WARNING", e);
487- } catch (ExecutionException e) {
488- e.printStackTrace();
489- } catch (TimeoutException e) {
490- ShowDialog.errorMessage(e);
491- }
492- Jdbcacsess2.logger.info(" (join)joined.");
493- }
254+ for (SqlExecuteSentence sentence : sqlExecuteSentenceList) {
255+ if (Thread.interrupted()) {
256+ Jdbcacsess2.logger.info(" (task)canceled.");
257+ break;
258+ }
259+ sqlExec(sentence);
260+ }
494261
495- /**
496- *
497- * @return 処理時間 単位はミリ秒
498- */
499- @Override
500- public long getExecutionTime() {
501- if (timeMillisThreadStart == 0) {
502- return 0;
503- }
504- if (timeMillisThreadEnd == 0) {
505- return 0;
506- }
507- return timeMillisThreadEnd - timeMillisThreadStart;
508- }
262+ // 全てのSQLが終了した時にロックを開放する
263+ try {
264+ dataBaseConnection.unlockConnection();
265+ } catch (DbConnectIllgalStateException e) {
266+ // ありえない例外
267+ e.printStackTrace();
268+ throw new RuntimeException(e);
269+ }
509270
510- @Override
511- public int getCnt() {
512- return sqlExecuteSentenceList.size();
271+ // 後始末リスナーの削除
272+ dataBaseConnection.removeConnectionlisteners(changeConnection);
513273
514- }
274+ for (SqlExecutedListener l : sqlExecutedListeners) {
275+ l.executeAllEnd();
276+ }
277+ }
278+
279+ private void sqlExec(SqlExecuteSentence sqlExecuteSentence) {
280+ sqlTaskThrow = null;
281+ timeMillisThreadStart = System.currentTimeMillis();
282+ timeMillisThreadEnd = 0;
283+ rowCnt = 0;
284+ try {
285+ Jdbcacsess2.logger.info(" (Statement)EXECSQL=[" + sqlExecuteSentence.getSqlSentence() + "]");
286+ for (SqlExecutedListener l : sqlExecutedListeners) {
287+ l.executBegin(sqlExecuteSentence);
288+ }
289+
290+ if (sqlExecuteSentence.getSqlCommand().equals("CALL")) {
291+ preparedStatement = dataBaseConnection.prepareCall(sqlExecuteSentence.getSqlSentence());
292+ } else {
293+ preparedStatement = dataBaseConnection.prepareStatement(sqlExecuteSentence.getSqlSentence());
294+ }
295+
296+ // パラメータ取り込み処理がfalseを返すまで繰り返す
297+ SqlInputParameter sqlInputParameter = sqlExecuteSentence.getSqlInputParameter();
298+
299+ while (sqlInputParameter.getSqlExecuteParmeter().hasNext()) {
300+ if (Thread.interrupted()) {
301+ Jdbcacsess2.logger.info(" (task)canceled.");
302+ break;
303+ }
304+
305+ // パラメータ設定を呼び出す
306+ Parameter parameter = sqlInputParameter.getSqlExecuteParmeter().getParameter();
307+
308+ // preparedStatementのパラメータ設定
309+ setParameters(sqlInputParameter.getInputItemNames(), parameter);
310+
311+ // SQL実行し、結果により受け取る方法を振り分ける
312+ if (preparedStatement.execute()) {
313+ readResultSet();
314+ } else {
315+ rowCnt += preparedStatement.getUpdateCount();
316+ }
317+
318+ }
319+
320+ } catch (Throwable t) {
321+ t.printStackTrace();
322+ sqlTaskThrow = t;
323+ } finally {
324+ try {
325+ if (preparedStatement != null) {
326+ preparedStatement.close();
327+ Jdbcacsess2.logger.info(" (task)Statement closed");
328+ }
329+ } catch (SQLException e) {
330+ Jdbcacsess2.logger.log(Level.WARNING, "WARNING", e);
331+ } finally {
332+ preparedStatement = null;
333+
334+ timeMillisThreadEnd = System.currentTimeMillis();
335+
336+ if (sqlTaskThrow == null) {
337+ for (SqlExecutedListener l : sqlExecutedListeners) {
338+ l.executNormalFinish(rowCnt);
339+ }
340+ Jdbcacsess2.logger.info(" (task)noramal end. cnt=[" + rowCnt + "] "
341+ + (timeMillisThreadEnd - timeMillisThreadStart) + "ms");
342+ } else {
343+ for (SqlExecutedListener l : sqlExecutedListeners) {
344+ l.executeException(sqlTaskThrow);
345+ }
346+ Jdbcacsess2.logger.info(" (task)abnormal end. cnt=[" + rowCnt + "] "
347+ + (timeMillisThreadEnd - timeMillisThreadStart) + "ms");
348+ }
349+
350+ }
351+ }
352+ }
353+
354+ /**
355+ * JDBCprepareステートメントのパラメータを設定する。
356+ *
357+ * @param sqlInputItems
358+ * パラメータ名称リスト
359+ * @param p
360+ * KEY=パラメータリストのインデックス/VALUE=SQL型 のマップ。
361+ */
362+ private void setParameters(ArrayList<String> sqlInputItems, Parameter p)
363+ throws SQLException {
364+
365+ Jdbcacsess2.logger.fine(" (setParameters)VALUES=" + p.values + "SQLTYPES=" + p.sqlTypes + "");
366+
367+ if (sqlInputItems.size() != p.values.size()) {
368+ throw new IllegalArgumentException("入力パラ数が分析結果と不一致:" + "Input=" + p.values.size() + " analized="
369+ + sqlInputItems);
370+ }
371+
372+ for (int i = 0; i < p.values.size(); i++) {
373+ Object o = p.values.get(i);
374+ ConstSqlTypes constSqlTypes = p.sqlTypes.get(i);
375+
376+ if (constSqlTypes == null) {
377+ preparedStatement.setObject(i + 1, o);
378+ } else {
379+ preparedStatement.setObject(i + 1, o, constSqlTypes.getValue());
380+ Jdbcacsess2.logger.fine(" (setParameters)" + constSqlTypes);
381+ }
382+ }
383+ }
384+
385+ /**
386+ * 検索結果を取り出す
387+ *
388+ * @throws Throwable
389+ */
390+ private void readResultSet() throws Throwable {
391+
392+ ResultSet resultSet = preparedStatement.getResultSet();
393+ // getMetaData()は、getResultSet()を実行してから行う。
394+ // sqliteは、"IllegalStateException: SQLite JDBC: inconsistent internal state"
395+ // 例外が発生する。
396+ List<ColumnAttributeResult> list = ColumnAttributeResult.convColumnAttributeResult(resultSet.getMetaData());
397+
398+ Jdbcacsess2.logger.info(" (task)resultSet opened.");
399+ for (SqlExecutedListener l : sqlExecutedListeners) {
400+ l.resultHeader(list);
401+ }
402+
403+ int columnCnt = list.size();
404+
405+ try {
406+ while (resultSet.next()) {
407+ synchronized (this) {
408+ if (Thread.interrupted()) {
409+ Jdbcacsess2.logger.info(" (task)canceled.");
410+ break;
411+ }
412+ ArrayList<Object> results = new ArrayList<Object>(columnCnt);
413+ for (int i = 1; i <= columnCnt; i++) {
414+ results.add(resultSet.getObject(i));
415+ }
416+
417+ rowCnt++;
418+ for (SqlExecutedListener l : sqlExecutedListeners) {
419+ l.resultDetail(rowCnt, results);
420+ }
421+ Jdbcacsess2.logger.finest(" (task)results notified.");
422+
423+ if (rowCnt % resultRowLimitCnt == 0) {
424+
425+ available = true;
426+ new Thread() {
427+ @Override
428+ public void run() {
429+ for (SqlExecutedListener l : sqlExecutedListeners) {
430+ l.statusContinue(rowCnt);
431+ }
432+ }
433+ }.start();
434+ Jdbcacsess2.logger.info(" (task)waiting.");
435+
436+ while (available) {
437+ try {
438+ wait();
439+ } catch (InterruptedException e) {
440+ Jdbcacsess2.logger.fine(" (task)interrupted.");
441+ // wait() により割り込みフラグがクリアされたので、
442+ // 自身にもう一度割り込みをかける。ループ脱出をを検知させる為。
443+ Thread.currentThread().interrupt();
444+ break;
445+ }
446+ }
447+ Jdbcacsess2.logger.info(" (task)wake up.");
448+ }
449+ }
450+ }
451+ } catch (Throwable t) {
452+ throw t;
453+ } finally {
454+ resultSet.close();
455+ Jdbcacsess2.logger.info(" (task)resultSet closed.");
456+ }
457+ }
458+
459+ /**
460+ * 待機中のSQL実行スレッドを再開する
461+ */
462+ @Override
463+ public void taskWakeUp() {
464+ synchronized (this) {
465+ available = false;
466+ notifyAll();
467+ }
468+ }
469+
470+ /**
471+ * 実行中のSQL実行スレッドを中止を要求する
472+ */
473+ @Override
474+ public void taskCancel() {
475+ thread.interrupt();
476+ }
477+
478+ /**
479+ * SQL実行スレッドの終了を待ち合わせる
480+ */
481+ @Override
482+ public void taskJoin(int timeoutSeconds) {
483+ Jdbcacsess2.logger.info(" (join)joining...");
484+ try {
485+ Executors.newSingleThreadExecutor().submit(new Callable<Object>() {
486+ @Override
487+ public Object call() throws Exception {
488+ thread.join();
489+ return null;
490+ }
491+ }).get(timeoutSeconds, TimeUnit.SECONDS);
492+ } catch (InterruptedException e) {
493+ Jdbcacsess2.logger.log(Level.WARNING, "WARNING", e);
494+ } catch (ExecutionException e) {
495+ e.printStackTrace();
496+ } catch (TimeoutException e) {
497+ ShowDialog.errorMessage(e);
498+ }
499+ Jdbcacsess2.logger.info(" (join)joined.");
500+ }
501+
502+ /**
503+ *
504+ * @return 処理時間 単位はミリ秒
505+ */
506+ @Override
507+ public long getExecutionTime() {
508+ if (timeMillisThreadStart == 0) {
509+ return 0;
510+ }
511+ if (timeMillisThreadEnd == 0) {
512+ return 0;
513+ }
514+ return timeMillisThreadEnd - timeMillisThreadStart;
515+ }
516+
517+ @Override
518+ public int getCnt() {
519+ return sqlExecuteSentenceList.size();
520+
521+ }
515522 }// class SqlTask end
516523
517524
Show on old repository browser