【DbUnit】DB跨ぎの外部キーが絡む状態でDatabseSetup時にLock wait timeout exceeded; try restarting transactionになる問題への対処【Spring】

TL;DR

  • DB跨ぎの外部キーが絡む状態でDatabseSetupすると、外部キーの元になるinsertがコミットされずにデッドロックが発生する
    • エラーメッセージはCaused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transactionになる
  • 外部キー制約を切ることでこの問題を回避できる

起きた問題

タイトル通り、DB跨ぎの外部キーが絡む状態でDatabseSetupした所、外部キーの元になるinsertがコミットされずにデッドロックが発生する状態になりました。

対処

色々調べましたが、DbUnit側でこれに対応する方法は提供されていないように見えました。

そのため、テストでは外部キー制約を切ることでこの問題に対処しました(外部キー制約によるテストデータ作成の手間を軽減する意図も有りました)。

外部キー制約の切り方は別の記事にまとめてあります。

qiita.com

【kotlinx-metadata】KmValueParameter.typeはnullにならない

TL;DR

  • KmValueParameter.typeは実際の所non-nullだが、定義上nullableになっている
    • ドキュメントも「KmValueParameter.typenon-nullならKmValueParameter.typenull」というような記述になっている
    • 0.3.0時点の話

本文

使っていて疑問を感じたので質問を投げてみた所、ライブラリ側のミスだったみたいでした。

【Kotlin】Intellij IDEAでjava.lang.OutOfMemoryError: Java heap spaceでコンパイルが失敗する状況への対処

Kotlin 1.3.71のプロジェクトで、バージョンを1.41.5に上げた所、java.lang.OutOfMemoryError: Java heap spaceコンパイルが失敗する状況になりました。
Preferences -> Build, Execution, Deployment -> Compilerで、Shared build process heap size (Mbytes)を700から2000に増やした所、1.41.5共にコンパイルが成功しました。 f:id:wrongwrongwrongwrong163377:20210903183629p:plain

ただし、これは対処療法的な対応で、実際にはIDEコンパイラ側でOOMが起きないバージョンが出れば アップデートするなどの対応が必要と思われます。

参考にさせて頂いた内容

発行されていたissueのコメントそのままの対応です。

【MySQL】SQL_CALC_FOUND_ROWS + SELECT FOUND_ROWS()でLIMIT前の行数をカウントする方法はMySQL8.0.17で非推奨化している

本文

タイトルとMySQLの公式ドキュメントに書かれている内容が全てです。 dev.mysql.com

SQL_CALC_FOUND_ROWS SELECT FOUND_ROWS()」というような形で検索しても非推奨化している旨がパッとは出てこなかったためこの記事を書きました。

補足

公式ドキュメントに書かれている内容で、SQL_CALC_FOUND_ROWS + SELECT FOUND_ROWS()を使わない理由は以下のようになるかなと思います。

  • 一部の最適化が効かないため遅い場合がある
  • UNIONと合わせた時に特別な扱いが必要になる
  • ステートメントベースのレプリケーションでは、確実にFOUND_ROWS()をレプリケートすることができない

【Spring】SQLにパラメータとしてJSON配列を設定したい場合、JSON_ARRAYを使う

NamedParameterJdbcTemplateに対して発行するクエリで、JSON配列をパラメータとして設定する所で詰まったので、備忘用のメモです。

状況

以下のような処理を行うクエリを作成していました。

select  JSON_OVERLAPS(/* テーブルから取得したJSON配列 */, /* パラメータとして設定したJSON配列 */)
from ...

実装当初は、以下のように、JSON配列を表す'[]'の中にプリペアドステートメントを用意する形で考えていました。

// Java上のパラメータ設定
MapSqlParameterSource("arrayValues", arrayValues);
-- 発行するクエリ
select  JSON_OVERLAPS(table.json_array,'[:arrayValues]')
from table;

起きた問題

先程紹介したクエリでは、:arrayValuesが置き換えられず、実行時エラーが発生します。
これが置き換えられない原因は、SQLインジェクション対策で、Spring側がシングルクォートで囲われた範囲のパラメータを置き換えないためです。

stackoverflow.com

解決方法

生の配列に入れるのではなく、JSON_ARRAYで囲めば大丈夫でした。

select  JSON_OVERLAPS(table.json_array,JSON_ARRAY(:arrayValues))
from table;

【Confulence】テンプレートに画像を添付できない問題をGoogle Drive経由で回避する

Confulenceには現在テンプレートに画像を添付できない不具合が有ります。

jira.atlassian.com

この不具合は2021年7月に「今後3ヶ月以内(最長11月内?)のリリースを目指す(意訳)」というコメントが残されていますが、すぐにでもなんとかしたい方向けの記事です。

やり方

community.atlassian.com

上記記事内でもいくつか回避策が書かれていますが、この記事ではGoogle Driveを経由して画像を貼る方法を書きます。

手順

まず、貼りたい画像をGoogle Driveに上げ、リンクを取得しておきます。

次に、/docsで、Google Docsからの挿入メニューを呼び出します。
これはツールバー右端の+ ∨マークからも呼び出せます。

選択すると、以下のようなモーダルが出てくるので、Google Docs URL*の項目に先程取得したリンクを貼り付けます。
サイズ(画素数)の大きな画像の場合、そのままInsertを選択しても大丈夫です。 小さな画像の場合、余白が大きなスペースを取ってしまうことがありますが、その場合画像サイズに合わせてサイズを入力すると余白を小さくできます。

プレビューは以下のような表示になりますが、1度保存すると正常に出てくるようになります。

Intellij IDEAで、Kotlinプラグインを1.5にアップデートしたらビルドができなくなった問題への対処

2021/5/14追記

幾らか試した雰囲気では、File->Project Structure->Project ->Project SDKのバージョンが1.8(Java 8)だとこの問題が出るように見えました。
ここをJava 12以降(試したのが12と16だっただけで、それ以前でできないかは見ていません)にすることで症状が収まるようです。

プロジェクトのimlファイル、及び.ideaフォルダを消すやり方の場合、Project Structureに関する設定もリセットされるため、解決したのはそこでバージョンが変わったことが理由だったかもしれません。


TL;DR

  • 自分の場合、プロジェクトの方が壊れたようだった
  • よって、プロジェクトのimlファイル、及び.ideaフォルダを消してプロジェクトを読み直した所、ビルドできるようになった

本文

Intellij IDEAKotlinプラグインをアップデートした所ビルドが通らなくなったため、対処でやったことをまとめます。

バージョンやプロジェクト情報は以下の通りです。

  • プロジェクト: Maven
  • Kotlin: 1.3.71

発生していた問題

自分の場合は、無限にコンパイルが進まなくなるか、java.lang.OutOfMemoryError: Java heap spaceが出るかの2種類の問題が発生していました。

対処法

成功したもの

冒頭に書いたとおり、壊れたのはプロジェクトの方だったようで、${プロジェクト名}.iml及び.ideaフォルダを消した上で再度プロジェクトをロードした所ビルドができるようになりました。

mvn clean:cleanや、プラグインの再インストール、IDEのアップデート(2020.3 -> 2021.1)も効果がありませんでした。

その他試したこと

-Xuse-old-backend

下記の投稿にて、-Xuse-old-backendを設定すれば良いという情報を見つけたので、プロジェクトのpom.xmlに設定したり、Project Structure -> Kotlin -> Additional command line parametersに設定したりしましたが。

キャッシュ削除

ビルドキャッシュが悪さしていないかを確認するため、mvn clean:cleanを行ったり、成果物が入るtargetディレクトリを削除して確認を行いました。

次に、Invalidate CachesIDEAのキャッシュを削除しました。

プラグインの再インストール(バージョンを下げる)

きっかけとなったKotlinプラグインの再インストール・バージョンダウンも試しました。

まずPluginsからKotlinプラグインをアンインストールします。 f:id:wrongwrongwrongwrong163377:20210510141242p:plain

次に下記のページからインストールしたいバージョンのプラグインを落とします。
kotlin-plugin-203-1.4.32-release-IJ7148.5.zipみたいな名前のzipファイルが落ちてきます。

plugins.jetbrains.com

最後に、落としてきたzipファイルをInstall plugin from diskで選択すれば再インストールが完了します。 f:id:wrongwrongwrongwrong163377:20210510141632p:plain

この方法でバージョンを下げた時もアップデート通知が来るため、仮にプラグインが問題だった場合は注意が必要です。