2016-12-01 5 views
0

Я сталкиваюсь с странным поведением при вызове процедур в базе данных 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, который я особо не модифицировал.

Я приветствую любой способ исправить это, и был бы особенно рад, если бы кто-нибудь мог объяснить, как это происходит.

ответ

0

Похоже, что это была ошибка с этой версией h2.

This github issue поставил меня на этот трек, и хотя я все еще воспроизводил ошибку с версией 1.3.170, обновление до 1.4.193 исправило мою проблему.