亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cache2q.java

?? 非常棒的java數據庫
?? JAVA
字號:
/*
 * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
 * (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.util;

import java.sql.SQLException;

import org.h2.constant.SysProperties;
import org.h2.engine.Constants;
import org.h2.message.Message;

/**
 * A cache implementation based on the 2Q algorithm.
 * For about the algorithm, see
 * http://www.vldb.org/conf/1994/P439.PDF .
 * In this implementation, items are moved from 'in'
 * queue and move to the 'main' queue if the are referenced again.
 */
public class Cache2Q implements Cache {

    public static final String TYPE_NAME = "TQ";
    private static final int MAIN = 1, IN = 2, OUT = 3;
    private static final int PERCENT_IN = 20, PERCENT_OUT = 50;

    private final CacheWriter writer;
    private int maxSize;
    private int maxMain, maxIn, maxOut;
    private CacheObject headMain = new CacheHead();
    private CacheObject headIn = new CacheHead();
    private CacheObject headOut = new CacheHead();
    private int sizeMain, sizeIn, sizeOut;
    private int recordCount;
    private int len;
    private CacheObject[] values;
    private int mask;

    public Cache2Q(CacheWriter writer, int maxKb) {
        int maxSize = maxKb * 1024 / 4;
        this.writer = writer;
        this.maxSize = maxSize;
        this.len = MathUtils.nextPowerOf2(maxSize / 64);
        this.mask = len - 1;
        MathUtils.checkPowerOf2(len);
        recalculateMax();
        clear();
    }

    public void clear() {
        headMain.next = headMain.previous = headMain;
        headIn.next = headIn.previous = headIn;
        headOut.next = headOut.previous = headOut;
        values = new CacheObject[len];
        sizeIn = sizeOut = sizeMain = 0;
        recordCount = 0;
    }

    private void recalculateMax() {
        maxMain = maxSize;
        maxIn = maxSize * PERCENT_IN / 100;
        maxOut = maxSize * PERCENT_OUT / 100;
    }

    private void addToFront(CacheObject head, CacheObject rec) {
        if (SysProperties.CHECK) {
            if (rec == head) {
                throw Message.getInternalError("try to move head");
            }
            if (rec.next != null || rec.previous != null) {
                throw Message.getInternalError("already linked");
            }
        }
        rec.next = head;
        rec.previous = head.previous;
        rec.previous.next = rec;
        head.previous = rec;
    }

    private void removeFromList(CacheObject rec) {
        if (SysProperties.CHECK && (rec instanceof CacheHead && rec.cacheQueue != OUT)) {
            throw Message.getInternalError();
        }
        rec.previous.next = rec.next;
        rec.next.previous = rec.previous;
        // TODO cache: mystery: why is this required? needs more memory if we
        // don't do this
        rec.next = null;
        rec.previous = null;
    }

    public CacheObject get(int pos) {
        CacheObject r = findCacheObject(pos);
        if (r == null) {
            return null;
        }
        if (r.cacheQueue == MAIN) {
            removeFromList(r);
            addToFront(headMain, r);
        } else if (r.cacheQueue == OUT) {
            return null;
        } else if (r.cacheQueue == IN) {
            removeFromList(r);
            sizeIn -= r.getMemorySize();
            sizeMain += r.getMemorySize();
            r.cacheQueue = MAIN;
            addToFront(headMain, r);
        }
        return r;
    }

    private CacheObject findCacheObject(int pos) {
        CacheObject rec = values[pos & mask];
        while (rec != null && rec.getPos() != pos) {
            rec = rec.chained;
        }
        return rec;
    }

    private CacheObject removeCacheObject(int pos) {
        int index = pos & mask;
        CacheObject rec = values[index];
        if (rec == null) {
            return null;
        }
        if (rec.getPos() == pos) {
            values[index] = rec.chained;
        } else {
            CacheObject last;
            do {
                last = rec;
                rec = rec.chained;
                if (rec == null) {
                    return null;
                }
            } while (rec.getPos() != pos);
            last.chained = rec.chained;
        }
        recordCount--;
        if (SysProperties.CHECK) {
            rec.chained = null;
        }
        return rec;
    }

    public void remove(int pos) {
        CacheObject r = removeCacheObject(pos);
        if (r != null) {
            removeFromList(r);
            if (r.cacheQueue == MAIN) {
                sizeMain -= r.getMemorySize();
            } else if (r.cacheQueue == IN) {
                sizeIn -= r.getMemorySize();
            }
        }
    }

    private void removeOldIfRequired() throws SQLException {
        // a small method, to allow inlining
        if ((sizeIn >= maxIn) || (sizeOut >= maxOut) || (sizeMain >= maxMain)) {
            removeOld();
        }
    }

    private void removeOld() throws SQLException {
        int i = 0;
        ObjectArray changed = new ObjectArray();
        while (((sizeIn * 4 > maxIn * 3) || (sizeOut * 4 > maxOut * 3) || (sizeMain * 4 > maxMain * 3))
                && recordCount > Constants.CACHE_MIN_RECORDS) {
            i++;
            if (i == recordCount) {
                writer.flushLog();
            }
            if (i >= recordCount * 2) {
                // can't remove any record, because the log is not written yet
                // hopefully this does not happen too much, but it could happen
                // theoretically
                // TODO log this
                break;
            }
            if (sizeIn > maxIn) {
                CacheObject r = headIn.next;
                if (!r.canRemove()) {
                    removeFromList(r);
                    addToFront(headIn, r);
                    continue;
                }
                sizeIn -= r.getMemorySize();
                int pos = r.getPos();
                removeCacheObject(pos);
                removeFromList(r);
                if (r.isChanged()) {
                    changed.add(r);
                }
                r = new CacheHead();
                r.setPos(pos);
                r.cacheQueue = OUT;
                putCacheObject(r);
                addToFront(headOut, r);
                sizeOut++;
                if (sizeOut >= maxOut) {
                    r = headOut.next;
                    sizeOut--;
                    removeCacheObject(r.getPos());
                    removeFromList(r);
                }
            } else if (sizeMain > 0) {
                CacheObject r = headMain.next;
                if (!r.canRemove() && !(r instanceof CacheHead)) {
                    removeFromList(r);
                    addToFront(headMain, r);
                    continue;
                }
                sizeMain -= r.getMemorySize();
                removeCacheObject(r.getPos());
                removeFromList(r);
                if (r.isChanged()) {
                    changed.add(r);
                }
            }
        }
        if (changed.size() > 0) {
            CacheObject.sort(changed);
            for (i = 0; i < changed.size(); i++) {
                CacheObject rec = (CacheObject) changed.get(i);
                writer.writeBack(rec);
            }
        }
    }

    public ObjectArray getAllChanged() {
        ObjectArray list = new ObjectArray();
        for (CacheObject o = headMain.next; o != headMain; o = o.next) {
            if (o.isChanged()) {
                list.add(o);
            }
        }
        for (CacheObject o = headIn.next; o != headIn; o = o.next) {
            if (o.isChanged()) {
                list.add(o);
            }
        }
        CacheObject.sort(list);
        return list;
    }

    public CacheObject find(int pos) {
        CacheObject o = findCacheObject(pos);
        if (o != null && o.cacheQueue != OUT) {
            return o;
        }
        return null;
    }

    private void putCacheObject(CacheObject rec) {
        if (SysProperties.CHECK) {
            for (int i = 0; i < rec.getBlockCount(); i++) {
                CacheObject old = find(rec.getPos() + i);
                if (old != null) {
                    throw Message.getInternalError("try to add a record twice i=" + i);
                }
            }
        }
        int index = rec.getPos() & mask;
        rec.chained = values[index];
        values[index] = rec;
        recordCount++;
    }

    public void put(CacheObject rec) throws SQLException {
        int pos = rec.getPos();
        CacheObject r = findCacheObject(pos);
        if (r != null) {
            if (r.cacheQueue == OUT) {
                removeCacheObject(pos);
                removeFromList(r);
                removeOldIfRequired();
                rec.cacheQueue = MAIN;
                putCacheObject(rec);
                addToFront(headMain, rec);
                sizeMain += rec.getMemorySize();
            }
        } else if (sizeMain < maxMain) {
            removeOldIfRequired();
            rec.cacheQueue = MAIN;
            putCacheObject(rec);
            addToFront(headMain, rec);
            sizeMain += rec.getMemorySize();
        } else {
            removeOldIfRequired();
            rec.cacheQueue = IN;
            putCacheObject(rec);
            addToFront(headIn, rec);
            sizeIn += rec.getMemorySize();
        }
    }

    public CacheObject update(int pos, CacheObject rec) throws SQLException {
        CacheObject old = find(pos);
        if (old == null || old.cacheQueue == OUT) {
            put(rec);
        } else {
            if (old == rec) {
                if (rec.cacheQueue == MAIN) {
                    removeFromList(rec);
                    addToFront(headMain, rec);
                }
            }
        }
        return old;
    }

    public void setMaxSize(int maxKb) throws SQLException {
        int newSize = maxKb * 1024 / 4;
        maxSize = newSize < 0 ? 0 : newSize;
        recalculateMax();
        // can not resize, otherwise existing records are lost
        // resize(maxSize);
        removeOldIfRequired();
    }

    public String getTypeName() {
        return TYPE_NAME;
    }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区在线| 日韩久久久久久| 6080yy午夜一二三区久久| 国产亚洲精品bt天堂精选| 亚洲精品乱码久久久久久久久 | 午夜伦欧美伦电影理论片| 美腿丝袜亚洲一区| 亚洲同性同志一二三专区| 国产精品一区二区男女羞羞无遮挡| 懂色av噜噜一区二区三区av| 91福利精品视频| 久久精品视频一区二区| 性感美女久久精品| 色狠狠av一区二区三区| 国产三级精品视频| 精品午夜久久福利影院| 精品视频1区2区| 曰韩精品一区二区| 91亚洲精品久久久蜜桃| 国产亚洲欧洲一区高清在线观看| 日韩国产高清在线| 欧美日韩日日摸| 亚洲精品美腿丝袜| www.亚洲免费av| 2020国产精品久久精品美国| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 蜜桃av一区二区三区电影| 欧美精品在线一区二区| 亚洲国产你懂的| 精品视频免费看| 天天亚洲美女在线视频| 欧美二区乱c少妇| 亚洲成a人v欧美综合天堂| 欧美日韩中文字幕一区| 亚洲一区二区欧美日韩| 欧美日韩国产欧美日美国产精品| 亚洲一区在线视频| 欧美日韩一区小说| 亚洲国产裸拍裸体视频在线观看乱了| 91丨porny丨最新| 亚洲激情一二三区| 欧美浪妇xxxx高跟鞋交| 日韩激情一二三区| 欧美精品一区二区三区四区| 国产在线精品一区二区夜色 | 污片在线观看一区二区| 欧美久久免费观看| 久久91精品国产91久久小草| 26uuu久久综合| 成人一区在线看| 一区二区三区高清| 91精品国产综合久久蜜臀| 麻豆精品视频在线观看免费 | 欧美日韩一级片在线观看| 一区二区三区四区乱视频| 欧美日韩国产一级| 久久精工是国产品牌吗| 26uuu国产电影一区二区| 成人免费视频一区| 亚洲国产欧美在线| 精品久久一二三区| 91丨九色丨尤物| 日韩福利视频导航| 中文字幕欧美国产| 欧美日韩黄色一区二区| 国产一级精品在线| 一区二区三区日本| 久久综合色之久久综合| 色综合久久久久综合| 蜜臀91精品一区二区三区| 中文字幕av在线一区二区三区| 欧美性感一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲三级视频在线观看| 日韩三级视频在线看| 91在线观看免费视频| 麻豆精品蜜桃视频网站| 亚洲精品日日夜夜| 久久―日本道色综合久久| 欧洲亚洲精品在线| 成人综合在线视频| 美女脱光内衣内裤视频久久网站 | 亚洲va欧美va天堂v国产综合| 日韩欧美一级精品久久| 91在线免费播放| 国产一区三区三区| 日日欢夜夜爽一区| 亚洲免费av高清| 国产精品无人区| 欧美va亚洲va在线观看蝴蝶网| 色狠狠一区二区三区香蕉| 国产999精品久久久久久绿帽| 奇米一区二区三区| 亚洲小说欧美激情另类| 中文字幕一区二区三区色视频| 日韩欧美一卡二卡| 欧美老人xxxx18| 欧美吻胸吃奶大尺度电影 | 亚洲精品一区二区三区在线观看| 欧美体内she精高潮| 99re热这里只有精品免费视频| 国内精品伊人久久久久影院对白| 天天操天天干天天综合网| 一级精品视频在线观看宜春院| 中文字幕精品综合| 中文字幕欧美日本乱码一线二线| 欧美α欧美αv大片| 91精品国模一区二区三区| 欧美日韩精品综合在线| 欧美午夜精品久久久久久孕妇| 成人黄色电影在线 | 亚洲国产日韩精品| 亚洲一区二区中文在线| 洋洋成人永久网站入口| 一区二区激情视频| 亚洲一区成人在线| 午夜亚洲国产au精品一区二区| 亚洲一区二区三区三| 亚洲一区成人在线| 亚洲成av人片在www色猫咪| 亚洲一区二区黄色| 婷婷一区二区三区| 奇米影视一区二区三区小说| 日本少妇一区二区| 久久99精品国产| 国产高清成人在线| 不卡的电视剧免费网站有什么| 成人午夜在线播放| 色综合久久综合网97色综合| 91欧美一区二区| 欧美性色欧美a在线播放| 欧美人与z0zoxxxx视频| 日韩一级完整毛片| 久久久久国产免费免费| 国产精品久久久久一区二区三区共| 中文字幕一区三区| 亚洲成人综合在线| 久久福利资源站| 成人激情电影免费在线观看| 色综合天天在线| 日韩视频一区二区| 欧美国产成人精品| 亚洲图片一区二区| 国产在线国偷精品免费看| 99精品国产99久久久久久白柏 | 8v天堂国产在线一区二区| 精品国产污网站| 亚洲欧洲精品成人久久奇米网| 亚洲国产另类av| 韩国成人精品a∨在线观看| 99精品1区2区| 日韩一区二区三区三四区视频在线观看| 久久在线观看免费| 亚洲精品高清在线观看| 美女视频黄 久久| 99久久精品国产一区| 91精品欧美久久久久久动漫| 国产亚洲欧美日韩日本| 亚洲风情在线资源站| 国产成人啪免费观看软件| 欧美日韩久久久一区| 中文字幕在线一区| 麻豆国产一区二区| 91精品福利视频| 国产日本欧洲亚洲| 男人的天堂亚洲一区| 97se亚洲国产综合自在线| 欧美成人在线直播| 亚洲一卡二卡三卡四卡五卡| 大陆成人av片| 精品久久久网站| 午夜国产精品影院在线观看| 成人美女在线视频| 精品国产乱码久久久久久浪潮 | 久久精品免费观看| 欧美在线不卡视频| 亚洲欧洲色图综合| 国产不卡视频在线播放| 欧美一级黄色大片| 一二三区精品福利视频| 成人av电影免费观看| 精品99一区二区三区| 日韩在线a电影| 欧美性做爰猛烈叫床潮| 国产精品第五页| 成人小视频在线观看| 26uuu精品一区二区三区四区在线| 日韩不卡一区二区三区| 欧美三级一区二区| 一区二区国产视频| 在线看一区二区| 亚洲免费在线观看| 91丨porny丨最新| 亚洲欧洲av一区二区三区久久| 国产成人丝袜美腿| 亚洲国产成人在线| av网站一区二区三区| 中文字幕欧美一区| 91蝌蚪porny九色| 亚洲最快最全在线视频|