最初の背景。
Java を Eclipse RCP (efxclipse) として使用してデスクトップ アプリケーションをコーディングしています。私の構成:
- 日食火星
- efxclipse 2.0.0
- JDK1.8_66
- Equinox OSGi フレームワーク
- ファイアバード 2.5.5.26952
- ジェイバード 2.2.9
- 接続プーリング ソリューションとしての HicariCP 2.4.1
データベース テーブルの例:
CREATE TABLE MYTABLE (
ID CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS NOT NULL CONSTRAINT PK_MY_INDEX PRIMARY KEY,
DATA VARCHAR(100)
);
HikariCP のセットアップ
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(100);
config.setDataSourceClassName("org.firebirdsql.pool.FBSimpleDataSource");
config.addDataSourceProperty("databaseName", cfg.getDbConnection());
config.addDataSourceProperty("user", cfg.getDbUser());
config.addDataSourceProperty("password", cfg.getDbPassword());
config.addDataSourceProperty("encoding", "UTF8");
//config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");
config.setMaximumPoolSize(cfg.getDbPoolSizeMax());
HikariDataSource ds = new HikariDataSource(config);
ds.setConnectionTimeout(5000);
// UUID を主キーとして使用し、行の取得には次のようなコードを使用します
Connection con = ds.getConnection();
query = "SELECT DATA FROM MYTABLE WHERE ID=char_to_uuid(?)";
PreparedStatement p = con.prepareStatement(query);
p.setString(1, id);
ここで、「id」は「57F2B8C7-E1D8-4B61-9086-C66D1794F2D9」のような値を持つ文字列です
先週まで、私は自分のコンピューターで Firebird 2.5.2xxx と Jaybird 2.2.8 を使用していましたが、このセットアップにはまったく問題はありません。次に、firebird のインストールをバージョン 2.5.5.26952 にアップグレードしたところ、問題が発生しました。
問題:
Firebird 2.5.5 にアップグレードした後、既知の「ID」の行をフェッチするコード部分で例外がスローされる
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544606. expression evaluation not supported
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:782) ~[na:na]
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeQuery(AbstractPreparedStatement.java:177) ~[na:na]
at com.zaxxer.hikari.proxy.PreparedStatementProxy.executeQuery(PreparedStatementProxy.java:52) ~[na:na]
at com.zaxxer.hikari.proxy.HikariPreparedStatementProxy.executeQuery(HikariPreparedStatementProxy.java) ~[na:na]
...
Caused by: org.firebirdsql.gds.GDSException: expression evaluation not supported
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092) ~[na:na]
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042) ~[na:na]
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlExecute2(AbstractJavaGDSImpl.java:1149) ~[na:na]
at org.firebirdsql.gds.impl.GDSHelper.executeStatement(GDSHelper.java:232) ~[na:na]
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:774) ~[na:na]
「id」の値は 36 文字の長さの文字列です (確認したところ、先週までは機能していました)。ここで Jaybird 2.2.9 の問題に切り替えました。私が理解している限り、これはパラメーター値を UTF8 文字列 (長さ x 4) として送信するようなものに関連しているため、コードを次のように変更しました。
p.setObject(1, id.getBytes(StandardCharsets.US_ASCII));
繰り返しますが、結果はありません。同じ問題です。
また、これは Jaybird 接続パラメーターoctetsAsBytesに関連するものかもしれませんが、(HikariCP を介して) 正しく適用することができませんでした。私が試してみました
config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");
HikariCPの設定で試してみましたが、結果は変わりませんでした。
前もって感謝します。