忍者ブログ
データベースエンジニアのための実践ブログ。Oracle・PostgreSQL・MySQLなどの環境構築、実行計画の読み方やチューニングといった現場で役立つノウハウ、DB基礎知識までを発信しています。

【Java / MyBatis入門】第2回:H2データベースでテーブル不要のSELECT!現在時刻や計算をサクッと取得してみよう

今回は、前回のプロジェクト(mybatis-minimal)をベースにして、H2データベースでテーブルを作成せずに SELECT CURRENT_TIMESTAMP(現在時刻の取得)や簡単な算術演算を行う、テーブル不要の SELECT クエリの実行手順を確認していこう。


事前準備

前回のハンズオンで作成したプロジェクトディレクトリに移動した状態からスタートする。

cd mybatis-minimal

手順 1:ディレクトリおよびパッケージ階層の確認・作成

マッパー用のXMLファイルを配置するためのリソース用ディレクトリを作成する。

mkdir -p src/main/resources/com/example

手順 2:マッパーインターフェースの作成

現在時刻と計算結果を取得するためのメソッドを定義したインターフェースを vi で作成する。

vi src/main/java/com/example/TimeMapper.java

以下のコードを入力して保存する。

package com.example;

public interface TimeMapper {
    String getCurrentTime();
    int getCalculation();
}

手順 3:SQLマッピング XML の作成

テーブル名(FROM句)を必要としない SQL を記述する XML ファイルを作成する。

vi src/main/resources/com/example/TimeMapper.xml

以下のコードを入力して保存する。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.TimeMapper">

    <select id="getCurrentTime" resultType="string">
        SELECT CURRENT_TIMESTAMP
    </select>

    <select id="getCalculation" resultType="int">
        SELECT 100 + 200
    </select>

</mapper>

手順 4:MyBatis 設定ファイルの更新

作成したマッパーXMLを MyBatis に認識させるため、設定ファイルに <mappers> タグを追加する。

vi src/main/resources/mybatis-config.xml

以下の内容に書き換えて保存する。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.h2.Driver"/>
                <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"/>
                <property name="username" value="sa"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/example/TimeMapper.xml"/>
    </mappers>
</configuration>

手順 5:実行クラスの書き換え

新しく作成した TimeMapper を呼び出し、結果をコンソールに出力するコードに書き換える。

vi src/main/java/com/example/App.java

以下のコードに置き換えて保存する。

package com.example;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;

public class App {
    public static void main(String[] args) {
        System.out.println("H2 & MyBatis テーブル不要のSELECTテストを開始します...");

        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

            try (SqlSession session = sqlSessionFactory.openSession()) {
                TimeMapper mapper = session.getMapper(TimeMapper.class);

                String currentTime = mapper.getCurrentTime();
                System.out.println("-> 取得した現在時刻: " + currentTime);

                int calcResult = mapper.getCalculation();
                System.out.println("-> 計算結果 (100 + 200): " + calcResult);
            }

            System.out.println("-> 処理が正常に完了しました。");

        } catch (Exception e) {
            System.err.println("エラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

手順 6:ビルドおよび実行

プロジェクト直下(mybatis-minimal/)で Maven コマンドを実行する。

mvn compile exec:java

実行結果の確認

正常に動作した場合、ターミナルに以下のような出力が表示されれば成功だ。

H2 & MyBatis テーブル不要のSELECTテストを開始します...
-> 取得した現在時刻: 2026-10-29 17:07:00.123456
-> 計算結果 (100 + 200): 300
-> 処理が正常に完了しました。
BUILD SUCCESS
PR

【Java / MyBatis入門】第1回:Macのターミナルとviで挑戦!MavenプロジェクトでH2データベースの接続・切断をサクッと試す

今回は、Macのターミナルと使い慣れたエディタ(vi)を使い、Java 21 と Apache Maven、そしてインメモリデータベースの H2 Database を組み合わせて、最もシンプルな「データベースの接続と切断」を体験する手順を確認していこう。


前提環境の確認

以下のバージョン環境で作業を行うことを事前に確認しておく。

$ javac -version
javac 21.0.10

$ mvn --version
Apache Maven 3.9.12

手順 1:Mavenによるプロジェクトの自動生成

Mavenの対話型ジェネレーターを利用して、Javaプロジェクトの骨組みを一発で作成する。任意の作業ディレクトリで以下のコマンドを実行する。

mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=mybatis-minimal \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DarchetypeVersion=1.4 \
  -DinteractiveMode=false

生成されたプロジェクトのディレクトリに移動する。

cd mybatis-minimal

手順 2:pom.xml の編集

vi pom.xml でファイルを開き、Java 21の指定と MyBatis、H2データベースの依存関係を追加する。

vi pom.xml

以下の内容を入力して保存する。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>mybatis-minimal</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- MyBatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.16</version>
        </dependency>

        <!-- H2 Database -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.2.224</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <mainClass>com.example.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

手順 3:mybatis-config.xml の作成

リソース格納用のディレクトリを作成し、MyBatisの接続設定ファイルを作成する。

mkdir -p src/main/resources
vi src/main/resources/mybatis-config.xml

以下の内容を入力して保存する。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.h2.Driver"/>
                <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"/>
                <property name="username" value="sa"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
</configuration>

手順 4:App.java の編集

自動生成されたデフォルトの App.java を、データベースの接続・切断テスト用コードに書き換える。

vi src/main/java/com/example/App.java

以下のコードに置き換えて保存する。

package com.example;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;

public class App {
    public static void main(String[] args) {
        System.out.println("H2 & MyBatis の接続テストを開始します...");

        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

            try (SqlSession session = sqlSessionFactory.openSession()) {
                System.out.println("-> データベースに正常に接続しました!");
            }

            System.out.println("-> データベースから正常に切断(クローズ)しました。");

        } catch (Exception e) {
            System.err.println("エラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

手順 5:ビルドおよび実行

プロジェクト直下(mybatis-minimal/)で以下のコマンドを実行する。

mvn compile exec:java

実行結果の確認

正常に動作した場合、ターミナルに以下のような出力が表示されれば成功だ。

H2 & MyBatis の接続テストを開始します...
-> データベースに正常に接続しました!
-> データベースから正常に切断(クローズ)しました。
BUILD SUCCESS

【問題で学ぶクラウド-共通】第1回:障害ドメイン(Fault Domain)の正体を暴く!電源やネットワークを分離してハードウェア障害に備える仕組み

オンプレミスからクラウドへの移行やクラウドアーキテクチャの設計において、システムの可用性(止まらない仕組み)を語る上で絶対に外せないのが「冗長化」と「障害の分離」という考え方だ。

今回は、複数の主要なクラウド(AzureやOCIなど)の仮想マシン設計や可用性グループにおいて基本中の基本となる概念、「障害ドメイン(Fault Domain:FD)」を取り上げる。4択の練習問題を通じて、その仕組みと役割をスッキリ整理してみよう。


本日の問題

【問】クラウド環境(AzureやOCIなど)のアーキテクチャにおける「障害ドメイン(Fault Domain)」の定義や役割として、最も適切なものを次の選択肢から1つ選べ。

  • A. ソフトウェアのバージョンアップやパッチ適用のスケジュールを管理し、システム全体を一斉に再起動するための論理的な管理単位。
  • B. 電源装置やネットワーク・スイッチなどのハードウェア資産が物理的に共有されず、同時に障害が起きにくいようにグループ化されたハードウェアの単位。
  • C. 複数の異なるリージョン間でデータを非同期レプリケーションし、大規模な自然災害時に自動でフェイルオーバーするための広域ネットワーク網。
  • D. 仮想マシン(VM)のOS内部におけるメモリ割り当てやプロセス分離を管理し、アプリケーションの暴走を防ぐためのカーネル上の仮想空間。

正解と解説

【正解】
B. 電源装置やネットワーク・スイッチなどのハードウェア資産が物理的に共有されず、同時に障害が起きにくいようにグループ化されたハードウェアの単位。

詳しい解説

クラウドのデータセンターは膨大な数の物理サーバーで構成されているが、すべてのサーバーが同じ電源やネットワークスイッチに繋がっていたとしたら、その電源が落ちた瞬間に全台がダウンしてしまう。

  • 障害ドメイン(Fault Domain:FD)とは:
    物理的なハードウェアのグループ分けのこと。オンプレミスのラックに例えると、「異なる電源や異なるスイッチ(トップオブラック・スイッチ)に接続されたラックの単位」に相当する。これはAzureやOCIなどの主要クラウドで共通して採用されている概念である。
  • 可用性の向上(分散配置の仕組み):
    クラウド環境で複数の仮想マシンをデプロイする際、異なる「障害ドメイン」に配置するように指定しておけば、万が一あるラックの電源装置やスイッチが故障しても、別の障害ドメインにある仮想マシンは無傷で稼働し続けることができる。

試験やクラウドのアーキテクチャ設計においても、「電源やネットワークが別となっていて同時に障害が起きにくいグループ」としての障害ドメインの定義は非常に重要である。セットで語られることが多い「更新ドメイン(Update Domain:計画停止の単位)」との違いも含めて、しっかり頭に入れておこう。


まとめ

クラウドの概念主な特徴・役割
障害ドメイン(Fault Domain) 電源やネットワークスイッチなどのハードウェアが独立しており、同時障害を防ぐ物理グループ。
更新ドメイン(Update Domain) ホストのメンテナンスやパッチ適用時に、一斉停止しないよう順次再起動されるグループ。

クラウドの裏側にある物理的なハードウェア配置のルールを知ることで、可用性の高いシステムを設計・構築するための解像度がグッと上がってくる。


【問題形式で学ぶOracle】第11回:一時セグメントの正体を暴く!ソート処理があふれたときの救世主

前回は、SYSTEM表領域の相棒として監査データや統計情報を支える必須の「SYSAUX表領域」について学んだ。

今回は、大量データのアグリゲーションやソート処理の裏側でこっそり汗をかいている「一時セグメント(Temporary Segment)」を取り上げる。Oracle 26ai でも変わらず、メモリに収まりきらないデータの一時的な逃げ場所として活躍するこの仕組みを、4択の練習問題を通じてスッキリ整理してみよう。


本日の問題

【問】Oracle Database のストレージ構造における「一時セグメント」の主な役割として、最も適切なものを次の選択肢から1つ選べ。

  • A. データベースの起動時にインスタンスの構成パラメータや制御ファイルのパス情報を一時的にキャッシュするためのメモリ領域。
  • B. ユーザーが実行したSQL文の構文解析ツリー(Query Tree)を保存し、次回以降のパース処理を高速化するための共有領域。
  • C. 大規模なソートやハッシュ結合などの処理において、データ量がメモリ内に収まりきらない場合に、一時的にディスクへ書き出すための作業領域。
  • D. トランザクションの更新前データ(ビフォアイメージ)を保持し、ロールバックや読み取り一貫性を提供するための専用領域。

正解と解説

【正解】
C. 大規模なソートやハッシュ結合などの処理において、データ量がメモリ内に収まりきらない場合に、一時的にディスクへ書き出すための作業領域。

詳しい解説

一時セグメントは、データベースの中で「作業用のスクラッチパッド(メモ用紙・一時置き場)」として使われる領域だ。

  • メモリ(PGA)からのあふれ出し:
    私たちが ORDER BY による並び替え、GROUP BY による集計、インデックスの作成(CREATE INDEX)、あるいはハッシュ結合などを実行すると、Oracle はまずサーバー・プロセスのメモリ領域(PGA内のワークエリア)を使って高速に処理しようとする。
  • ディスクへの書き出し(一時表領域):
    しかし、処理するデータ量が膨大でメモリに収まりきらない場合、Oracle は「一時表領域(Temporary Tablespace)」の中に一時セグメントを動的に作成し、そこにデータを一時的に逃がして(ディスク・ソートなどを行って)処理を完結させる。

試験や実務のパフォーマンスチューニング(有名な ORA-01652: unable to extend temp segment エラーなど)でも、一時セグメントが枯渇するトラブルやその仕組みの理解は非常に重要である。「メモリに入りきらないときの作業用スペース」という基本のイメージをしっかり頭に入れておこう。


まとめ

処理の状況利用される領域・仕組み
データ量が少ない場合 メモリ(PGA内のワークエリア)内で完結して高速処理。
データ量がメモリを超えた場合 一時表領域内に一時セグメントを動的作成し、ディスクを使って処理を継続。

普段何気なく実行している重いクエリやインデックス作成の裏側で、こうした一時セグメントがダイナミックに働いてシステムを守ってくれていることが分かると、データベースの挙動がより深く見えてくるようになる。

次回もOracleの仕組みがスッキリわかる4択問題をお届けするので、お楽しみに!


【問題形式で学ぶOracle】第10回:SYSAUX表領域の正体を暴く!SYSTEMを支える必須の相棒と非メタデータの置き場所

前回は、表領域とデータファイルの所有関係やストレージの基本ルールについて学んだ。

今回は、Oracle データベースの運用において絶対に欠かせない必須の表領域の1つ、「SYSAUX表領域(シシステム・オグジュアリー・テーブルスペース)」を取り上げる。SYSTEM表領域の相棒として、監査データや様々なコンポーネントのデータを一手に引き受けるこの領域の役割を、4択の練習問題を通じてスッキリ整理してみよう。


本日の問題

【問】Oracle Database のストレージ構造における「SYSAUX表領域」の主な役割や特徴として、最も適切なものを次の選択肢から1つ選べ。

  • A. データベースの起動には必須ではないため不要であれば削除可能であり、主に一般ユーザーが作成した実データを格納する専用領域である。
  • B. SYSTEM表領域の補助(Auxiliary)として機能し、監査データやAWR、エンタープライズ・マネージャなどの非メタデータを格納する必須の表領域である。
  • C. データベースのデータ更新時における「更新前の内容(ビフォアイメージ)」だけを一時的かつ永続的に保存する専用の領域である。
  • D. 複数のプラガブル・データベース(PDB)の間で、親であるCDB$ROOTの全テーブル定義を完全に複製して同期するための共有キャッシュ領域である。

正解と解説

【正解】
B. SYSTEM表領域の補助(Auxiliary)として機能し、監査データやAWR、エンタープライズ・マネージャなどの非メタデータを格納する必須の表領域である。

詳しい解説

Oracle Database を作成すると、基本となる「SYSTEM表領域」のほかに、必ずセットで「SYSAUX表領域」が自動作成される。

  • SYSTEM表領域の負担軽減(Auxiliary):
    かつての古いOracleバージョンでは、すべてのデータディクショナリやメタ情報、さらには各種オプション機能のデータまでがすべて「SYSTEM表領域」に詰め込まれていたため、表領域が肥大化して管理が大変だった。これを防ぐため、補助(Auxiliary)として切り出されたのがSYSAUX表領域である。
  • 格納されるデータ:
    データベースの根幹をなすメタデータ(データディクショナリ等)は SYSTEM に残るが、監査データ、AWR(自動ワークロード・リポジトリ)のパフォーマンス統計、Oracle Enterprise Manager のデータなど、メタデータ以外のさまざまなコンポーネントが使用するデータはすべて SYSAUX に格納される。
  • 必須性:
    名前の通り補助的な位置づけではあるものの、データベースの稼働には「必須」の表領域であり、削除したりオフラインにしたりすることはできない。

試験や実務の運用管理においても、「SYSTEM表領域の肥大化を防ぐための補助領域であること」「監査データや統計情報などが格納されること」「削除不可の必須領域であること」は非常によく問われるポイントなので、しっかり押さえておこう。


まとめ

表領域の種類主な役割・特徴
SYSTEM表領域 データベースの根幹となるデータディクショナリ(メタデータ)を格納する必須の表領域。
SYSAUX表領域 SYSTEMの補助(Auxiliary)。監査データやAWR統計などの非メタデータを格納する必須の表領域。

データベースの内部構造を支える主要な表領域の役割分担が見えてくると、容量監視やメンテナンスを行う際もどこに注意すべきかがハッキリと分かるようになる。

次回もOracleの仕組みがスッキリわかる4択問題をお届けするので、お楽しみに!