2017年10月14日土曜日

[Oracle]データベースバッファキャッシュを明示的に破棄してみる

データベースバッファキャッシュは下のSQLで明示的に破棄できる。
alter system flush buffer_cache;

破棄されたことを確認する


破棄前の統計情報
SQL> select * from person where id = 1;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 1167617095

--------------------------------------------------------------------------------------------
| Id  | Operation      | Name    | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |     |  1 | 17 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PERSON    |  1 | 17 |  3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN     | SYS_C0013811 |  1 |    |  2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"=1)


Statistics
----------------------------------------------------------
   0  recursive calls
   0  db block gets
   4  consistent gets
   0  physical reads
   0  redo size
 469  bytes sent via SQL*Net to client
 540  bytes received via SQL*Net from client
   1  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed


データベースバッファキャッシュを破棄する。
SQL> alter system flush buffer_cache;

System altered.

同じ問い合わせを実行するとphysical readsが増えているので、データファイルからブロックが読み取られていることが確認できる。
SQL> select * from person where id=1;

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 1167617095

--------------------------------------------------------------------------------------------
| Id  | Operation      | Name    | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |     |  1 | 17 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PERSON    |  1 | 17 |  3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN     | SYS_C0013811 |  1 |    |  2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"=1)


Statistics
----------------------------------------------------------
   1  recursive calls
   0  db block gets
   4  consistent gets
  24  physical reads
   0  redo size
 469  bytes sent via SQL*Net to client
 540  bytes received via SQL*Net from client
   1  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed

2017年9月29日金曜日

GradleでOracle Maven RepositoryからJDBCドライバを取得する方法

$HOME/.gradle/gradle.propertiesにOTNのアカウント情報を設定

OTNの自分のアカウント情報を設定する。
otn_user=hoge
otn_password=fuga

build.gradleにOracle Maven Repositoryの情報を追加

mavenリポジトリの設定とともに、credentialsを使用してリポジトリにアクセスするためのユーザ名とパスワードを指定する。
ユーザ名とパスワードは、gradle.propertiesに設定したものを参照する。
  maven {
  url "https://www.oracle.com/content/secure/maven/content"
  credentials {
    username otn_user
    password otn_password
  }
}

JDBCドライバの追加

使いたいバージョンを設定する。
compile 'com.oracle.jdbc:ojdbc8:12.2.0.1'

dependenciesで確認

参照できました。(UCPも落ちてくるのか)
\--- com.oracle.jdbc:ojdbc8:12.2.0.1
     \--- com.oracle.jdbc:ucp:12.2.0.1
          \--- com.oracle.jdbc:ojdbc8:12.2.0.1 (*)

2017年9月24日日曜日

sqlplusでプラガブルデータベースに接続する

sqlplus ユーザ名@プラガブルデータベース名/パスワードで接続する。

sqlplus hoge@pdb1/hoge@orcl

2017年9月4日月曜日

Spring BootのthymeleafでDate and Time api

Spring BootのThymeleafでDate and Time apiを使う手順

thymeleaf-extras-java8timeを依存に追加

gradleであれば下のように依存を追加する。
Thymeleaf 3.0以上の場合は、3系のバージョンを指定する。
compile 'org.thymeleaf.extras:thymeleaf-extras-java8time:2.1.0.RELEASE'

thymeleafでfomatなどを行う

temporals.formatを使ってフォーマットを行う。
<span th:text="${#temporals.format(nowDateTime, 'yyyy/MM/dd HH:mm:ss')}"></span>

その他

昔は、Java8TimeDialectをBeanとして登録しないとダメだったようですが、下のコミットの対応によりthymeleaf-extras-java8timeを依存に追加するだけでviewで利用できるようになったようです。

https://github.com/spring-projects/spring-boot/commit/c68ffa5ba059781ab2c0fb21eed7a541036e837d

2017年8月30日水曜日

thymeleafでdata-から始まる属性に値を設定する

th:httrを使う。
<div th:attr="data-sample=${sample.name}"></div>

複数ある場合はカンマで区切って列挙する。
<div th:attr="data-sample=${sample.name},data-sample2=${sample.name2}"></div>

2017年8月18日金曜日

maven-surefire-pluginでテスト実行時のjavaを指定する

pomの定義

jmvパラメータにテスト実行時に使用するjavaを指定します。
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <jvm>/opt/java/jdk1.6.0_45/bin/java</jvm>
  </configuration>
</plugin>

動作確認用のテストクラス

public class HogeTest {
    @Test
    public void name() throws Exception {
        System.out.println("System.getProperty(\"java.version\") = " + System.getProperty("java.version"));
    }
}

実行結果

指定したバージョンでテストが実行されていることが確認できます。
$ export JAVA_HOME=/opt/java/jdk1.8.0_141
$ mvn test

********** 省略 **********
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running HogeTest
System.getProperty("java.version") = 1.6.0_45
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.955 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

2017年8月4日金曜日

Java9でJMockit

Java9でのJMockitについて


build.gradleの定義

dependencies {
  testCompile 'org.jmockit:jmockit:1.33'
  testCompile 'junit:junit:4.12'
}

何も設定をせずにテストを実行すると

jmockitのライブラリを-javaagentに設定するか、システムプロパティにjdk.attach.allowAttachSelfを設定してください例外が発生します。
Caused by: java.lang.IllegalStateException: Running on JDK 9 requires
 -javaagent:/jmockit-1.n.jar or -Djdk.attach.allowAttachSelf

テスト実行時のシステムプロパティを追加する

Gradleのテストタスク実行時に、上の例外で指定されたシステムプロパティを設定します。
test {
  jvmArgs "-Djdk.attach.allowAttachSelf"
}

システムプロパティ追加後にテストを実行

このようにテストが正常に実行されます。
➜  java9 ./gradlew clean test

BUILD SUCCESSFUL in 2s
3 actionable tasks: 3 executed

gradle実行時にワーニングログが出力される場合

Gradle実行時にこのようなワーニングが出力される場合があります。
その場合は、Gradleのバージョンを4.1以上(現時点では4.1-rc-2が最新)にします。
➜  java9 ./gradlew clean test
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.gradle.internal.reflect.JavaMethod
WARNING: Please consider reporting this to the maintainers of org.gradle.internal.reflect.JavaMethod
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release