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 の [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 の HandlerSocket クライアント hs4j を利用する例を記載します。
こちらのページを参考に Maven 3 のインストールおよびプロジェクトテンプレートの作成を行います。インストール時には yum などによる JDK のインストールおよび JAVA_HOME の設定が必要なことに注意してください。
$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
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