2

最初の背景。

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の設定で試してみましたが、結果は変わりませんでした。

前もって感謝します。

4

1 に答える 1

1

Firebird 2.5.4、2.5.5、および Firebird 3 の最近のスナップショットでこれを再現できます (2.5.3 以前は影響を受けないようです)。これを再現できましたが、問題は Firebird 自体にあるようです。

前にコメントしたように、回避策はパラメーターを明示的な文字セットにキャストすることです。

char_to_uuid(cast(? as char(36) character set utf8))

これを報告するために Firebird トラッカーでチケットを作成しました: CORE-5062 。Firebird 2.5.6 および Firebird 3 RC2 で修正される予定です。

于 2015-12-31T09:40:29.693 に答える