Первый фон.Firebird CHAR_TO_UUID, не удалось исключить GDS. 335544606
Я кодирую настольное приложение с Java как Eclipse RCP (efxclipse). Моя конфигурация:
- Затмение Mars
- efxclipse 2.0.0
- JDK 1.8_66
- Equinox OSGi рамки
- Firebird 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 в качестве первичных ключей и ПОЛУЧИТЬ строки Я использую подобный код
Connection con = ds.getConnection();
query = "SELECT DATA FROM MYTABLE WHERE ID=char_to_uuid(?)";
PreparedStatement p = con.prepareStatement(query);
p.setString(1, 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]
Значение «ИД» является строка длины при 36 полукокса (Я проверил, и это работало до последней недели). Я уже перешел на Jaybird 2.2.9. Насколько я понимаю, это связано с чем-то вроде отправки значения параметров, как UTF8 строки (длина х 4), так что я изменил мой код выглядит следующим образом:
p.setObject(1, id.getBytes(StandardCharsets.US_ASCII));
Опять же, нет результата, тот же вопрос.
Также это может быть связано с параметром соединения Jaybird октетовAsBytes, но я не смог применить его правильно (через HikariCP). Я попытался
config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");
при установке HikariCP, но результат не изменился.
Заранее спасибо.
Это работает для меня через простой JDBC (не используя DataSource или пул соединений) с использованием Firebird WI-V2.5.5.26952 и Jaybird 2.2.9. –
Проблема возникла при обновлении Firebird или при обновлении jaybird? Обратите внимание, что для 'nonStandardProperty' вы не должны включать эти вопросительные знаки, хотя это свойство не повлияло бы на поведение здесь. –
Что произойдет, если вы попробуете это с помощью кодирования одного байтового соединения, например win1252? –