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 + -
显示快捷键?