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 |
+----------------------------------+---------+---------+
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- 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]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...