powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Авто создание партиций при работающей Java проге?
6 сообщений из 6, страница 1 из 1
Авто создание партиций при работающей Java проге?
    #35377014
wssg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть в следующем:
Есть таблица, допустим, event;
Есть функция для вставки в эту таблицу - insert_event(...);
В этой функции при выполнении определенных условий создается партиция: ... event_1 inherit event... и дальнейшая запись должна идти в эту таблицу (event_1).

И вроде бы все отлично - при вызове insert_event из триггеров запись идет как надо, но
при вызове insert_event из Java проги запись идет в мастер таблицу (event).
Если перезапустить прогу или сделать реконнект, то начинает работать как надо.

Можно ли как-то разрулить эту ситуацию без перезапуска/реконнекта?
...
Рейтинг: 0 / 0
Авто создание партиций при работающей Java проге?
    #35377343
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте завершить транзакцию
...
Рейтинг: 0 / 0
Авто создание партиций при работающей Java проге?
    #35377992
wssg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatпопробуйте завершить транзакцию
Не совсем понятно, где именно завершать...
Вот код (в сокращенном варианте). Ткните пальцем.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE OR REPLACE FUNCTION insert_event(... куча параметров...)
  RETURNS bigint AS
$BODY$
declare
 ...
begin
...
execute check_event_part(..);
insert into event (...) values(...);
...
end;

CREATE OR REPLACE FUNCTION check_event_part(...)
  RETURNS void AS
$BODY$
declare 
..
BEGIN
...
	execute create_event_part(...);
...
END;

CREATE OR REPLACE FUNCTION create_event_part(...)
  RETURNS void AS
$BODY$
declare 
..
BEGIN
...
	execute 'create table '||p_part_name|| 
	'( CONSTRAINT '||p_part_name||'_check CHECK (event_date >= DATE '''||p_date||
	''' and event_date<DATE '''||p_next_date||'''))'||
	' INHERITS (event)';
	execute 'CREATE INDEX '||p_part_name||'_eventdate ON '||p_part_name||' (event_date)';
	execute 'CREATE OR REPLACE RULE '||p_part_name||'insert AS ON INSERT TO event '||
	'WHERE new.event_date >= DATE '''||p_date||''' and new.event_date<DATE '''||p_next_date||
	''' DO INSTEAD  INSERT INTO '||p_part_name||' VALUES (new.*)';
	execute 'CREATE TRIGGER tr_event_new AFTER INSERT ON '||p_part_name||
	' FOR EACH ROW EXECUTE PROCEDURE tr_event_new()';
END;
Есть несколько коннектов через которые вызывается insert_event и в коннекте в котором происходит создание партиции начинает все писаться в созданную таблицу, а остальные продолжают писать в мастер таблицу.

В Java у Connection AutoCommit=true;

Ощущение такое, что другие коннекты не видят RULE..
...
Рейтинг: 0 / 0
Авто создание партиций при работающей Java проге?
    #35378411
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wssg LeXa NalBatпопробуйте завершить транзакциюНе совсем понятно, где именно завершать...

...

В Java у Connection AutoCommit=true;вот это я и имел в виду. завершать транзакцию в соединении из джавы. так как выставлен AutoCommit, то транзакция завершается автоматически.

wssgВот код (в сокращенном варианте).

...

Есть несколько коннектов через которые вызывается insert_event и в коннекте в котором происходит создание партиции начинает все писаться в созданную таблицу, а остальные продолжают писать в мастер таблицу.

Ощущение такое, что другие коннекты не видят RULE..попробовал поймать постгрес на нетранзакционности рулов и sql-ных и plpgsql-ных функций. не получилось, в нижеследующем примере все работает правильно. я тестировал на 8.3.0, какая у вас версия постгреса? как у вас работает этот пример? его можно выполнять в двух одновременных подключениях через psql.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
-- 1
create table t1 ( id integer );
create table t2 ( id integer );
-- create function f1(integer) returns integer language 'sql' as
--   'insert into t1 values ( $1 ); select $1';
create function f1(integer) returns void language 'plpgsql' as
  'begin insert into t1 values ( $1 ); end;';
begin;
select f1(  1  );
select * from t1;
-- выдает 1

        -- 2
        begin;
        create rule r1 as on insert to t1 do instead
          insert into t2 values ( new.id );
        -- зависает на блокировке

-- 1
commit;
begin;
select f1(  2  );
-- зависает на блокировке

        -- 2
        commit;

-- 1
select * from t2;
-- выдает 2
commit;
drop rule r1 on t1;
drop function f1(integer);
drop table t2;
drop table t1;
...
Рейтинг: 0 / 0
Авто создание партиций при работающей Java проге?
    #35378855
wssg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat попробовал поймать постгрес на нетранзакционности рулов и sql-ных и plpgsql-ных функций. не получилось, в нижеследующем примере все работает правильно. я тестировал на 8.3.0, какая у вас версия постгреса? как у вас работает этот пример? его можно выполнять в двух одновременных подключениях через psql.

У меня постгрес 8.2.6. Пример не работает!
Буду пробовать на 8.3.1
...
Рейтинг: 0 / 0
Авто создание партиций при работающей Java проге?
    #35378916
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wssgУ меня постгрес 8.2.6. Пример не работает!Да, тоже проверил на оказавшемся под рукой 8.2.6. На блокировках зависает, но двойку вставляет в таблицу t1 вместо t2.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Авто создание партиций при работающей Java проге?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]