diff --git a/README.md b/README.md index 6cc2e53..60969b9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 使用方法: -+ 在项目中放置jar包的地方把seq-1.6.2.jar、seq-1.6.2-sources.jar、seq-1.6.2-pom.xml复制过去 ++ 在项目中放置jar包的地方把seq-1.7.2.jar、seq-1.7.2-sources.jar、seq-1.7.2-pom.xml复制过去 + 在pom.xml中增加以下内容,然后执行maven命令:mvn clean ```xml @@ -18,7 +18,7 @@ com.yanghuanglin seq - 1.6.2 + 1.7.2 @@ -50,13 +50,13 @@ - ${project.basedir}/lib/seq-1.6.2.jar - ${project.basedir}/lib/seq-1.6.2-pom.xml - ${project.basedir}/lib/seq-1.6.2-sources.jar + ${project.basedir}/lib/seq-1.7.2.jar + ${project.basedir}/lib/seq-1.7.2-pom.xml + ${project.basedir}/lib/seq-1.7.2-sources.jar default com.yanghuanglin seq - 1.6.2 + 1.7.2 jar true @@ -461,6 +461,17 @@ public interface Generator { */ boolean lock(Sequences sequences); + /** + * 忽略{@link Sequences#getSeq()} ,仅通过{@link Sequences#getKey()}和{@link Sequences#getType()}来锁定序号。 + *

+ * 如果ignoreSeq为false,则等价于{@link #lock(Sequences)} + * + * @param sequences 需要锁定的序号 + * @param ignoreSeq 是否忽略序号 + * @return 锁定结果 + */ + boolean lock(Sequences sequences, boolean ignoreSeq); + /** * 释放所有未使用的序号 *

@@ -499,6 +510,16 @@ public interface Generator { */ void release(Sequences sequences); + /** + * 忽略{@link Sequences#getSeq()}来释放指定序号。一般用于业务对象删除后,对应序号需要回收使用时。 + *

+ * 如果ignoreSeq为false,则等价于{@link #release(Sequences)} + * + * @param sequences 需要释放的序号。一般是一个通过{@link Sequences#setKey(String)}、{@link Sequences#setType(String)}、{@link Sequences#setSeq(Long)}三方法一起手动构建或通过{@link Sequences#Sequences(String, String, Long)}构造方法构建的实例对象 + * @param ignoreSeq 是否忽略序号 + */ + void release(Sequences sequences, boolean ignoreSeq); + /** * 清空所有闲置序号和未锁定序号 */ @@ -524,4 +545,5 @@ public interface Generator { void clearBefore(Date end); } + ``` \ No newline at end of file diff --git a/pom.xml b/pom.xml index 48eef53..bfcbc10 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.yanghuanglin seq - 1.6.2 + 1.7.2 seq seq diff --git a/src/main/java/com/yanghuanglin/seq/dao/impl/SequencesUnlockDaoImpl.java b/src/main/java/com/yanghuanglin/seq/dao/impl/SequencesUnlockDaoImpl.java index c10a932..b49a280 100644 --- a/src/main/java/com/yanghuanglin/seq/dao/impl/SequencesUnlockDaoImpl.java +++ b/src/main/java/com/yanghuanglin/seq/dao/impl/SequencesUnlockDaoImpl.java @@ -33,10 +33,15 @@ public class SequencesUnlockDaoImpl implements SequencesUnlockDao { @Override public boolean delete(SequencesUnlock sequencesUnlock) { - String sql = "delete from `%s_unlock` where `%s`=? and `%s`=? and `%s`=?"; - sql = String.format(sql, tableConfig.getTable(), tableConfig.getKeyColumn(), tableConfig.getTypeColumn(), tableConfig.getSeqColumn()); - int result = this.jdbcTemplate.update(sql, sequencesUnlock.getKey(), sequencesUnlock.getType(), sequencesUnlock.getSeq()); - return result != 0; + String sql = "delete from `%s_unlock` where `%s`=? and `%s`=?"; + sql = String.format(sql, tableConfig.getTable(), tableConfig.getKeyColumn(), tableConfig.getTypeColumn()); + if (sequencesUnlock.getSeq() != null) { + sql += " and `%s`=?"; + sql = String.format(sql, tableConfig.getSeqColumn()); + return this.jdbcTemplate.update(sql, sequencesUnlock.getKey(), sequencesUnlock.getType(), sequencesUnlock.getSeq()) != 0; + } else { + return this.jdbcTemplate.update(sql, sequencesUnlock.getKey(), sequencesUnlock.getType()) != 0; + } } @Override diff --git a/src/main/java/com/yanghuanglin/seq/generator/Generator.java b/src/main/java/com/yanghuanglin/seq/generator/Generator.java index fd1c2a7..6c316d5 100644 --- a/src/main/java/com/yanghuanglin/seq/generator/Generator.java +++ b/src/main/java/com/yanghuanglin/seq/generator/Generator.java @@ -167,6 +167,17 @@ public interface Generator { */ boolean lock(Sequences sequences); + /** + * 忽略{@link Sequences#getSeq()} ,仅通过{@link Sequences#getKey()}和{@link Sequences#getType()}来锁定序号。 + *

+ * 如果ignoreSeq为false,则等价于{@link #lock(Sequences)} + * + * @param sequences 需要锁定的序号 + * @param ignoreSeq 是否忽略序号 + * @return 锁定结果 + */ + boolean lock(Sequences sequences, boolean ignoreSeq); + /** * 释放所有未使用的序号 *

@@ -205,6 +216,16 @@ public interface Generator { */ void release(Sequences sequences); + /** + * 忽略{@link Sequences#getSeq()}来释放指定序号。一般用于业务对象删除后,对应序号需要回收使用时。 + *

+ * 如果ignoreSeq为false,则等价于{@link #release(Sequences)} + * + * @param sequences 需要释放的序号。一般是一个通过{@link Sequences#setKey(String)}、{@link Sequences#setType(String)}、{@link Sequences#setSeq(Long)}三方法一起手动构建或通过{@link Sequences#Sequences(String, String, Long)}构造方法构建的实例对象 + * @param ignoreSeq 是否忽略序号 + */ + void release(Sequences sequences, boolean ignoreSeq); + /** * 清空所有闲置序号和未锁定序号 */ diff --git a/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java b/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java index 1031d10..9baa618 100644 --- a/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java +++ b/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java @@ -111,7 +111,7 @@ public class SequencesGenerator implements Generator { @Override public synchronized String generate(String key, String type, Integer minLength) { - Sequences sequences = this.generate(key, type); + Sequences sequences = generate(key, type); if (sequences == null) return null; return sequences.format(minLength); @@ -242,6 +242,18 @@ public class SequencesGenerator implements Generator { return sequencesUnlockDao.delete(condition); } + @Override + public synchronized boolean lock(Sequences sequences, boolean ignoreSeq) { + if (!ignoreSeq) + return lock(sequences); + if (sequences == null) + return true; + SequencesUnlock condition = new SequencesUnlock(sequences); + condition.setSeq(null); + //将使用中表的对应数据删除,空闲表中数据在生成时会删除,因此这里不需要处理该表 + return sequencesUnlockDao.delete(condition); + } + @Override public synchronized void release() { //列出所有使用中表存在的序号 @@ -292,6 +304,20 @@ public class SequencesGenerator implements Generator { sequencesUnusedDao.save(new SequencesUnused(sequences, new Date())); } + @Override + public synchronized void release(Sequences sequences, boolean ignoreSeq) { + if (!ignoreSeq) { + release(sequences); + return; + } + if (sequences == null) + return; + SequencesUnlock sequencesUnlock = new SequencesUnlock(sequences); + sequencesUnlock.setSeq(null); + sequencesUnlockDao.delete(sequencesUnlock); + //由于忽略了序号,因此不需要将未使用序号放到SequencesUnused里面 + } + @Override public synchronized void clear() { sequencesUnlockDao.deleteAll();