Я сталкиваюсь с странным поведением при вызове процедур в базе данных H2: первые несколько вызовов (от 1 до 3) будут успешно возвращены, затем следующий вызовы будут последовательно вызывать org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set;
, где первым параметром является, по-видимому, параметр OUT.Процедура H2 вызовет «Параметр не задан» после нескольких вызовов
Я также заметил, что этот шаблон отказа относится к DataSource
: несколько интерфейсов одной и той же базы данных H2 будут иметь возможность вызвать процедуру несколько раз, прежде чем последовательно выполнить ошибку.
Он также выглядит так, чтобы ждать достаточно долго, чтобы снова вызвать процедуру. Хотя я не уверен, сколько времени нужно ждать, это не менее 10 минут.
процедура создается с помощью следующего запроса:
CREATE OR REPLACE ALIAS ps_sleep as$$
String ps_sleep(int seconds) throws InterruptedException {
Thread.sleep(seconds * 1000);
return "DB Procedure : " + seconds + " seconds waited" ;
}
$$;
, который выполняется с помощью следующего кода Java:
((DataSource)getJNDIResource(datasourceJndiUri)).getConnection().prepareStatement(PS_SLEEP_QUERY).execute();
Затем процедура вызывается следующим кодом Java:
InitialContext context = new InitialContext();
DataSource ds = (DataSource) context.lookup(datasourceJndiUri);
Connection con = ds.getConnection();
CallableStatement cs = con.prepareCall("{?=call PS_SLEEP(?)}");
cs.registerOutParameter(1, java.sql.Types.VARCHAR);
cs.setInt(2, input_proc_timer);
cs.execute();
Я уверен, что значение input_proc_timer
всегда является int
.
StackTrace является следующее:
org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set; SQL statement:
?=call PS_SLEEP(?) [90012-173]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:331)
at org.h2.message.DbException.get(DbException.java:171)
at org.h2.message.DbException.get(DbException.java:148)
at org.h2.expression.Parameter.checkSet(Parameter.java:80)
at org.h2.command.Prepared.checkParameters(Prepared.java:163)
at org.h2.command.CommandContainer.query(CommandContainer.java:90)
at org.h2.command.Command.executeQuery(Command.java:195)
at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:189)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.execute(WrappedPreparedStatement.java:404)
at my.application.SomeServlet.doGet(SomeServlet.java:49)
[...]
Я бегу это под wildfly 8.1.0 и ее упакованной базы данных H2, который я считаю, это версия 1.3 (модуль h2 содержит h2-1.3.173 .jar). Я использую конфигурационный файл standalone-full.xml
, который я особо не модифицировал.
Я приветствую любой способ исправить это, и был бы особенно рад, если бы кто-нибудь мог объяснить, как это происходит.