もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

SpringBootでURLにjsessionidが入らないようにする

はじめに

SpringBootアプリをテスト環境や本番環境にデプロイし、初回アクセスしたときに、例外が発生することがあった。

そのとき、URLが【http://localhost:8080/sample;jsessionid=xxxx】になっていた。

jsessionidを消してブラウザを更新すると、その後は問題なく動作する。

例外が発生するのも問題だし、そもそもセッションIDがURLに表示されるのも「どうなの?」って感じなので、対策した話

環境

  • SpringBoot 2.1.0
  • Java 1.8

参考サイト

BLOG.IK.AM - Remove 'jsessionid=xxxx' from URL in Spring Boot App

修正点

以下のConfigurationを追加する

import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.SessionTrackingMode;
import java.util.Collections;

@Configuration
public class CommonConfig {

    @Bean
    public ServletContextInitializer servletContextInitializer() {
        // 初回アクセス時に、URLにSessionIDが付与されるのを防ぐ
        // https://blog.ik.am/entries/353
        ServletContextInitializer initializer = servletContext -> {
            servletContext.setSessionTrackingModes(
                Collections.singleton(SessionTrackingMode.COOKIE)
            );
        };
        return initializer;
    }

}

Tomcatのメモリ割り当てを自動で計算する

はじめに

AWSTomcatサーバを作ったとき、インスタンスタイプに合わせて、毎回別のチューニングするのは面倒臭い。

なので、Tomcatに割り当てるメモリサイズを自動計算するスクリプトを作った

参考サイト

groupsession.jp

yasuhiroa24.hateblo.jp

secureassist.jp

park1.wakwak.com

d.hatena.ne.jp

Tomcatのメモリサイズの自動計算

参考にしたサイトに以下のことが書いてあった

  • パーマネント領域(-XX:MaxPermSize)搭載メモリの8分の1程度(初期値:64m)。
  • メモリ最大使用量(-Xmx)搭載メモリの半分程度。
  • メモリ初期使用量(-Xms)Xmxで指定した数値の半分位。

なので、書き込みを鵜呑みにして、以下のスクリプトを作成

# https://groupsession.jp/support/setup_08.html
# http://yasuhiroa24.hateblo.jp/entry/2017/01/11/162101
MAX_MEM_SIZE=$(free -m | awk '/^Mem:/ {printf("%d", $2 / 2)}')
START_MEM_SIZE=$(free -m | awk '/^Mem:/ {printf("%d", $2 / 4)}')
PERM_MEM_SIZE=$(free -m | awk '/^Mem:/ {printf("%d", $2 / 8)}')

if [ $PERM_MEM_SIZE -gt 256 ]
then
    PERM_MEM_SIZE=256
fi

CATALINA_OPTS="-Xms${START_MEM_SIZE}m -Xmx${MAX_MEM_SIZE}m -XX:MaxPermSize=${PERM_MEM_SIZE}m -server"

XX:MaxPermSizeのサイズは「256MBあれば十分」といくつかのサイトで見かけたので、256MB以上割り当てないようにした。

Tomcatをダウンロードした場合

Tomcatの解凍ディレクトリ】/binの中にファイル「setenv.sh」(Windowsの場合は「setenv.bat」らしい)を新規作成する。

Tomcatをコマンドでインストールした場合

Amazon Linuxでは、Tomcat8がyumからインストールできる。

yumコマンドからインストールしたとき、setenv.shを作成しても設定が反映されなかった。

色々フォルダ・ファイルを漁ってみると、/etc/tomcat8/tomcat8.confというファイルがあり、このファイルで変数を突っ込む感じ

なので、ファイル/etc/tomcat8/tomcat8.confの最後に追加する

確認

以下のコマンドで、Tomcatのパラメータを確認

ps aux | grep java

/usr/lib/jvm/jre/bin/java -Xms246m -Xmx493m -XX:MaxPermSize=123m -server -classpath :/usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat8 -Dcatalina.home=/usr/share/tomcat8 -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat8/temp -Djava.util.logging.config.file=/usr/share/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start

ora2pgでOracleのテーブルをPostgreSQL9.6に移行した話

はじめに

とあるサービスを作ることになった。

あるパッケージに連帯するサービスで、パッケージではOracleDBを使用していた。

サービスの機能で、OracleDBの一部のテーブルのデータを取り出したかった。

しかし、サービス用のWebアプリをSpringBootで構築しようとし、OracleDBに接続できるかどうか試したところ上手くいかない・・・

運用するとなるとOracleDBのライセンス料がかかるし、どうせサービス用にパッケージとは別のDBを構築しないといけないし・・・

私はOracleDBを使ったことがなく、OracleDBのバージョンで別の部署の人がいつも揉めているイメージであまり使いたくない・・・

もうPostgreSQLを使いたい。もはやPostgreSQL信者

調べてみると、ora2pgというツールがあり、Oracle/MySQLからPostgreSQLへの移行を支援するツールがある。

パッケージで使用している一部のテーブルを、サービス用のDB(PostgreSQL)に移行・コピーしようとした


目次


環境


参考サイト

以下のサイトを参考にした。

kkida-galaxy.blogspot.com


ora2pgのインストール

ora2pgの動作に必要なパッケージをインストール

yum groupinstall "Development Tools"
yum install libdbi-dbd-pgsql perl-ExtUtils-MakeMaker perl-DBI perl-CPAN

ora2pgに必要なパッケージをインストールするため、以下のツールをInstant Client for Linux x86-64 のダウンロードからダウンロードする。(アカウントの登録が必要)

Oracle client tool

ダウンロードしたパッケージをインストール

rpm -Uvh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
rpm -Uvh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
rpm -Uvh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm 

ファイル「/etc/profile.d/oracle.sh」を新規作成し、Oracle用の環境変数を追加。

vim /etc/profile.d/oracle.sh

#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
export ORACLE_HOME=/usr/lib/oracle/11.2/client64/

設定したOracle環境変数を反映

. /etc/profile

ora2pgはperlを使っていて、perlOracleに接続できるようにDBD::Oracleのインストールする

cpan DBD::Oracle

このとき、cpanの設定(?)を聞かれたけど、全部デフォルトにした。

ora2pgのソースコードをダウンロード・コンパイルする

cd /usr/local/src/
wget https://github.com/darold/ora2pg/archive/v18.2.tar.gz -O ora2pg_v18.2.tar.gz
tar xf ora2pg_v18.2.tar.gz
cd ora2pg_v18.2
perl Makefile.PL 
make && make install


ora2pgの設定ファイルの作成

cd /etc/ora2pg
cp ora2pg.conf.dist ora2pg.conf
vim ora2pg.conf

以下の項目を修正

移行してみる

ora2pg -c /etc/ora2pg/ora2pg.conf

↓終了するとこんな出力がある
[========================>] 836/836 tables (100.0%) end of scanning.        
[========================>] 836/836 tables (100.0%) end of table export.

コマンドを実行したディレクトリに「output.sql」が出来ている

あとは、PostgreSQLのコマンドでSQLを実行する。

psql -U 【ユーザ名】 【DB名】 < output.sql

ちなみに、「output.sql」にはテーブルのCreate文のみだった。

エクスポートタイプが設定ファイル(/etc/ora2pg/ora2pg.conf)の「TYPE」で設定されてあり、デフォルトは「TABLE」になっている。

エクスポートタイプを変更するには、設定ファイルを修正するか、「-t」または「--type」オプションを追加してコマンドを実行する

エクスポートタイプはこんな感じ

# Type of export. Values can be the following keyword:
#       TABLE           Export tables, constraints, indexes, ...
#       PACKAGE         Export packages
#       INSERT          Export data from table as INSERT statement
#       COPY            Export data from table as COPY statement
#       VIEW            Export views
#       GRANT           Export grants
#       SEQUENCE        Export sequences
#       TRIGGER         Export triggers
#       FUNCTION        Export functions
#       PROCEDURE       Export procedures
#       TABLESPACE      Export tablespace (PostgreSQL >= 8 only)
#       TYPE            Export user defined Oracle types
#       PARTITION       Export range or list partition (PostgreSQL >= v8.4)
#       FDW             Export table as foreign data wrapper tables
#       MVIEW           Export materialized view as snapshot refresh view
#       QUERY           Convert Oracle SQL queries from a file.
#       KETTLE          Generate XML ktr template files to be used by Kettle.

とりあえず、自分の環境ではテーブルとデータがあれば良かったので、「TABLE」と「INSERT」のエクスポートタイプを使用した。

ちなみに移行するテーブルは限られていたので、「-a/--allow」オプションで、移行テーブルを選択することができた。

※「/etc/ora2pg/ora2pg.conf」の「ALLOW」に移行対象のテーブル名を記載する方法もあり。

↓ドキュメントの該当箇所

https://ora2pg.darold.net/documentation.html#Ora2Pg-usage


おわりに

LONG RAW型を使用しているカラムがあるテーブルは変換が出来ず、レコード数が4件しかないのに処理が数時間たっても終わらなかった。

やっぱり完璧に変換できるわけではなさそうだけど、LONG RAW型カラム持ちのテーブルを変換する方法は有るらしい(試してない)