sequencemgr.java
来自「cwbbs 云网论坛源码」· Java 代码 · 共 224 行
JAVA
224 行
package com.redmoon.forum;import java.sql.*;import cn.js.fan.web.Global;import org.apache.log4j.Logger;import cn.js.fan.db.Conn;import cn.js.fan.cache.jcs.RMCache;import com.cloudwebsoft.framework.util.LogUtil;public class SequenceMgr implements com.cloudwebsoft.framework.base.ISequence, java.io.Serializable { String connname; private static final String LOAD_ID = "SELECT id FROM sq_id WHERE idType=?"; private static final String UPDATE_ID = "UPDATE sq_id SET id=? WHERE idType=? AND id=?"; public static final int MSG = 0; public static final int DOCUMENT = 1; public static final int AuctionOrderId = 2; public static final int ShopId = 3; public static final int SQ_CHATROOM = 4; public static final int SQ_FRIEND = 5; public static final int SQ_MASTER = 6; public static final int SQ_MESSAGE_ATTACH = 7; public static final int SQ_USER = 8; public static final int DOCUMENT_ATTACH = 9; public static final int COMMENT = 10; public static final int PHOTO = 11; public static final int SQ_FORBID_IP_RANGE = 12; public static final int CMS_IMAGES = 13; public static final int SQ_IMAGES = 14; public static final int SQ_SHORT_MESSAGE = 15; public static final int INFO_ATTACH = 16; public static final int PRICE_ID = 17; public static final int MARKET_ID = 18; public static final int SQ_CHATROOM_EMCEE = 19; public static final int CMS_TEMPLATE_ID = 20; public static final int THREAD_TYPE_ID = 21; public static final int SQ_AD_CONTENT_ID = 22; public static final int SQ_AD_BOARD_ID = 23; public static final int DIR_PRIV_ID = 24; public static final int BLOG_ID = 25; public static final int CMS_ROBOT_ID = 26; public static final int SQ_SCORE_RECORD = 27; public static final int SQ_SCHEDULER = 28; public static final int FORUM_ROBOT_ID = 29; public static final int CMS_SUBJECT_LIST_ID = 30; public static final int CMS_IMG_STORE_FILE = 31; public static final int CMS_SOFTWARE_FILE = 32; public static final int CMS_AD = 33; public static final int PLUGIN_WITKEY_EVALUATION = 34; public static final int DESKTOP_ITEM = 35; public static final int TOPIC_OP = 36; public static final int PLUGIN_PRESENT = 37; public static final int SQ_TAG_ID = 38; public static final int MESSAGE_REPORT_ID = 39; public static final int BLOG_LINK = 40; public static final int SQ_LINK = 41; public static final int PLUGIN_GROUP = 42; public static final int PLUGIN_GROUP_THREAD = 43; public static final int PLUGIN_GROUP_PHOTO = 44; public static final int PLUGIN_GROUP_ACTIVITY = 45; public static final int PLUGIN_AUCTION_CATALOG_PRIV = 46; public static final int PLUGIN_AUCTION_WORTH = 47; public static final int PLUGIN_AUCTOIN_BID = 48; public static final int MESSAGE_RECOMMEND_ID = 49; public static final int SMS_SEND_RECORD = 50; public static final int GUESTBOOK = 51; public static final int DIG = 52; public static final int BLOG_MUSIC = 53; public static final int BLOG_VIDEO = 54; public static final int PLUGIN_FETION_ACTIVITY_MEMBER = 55; public static final int SQ_FORUM_MUSIC_USER = 56; public static final int PLUGIN_EXAM_QUESTION = 57; public static final int PLUGIN_EXAM_QUESTION_OPTION = 58; public static final int PLUGIN_EXAM_USER_ANSWER = 59; public static final int PLUGIN_BLOG_TEMPLATE = 60; public static final int CMS_SITE_AD = 61; public static final int CMS_FLASH_STORE_FILE = 62; public static final int CMS_SITE_FLASH_IMAGE = 63; public static final int CMS_SITE_TEMPLATE = 64; public static final int CMS_SITE_SCROLL_IMG = 65; private static int INCREMENT = 10; static { INCREMENT = Global.isCluster() ? 1 : 10; } public SequenceMgr() { } public static String getTypeCacheKey(int idType) { return "bbs-Sequence-" + idType; } public static SequenceMgr getSequenceMgr(int idType) { if (Global.isCluster()) { return new SequenceMgr(idType); } else { SequenceMgr sm = (SequenceMgr) RMCache.getInstance().get( getTypeCacheKey(idType)); if (sm == null) { sm = new SequenceMgr(idType); try { RMCache.getInstance().put(getTypeCacheKey(idType), sm); } catch (Exception e) { e.printStackTrace(); } } return sm; } } public static long nextID() { return getSequenceMgr(MSG).nextUniqueID(); } public static long nextID(int type) { return getSequenceMgr(type).nextUniqueID(); } public long getNextId(int type) { return nextID(type); } private int type; private long currentID; private long maxID; public SequenceMgr(int type) { connname = Global.defaultDB; if (connname.equals("")) LogUtil.getLog(getClass()).info("SequenceMgr:DB is empty!"); this.type = type; currentID = 0l; maxID = 0l; } public synchronized long nextUniqueID() { if (!(currentID < maxID)) { getNextBlock(5); } long id = currentID; currentID++; return id; } private void getNextBlock(int count) { if (count == 0) { System.err.println( "Failed at last attempt to obtain an ID, aborting..."); return; } boolean success = false; Conn conn = new Conn(connname); PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(LOAD_ID); pstmt.setInt(1, type); ResultSet rs = pstmt.executeQuery(); if (!rs.next()) { throw new SQLException( "Loading the current ID failed. The sq_id table may not be correctly populated."); } long currentID = rs.getLong(1); pstmt.close(); long newID = currentID + INCREMENT; pstmt = conn.prepareStatement(UPDATE_ID); pstmt.setLong(1, newID); pstmt.setInt(2, type); pstmt.setLong(3, currentID); success = pstmt.executeUpdate() == 1; if (success) { this.currentID = currentID; this.maxID = newID; } } catch (Exception sqle) { sqle.printStackTrace(); } finally { try { pstmt.close(); } catch (Exception e) { e.printStackTrace(); } if (conn != null) { conn.close(); conn = null; } } if (!success) { LogUtil.getLog(getClass()).warn( "WARNING: failed to obtain next ID block due to " + "thread contention. Trying again..."); try { Thread.currentThread().sleep(75); } catch (InterruptedException ie) { LogUtil.getLog(getClass()).error(ie.getMessage()); } getNextBlock(count - 1); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?