当前位置:   article > 正文

java Sequence生成器_java 生成sequence 步长

java 生成sequence 步长
  1. import java.sql.Connection;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. /**
  9. *
  10. * <b>Note</b>: Java实现的Sequence工具
  11. */
  12. public class SequenceUtil {
  13. /**
  14. * 单例模式
  15. */
  16. private static SequenceUtil instance = new SequenceUtil();
  17. /**
  18. * 存放序列的MAP
  19. */
  20. private Map<String, KeyInfo> keyMap = new HashMap<String, KeyInfo>(20);
  21. private static final int POOL_SIZE = 1;
  22. /**
  23. * 防止外部实例化
  24. */
  25. private SequenceUtil() {
  26. }
  27. /**
  28. * 单例模式,获取单例
  29. *
  30. * @return SequenceUtils的单例对象
  31. */
  32. public static SequenceUtil getInstance() {
  33. return instance;
  34. }
  35. /**
  36. * 获取下一个sequence值
  37. *
  38. * @param keyName
  39. * Sequence名称
  40. * @return 下一个Sequence键值
  41. */
  42. public synchronized int getNextKeyValue(String keyName) {
  43. KeyInfo keyInfo = null;
  44. Integer keyObject = null;
  45. try {
  46. if (keyMap.containsKey(keyName)) {
  47. keyInfo = keyMap.get(keyName);
  48. } else {
  49. keyInfo = new KeyInfo(keyName, POOL_SIZE);
  50. keyMap.put(keyName, keyInfo);
  51. }
  52. keyObject = keyInfo.getNextKey();
  53. } catch (SQLException e) {
  54. e.printStackTrace();
  55. }
  56. return keyObject;
  57. }
  58. }
  59. class KeyInfo {
  60. /**
  61. * 当前Sequence载体的最大值
  62. */
  63. private int maxKey;
  64. /**
  65. * 当前Sequence的最小值
  66. */
  67. private int minKey;
  68. /**
  69. * 下一个Sequence值
  70. */
  71. private int nextKey;
  72. /**
  73. * Sequence缓存值
  74. */
  75. private int poolSize;
  76. /**
  77. * Sequence的名称
  78. */
  79. private String keyName;
  80. /**
  81. * 更新存放Sequence表的语句
  82. */
  83. private static final String sql_update = "UPDATE intpub_Sequence SET KEYVALUE = KEYVALUE + ? WHERE KEYNAME = ?";
  84. /**
  85. * 查询Sequence表中的当前值
  86. */
  87. private static final String sql_query = "SELECT KEYVALUE FROM intpub_Sequence WHERE KEYNAME = ?";
  88. public KeyInfo(String keyName, int poolSize) throws SQLException {
  89. this.poolSize = poolSize;
  90. this.keyName = keyName;
  91. retrieveFromDB();
  92. }
  93. public String getKeyName() {
  94. return keyName;
  95. }
  96. public int getMaxKey() {
  97. return maxKey;
  98. }
  99. public int getMinKey() {
  100. return minKey;
  101. }
  102. public int getPoolSize() {
  103. return poolSize;
  104. }
  105. /**
  106. * 获取下一个Sequence值
  107. *
  108. * @return 下一个Sequence值
  109. * @throws SQLException
  110. */
  111. public synchronized int getNextKey() throws SQLException {
  112. if (nextKey > maxKey) {
  113. retrieveFromDB();
  114. }
  115. return nextKey++;
  116. }
  117. /**
  118. * 执行Sequence表初始化和更新工作
  119. *
  120. * @throws SQLException
  121. */
  122. private void retrieveFromDB() throws SQLException {
  123. Connection conn = ConnectionPool.getInstance().getConnection();
  124. // 查询数据库
  125. PreparedStatement pstmt_query = conn.prepareStatement(sql_query);
  126. pstmt_query.setString(1, keyName);
  127. ResultSet rs = pstmt_query.executeQuery();
  128. if (rs.next()) {
  129. maxKey = rs.getInt(1) + poolSize;
  130. minKey = maxKey - poolSize + 1;
  131. nextKey = minKey;
  132. rs.close();
  133. pstmt_query.close();
  134. } else {
  135. String init_sql = "INSERT INTO intpub_Sequence(KEYNAME,KEYVALUE) VALUES('"
  136. + keyName + "',10000 + " + poolSize + ")";
  137. Statement stmt = conn.createStatement();
  138. stmt.executeUpdate(init_sql);
  139. maxKey = 10000 + poolSize;
  140. minKey = maxKey - poolSize + 1;
  141. nextKey = minKey;
  142. stmt.close();
  143. return;
  144. }
  145. // 更新数据库
  146. conn.setAutoCommit(false);
  147. PreparedStatement pstmt_up = conn.prepareStatement(sql_update);
  148. pstmt_up.setLong(1, poolSize);
  149. pstmt_up.setString(2, keyName);
  150. pstmt_up.executeUpdate();
  151. pstmt_up.close();
  152. conn.commit();
  153. rs.close();
  154. pstmt_query.close();
  155. conn.close();
  156. }
  157. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/509106
推荐阅读
相关标签
  

闽ICP备14008679号