PostgreSql Partition + Hibernate Insert,postgresqlinsert

來源:互聯網
上載者:User

PostgreSql Partition + Hibernate Insert,postgresqlinsert

與Oracle不同,PostgreSQL需要手動控制分區規則引發器。

步驟一:建立分區

CREATE TABLE table_partition_1( CHECK partition_column criteria) INHENRITS (table)

步驟二:為分區表建立PK跟index,這裡使用btree
ALTER TABLE ONLY table_partition_1 ADD CONSTRAINT table_partition_1_pkey PRIMARY KEY (key_column);

CREATE INDEX index_table_partition_1 ON table_partition_1  USING btree(column);

步驟三:手動建立觸發器
CREATE OR REPLACE FUNCTION before_insert_table()  RETURNS trigger AS$BODY$ DECLARE  BEGINif criteria  thenEXECUTE 'insert into appropriate table ...'  SELECT  ($1).* '  USING NEW;end if;return null;END;$BODY$  LANGUAGE plpgsql VOLATILE  COST 100;ALTER FUNCTION before_insert_table()  OWNER TO db;

rule在大量操作時更合適,但是對於單獨操作會佔用較大的開銷。
CREATE RULE table_partition_1 _insert AS(criteria ...)DO INSTEAD     INSERT INTO table_partition_1 VALUES (NEW.*)

步驟四:觸發器方式hibernate向分區插入資料時,獲得的result count為0,會導致判斷失敗而復原。解決方案是使用rule,或者聲明分區插入時不進行result檢查。
@SQLInsert(sql = "INSERT INTO "+ "table(column,...)"+ " VALUES(?,...)", check = ResultCheckStyle.NONE)

在Java項目中,考慮到分區建立會採用job方式自動建立,可以通過function完成建立。
CREATE OR REPLACE FUNCTION "public"."function"()  RETURNS void AS $BODY$  DECLARE    _tablename text ;   quarter integer;record1 record;  BEGINselect function(now()) as quarter  into record1;  quarter := record1.quarter;_tablename := 'partition_name';PERFORM 1FROM   pg_catalog.pg_class cWHERE  c.relname = _tablename;IF FOUND <> TRUE THENEXECUTE 'CREATE TABLE ' || _tablename  || ' (        CHECK ( criteria)      ) INHERITS (table)';EXECUTE 'ALTER TABLE ' || _tablename  || ' OWNER TO db ';EXECUTE  ' alter table ' ||   _tablename || ' add CONSTRAINT  ' || _tablename||'_pkey  PRIMARY key (column) ' ;EXECUTE  ' CREATE INDEX ' || _tablename|| '_indexON '||  _tablename ||'USING btree(column)';   END IF;END$BODY$  LANGUAGE 'plpgsql' VOLATILE COST 100;ALTER FUNCTION "public"."function"() OWNER TO "db";



參考資料:entity-hibspec-customsql.html
postgresql-table-partitioning-hibernate.html



hibernate 串連postgresql資料庫儲存物件出錯

increment
用於為long, short或者int類型產生 唯一標識。只有在沒有其他進程往同一張表中插入資料時才能使用。 在叢集下不要使用。

identity
對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內建識別欄位提供支援。 返回的標識符是long, short 或者int類型的。

sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用產生器(generator)。返回的標識符是long, short或者 int類型的。

hilo
使用一個高/低位演算法高效的產生long, short 或者 int類型的標識符。給定一個表和欄位(預設分別是 hibernate_unique_key 和next_hi)作為高位值的來源。 高/低位演算法產生的標識符只在一個特定的資料庫中是唯一的。

seqhilo
使用一個高/低位演算法來高效的產生long, short 或者 int類型的標識符,給定一個資料庫序列(sequence)的名字。

uuid
用一個128-bit的UUID演算法產生字串類型的標識符, 這在一個網路中是唯一的(使用了IP地址)。UUID被編碼為一個32位16進位數位字串。

guid
在MS SQL Server 和 MySQL 中使用資料庫產生的GUID字串。

native
根據底層資料庫的能力選擇identity, sequence 或者hilo中的一個。

assigned
讓應用程式在save()之前為對象分配一個標示符。這是 <generator>元素沒有指定時的預設建置原則。
 
hibernate 串連 postgresql postgresql 的語句有特殊的要 HQL 會自動轉換成 postgresql 要的語句

會的,只要你寫的是標準的HQL語句。
如果你在做資料庫類型遷移,例如從sqlserver 換成postgreSQL,有些本地代碼它是不會轉換的,例如sqlserver中的dateadd函數。。

對於java資料庫開發,建議你去瞭解一下JDiy,它是一個超輕量級的資料庫架構。支援PostgreSql,操作資料庫非常簡單。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.