phoenix 5.0
创建序列:
CREATE SEQUENCE SEQ_T_TEST_ID START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 CYCLE CACHE 100;
START WITH: 从1开始
NCREMENT BY: 每次增长1
MINVALUE 、MAXVALUE :最小值、最大值
CYCLE: 当达到最大值后,从最小值开始。循环的过程。
CACHE:客户端缓存100
删除序列:
DROP SEQUENCE SEQ_T_TEST_ID;
注意:序列ID,使用Java的Long类型,接收。
-- 查询所有序列
select * from system."SEQUENCE";
-- 查看当前序列值
SELECT CURRENT VALUE FOR SEQ_T_TEST_ID;
客户端连接断开,重新连接,如果直接查询某个序列当前值,是会报错的。
Error: ERROR 1206 (42Z06): NEXT VALUE FOR must be called before CURRENT VALUE FOR is called.
-- 使用序列值
SELECT NEXT VALUE FOR SEQ_T_TEST_ID FROM T_TEST2 LIMIT 1;
序列也可以结婚UPSERT使用,这里是集合查询使用。
原来有个想法打算使用序列,类似Oracle的rownum一样。
用来分页查询,但是phoenix是不行的。它的序列不支持子查询。
所以说,最好的方式还是结合UPSERT使用,将序列作为联合主键的其中一项。
序列跳跃增长:
java中,使用JDBC方式连接。如果断开,重连。那么序列的值直接进入下一个:CACHE值。
比如当前序列客户端缓存是100,我插入了30条数据。关闭释放了资源。
下次我获得连接,再次插入30条数据。我的序列就是101、102 。。 130。
所以客户端缓存不要设置太大,默认就是100。根据自己的业务逻辑来。
我在想使用类似线程池的方式,是否能够从一定程度上避免序列跳跃的情况呢?