2016-03-06 2 views
0

У меня есть база данных postgresql с некоторой таблицей и хранимая процедура, которые записываются в эту таблицу. Все идет хорошо, когда я вызываю эту хранимую процедуру от psql: я вижу, что мои записи вставлены в мою таблицу. Хотя, когда я вызываю эту хранимую процедуру через JDBC, я получаю журнал выполнения хранимой процедуры, последовательность увеличивается, но моя таблица не обновляется.Хранимая процедура PostgresQL, вызванная из JDBC, не работает

Вот SQL я выполнил из свежей установки PostGreSQL (9.5.1):

создание таблицы:

CREATE SEQUENCE atable_id_seq; 
    CREATE TABLE IF NOT EXISTS "atable" (
    "id" int NOT NULL DEFAULT NEXTVAL('atable_id_seq'), 
    "name" varchar(250) DEFAULT NULL, 
    PRIMARY KEY ("id") 
); 

Создание хранимой процедуры:

CREATE OR REPLACE FUNCTION awrite(IN name character varying, OUT result character varying) AS 
$$ 
BEGIN 
      INSERT INTO atable(name) VALUES (name) 
        RETURNING atable.id INTO awrite.result; 
        RAISE INFO 'Create awrite: %', name; 
END 
$$ 
LANGUAGE plpgsql; 

Вызов awrite хранимая процедура от psql фактически запускает журнал в postgres и обновляет таблицу.

Затем я написал программу Java для вызова же хранимую процедуру:

HikariConfig hikariConfig = new HikariConfig(); 
hikariConfig.setDriverClassName("org.postgresql.Driver"); 
hikariConfig.setJdbcUrl("jdbc:postgresql://127.0.0.1:5432/toto?charSet=UNICODE"); 
hikariConfig.setUsername("toto"); 

hikariConfig.setAutoCommit(false); 
hikariConfig.setMinimumIdle(0); 
hikariConfig.setMaximumPoolSize(2); 

JdbcTemplate jdbcTemplate = 
     new JdbcTemplate(new HikariDataSource(hikariConfig)); 

SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("awrite"); 

HashMap<String, Object> params = new HashMap<String, Object>(); 
params.put("name", "Foo"); 

call.addDeclaredParameter(new SqlOutParameter("result", Types.VARCHAR)); 

Map<String, Object> result = call.execute(params); 
jdbcTemplate.execute("COMMIT;"); 

System.out.println("Result: "); 
for (String s : result.keySet()) { 
    System.out.println(s + ": " + result.get(s)); 
} 

я получить идентификатор и исполнение шло хорошо. Однако моя таблица не содержит записи.

Я не понимаю, может быть, кто-то может мне помочь?

ответ

0

Я считаю, что ваша проблема заключается в том, что вы устанавливаете флаг JCBC AutoCommit на значение false, но вы не используете транзакцию JDBC. Вам нужно запустить вызов в транзакции JDBC (проще всего поместить ваш код в метод и аннотировать метод с помощью @Transactional или начать и совершить транзакцию JDBC программно, используя TransactionTemplate). Вызов «COMMIT», как вы делаете, не работает.

Смежные вопросы