2015-12-30 68 views
2

第一背景。Firebird CHAR_TO_UUID,因GDS異常失敗。 335544606

我使用Java作爲Eclipse RCP(efxclipse)編寫桌面應用程序。 我的配置:

  • Eclipse的火星
  • efxclipse 2.0.0
  • JDK 1.8_66
  • 的Equinox OSGi框架
  • 火鳥2.5.5.26952
  • Jaybird 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作爲主鍵和GET行我使用像

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並且出現了問題。

問題:

升級到火鳥2.5.5代碼部分在哪裏取爲已知的「ID」行後拋出「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] 

值是字符串在36炭化長度(我檢查了它,直到上週纔有效)。我已經轉向Jaybird 2.2.9問題了。 據我瞭解,這是關係到像發送參數值UTF8字符串(長度×4),所以我改變了我的代碼看起來象下面這樣:

p.setObject(1, id.getBytes(StandardCharsets.US_ASCII)); 

同樣,沒有結果,同樣的問題。

而且這可能是一些與Jaybird連接參數octetsAsBytes相關,但我無法管理應用是正確的(通過HikariCP)。 我試圖

config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?"); 

在HikariCP設置,但結果並沒有改變。

在此先感謝。

+0

這適用於我通過普通JDBC(不使用數據源或連接池)使用Firebird WI-V2.5.5.26952和Jaybird 2.2.9。 –

+0

問題是從升級Firebird開始還是升級jaybird?請注意,對於'nonStandardProperty',你不應該包含這些問號,儘管這個屬性對這裏的行爲沒有任何影響。 –

+0

如果你嘗試使用單字節連接編碼,如win1252,會發生什麼情況? –

回答

1

我可以在Firebird 2.5.4,2.5.5和Firebird 3的最新快照(2.5.3和更早版本似乎不受影響)中重現此內容。我已經能夠重現這一點,問題似乎在Firebird本身。

正如前面所評論的,一個解決方法是將參數轉換爲一個明確的字符集:

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

我在火鳥跟蹤報道這創造了票:CORE-5062,它將被固定在火鳥2.5.6和Firebird 3 RC2