モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

MySQL HandlerSocket Plugin の簡単な使用方法

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/06/02
最終更新最終更新
2021/09/07
記事区分記事区分
一般公開

目次

    MySQLの運用やレプリケーション設定など、実用的なノウハウを共有します。

    HandlerSocket は MySQL プロセス内のスレッドとして動作する、MySQL の NoSQL フロントエンドです。独自のプロトコルを用いて TCP 通信を行います。SQL 構文の解析が不要、プロトコルがシンプルなどの理由によって、単純な DB アクセスが高速に実行可能になります。MariaDB であれば標準プラグインとして付属するためビルドせずに使用できます。ここでは MySQL プラグインとしての HandlerSocket の使用方法について記載しています。

    前準備

    HandlerSocket は MySQL プラグインですので MySQL 本体のインストールが事前に必要です。ただし yum などでバイナリだけをインストールするのではなく、対応したソースコードも必要です。

    ダウンロード

    $ git clone https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL.git
    

    インストール

    こちらを参考にインストールします。

    必要なソフトウェアのインストール

    $ sudo yum install libtool
    

    ビルド

    $ ./autogen.sh
    $ ./configure --with-mysql-source=/usr/local/src/mysql-5.6.25 \
    --with-mysql-bindir=/usr/local/mysql-5.6.25/bin \
    --with-mysql-plugindir=/usr/local/mysql-5.6.25/lib/plugin
    
    $ make
    $ sudo make install
    

    初期設定

    /etc/my.cnf

    以下の内容を /etc/my.cnf の [mysqld] セクションに追記します。オプションの意味はこちらを参考にします。

    loose_handlersocket_port = 9998
    loose_handlersocket_port_wr = 9999
    loose_handlersocket_threads = 16
    loose_handlersocket_threads_wr = 1
    open_files_limit = 65535
    

    プラグインのインストール

    mysql> install plugin handlersocket soname 'handlersocket.so';
    

    インストールされたことを確認

    mysql> show processlist;
    

    クライアントからの利用例 (Java)

    Java の HandlerSocket クライアント hs4j を利用する例を記載します。

    Maven の設定

    Maven 3 のインストールおよびプロジェクトテンプレートの作成を行います。インストール時には yum などによる JDK のインストールおよび JAVA_HOME の設定が必要なことに注意してください。

    $ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app \
    -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    

    POM ファイルの編集

    hs4j および hs4j が依存する Logback のための pom.xml 設定を行います。Apache Maven Shade Pluginを利用して、単体で実行可能な全部入りの JAR を作成してみます。

    pom.xml

    <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/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <packaging>jar</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>my-app</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <!-- これを追加↓ -->
        <dependency>
          <groupId>com.googlecode.hs4j</groupId>
          <artifactId>hs4j</artifactId>
          <version>0.1</version>
        </dependency>
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.1.3</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.12</version>
        </dependency>
        <!-- ↑これを追加 -->
      </dependencies>
      <!-- これを追加↓ -->
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
              <!-- put your configurations here -->
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <manifestEntries>
                    <Main-Class>com.mycompany.app.App</Main-Class>
                  </manifestEntries>
                </transformer>
              </transformers>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <!-- ↑これを追加 -->
    </project>
    

    データベース側の設定

    mysql> create database mydatabase;
    mysql> use mydatabase;
    mysql> create table mytable (id varchar(255) primary key, str_val varchar(255), int_val int);
    mysql> show create table mytable\G
    

    ソースコードの編集

    こちらのリファレンスページを参照します。

    src/main/java/com/mycompany/app/App.java

    package com.mycompany.app;
    
    import com.google.code.hs4j.HSClient;
    import com.google.code.hs4j.impl.HSClientImpl;
    import com.google.code.hs4j.IndexSession;
    import com.google.code.hs4j.ModifyStatement;
    import java.net.InetSocketAddress;
    import java.sql.ResultSet;
    
    public class App 
    {
        public static void main( String[] args )
        {
            // スキーマ情報
            String db = "mydatabase";
            String table = "mytable";
            String[] columns = {"id", "str_val", "int_val"};
    
            try {
                // 読み込み用クライアント
                HSClient hsClientR = new HSClientImpl(new InetSocketAddress("127.0.0.1", 9998));
    
                // セッション
                IndexSession sessionR = hsClientR.openIndexSession(db, table, "PRIMARY", columns);
    
                // SELECT
                ResultSet rs = sessionR.find(new String[] {"c33030560d22d5ae88fb5a9f72d3eed6"});
                while(rs.next()) {
                    System.out.println(rs.getString(1));
                    System.out.println(rs.getString(2));
                    System.out.println(rs.getInt(3));
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
    
            try {
                // 書き込み用クライアント
                HSClient hsClientW = new HSClientImpl(new InetSocketAddress("127.0.0.1", 9999));
                IndexSession sessionW = hsClientW.openIndexSession(db, table, "PRIMARY", columns);
    
                // Insert
                ModifyStatement stmt = sessionW.createStatement();
                stmt.setString(1, "c33030560d22d5ae88fb5a9f72d3eed6");
                stmt.setString(2, "abc");
                stmt.setInt(3, 123);
                boolean result = stmt.insert();
                if (result) {
                    System.out.println("Insert Successful");
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    ビルドおよび実行

    $ mvn package
    $ java -jar target/my-app-1.0-SNAPSHOT.jar
    

    結果の確認

    mysql> select * from mytable;
    +----------------------------------+---------+---------+
    | id                               | str_val | int_val |
    +----------------------------------+---------+---------+
    | c33030560d22d5ae88fb5a9f72d3eed6 | abc     |     123 |
    +----------------------------------+---------+---------+
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    MySQLの運用やレプリケーション設定など、実用的なノウハウを共有します。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん11/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし4/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta12/21/2019に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太9/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん9/12/2017に更新
        いいねアイコン画像0