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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cachelru.java

?? 非常棒的java數(shù)據(jù)庫
?? 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 last recently used (LRU) algorithm.
 */
public class CacheLRU implements Cache {

    public static final String TYPE_NAME = "LRU";

    private final CacheWriter writer;
    private int len;
    private int maxSize;
    private CacheObject[] values;
    private int mask;
    private int recordCount;
    private int sizeMemory;
    private CacheObject head = new CacheHead();

    public CacheLRU(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);
        clear();
    }

    public void clear() {
        head.next = head.previous = head;
        values = new CacheObject[len];
        recordCount = 0;
        sizeMemory = 0;
    }

    public void put(CacheObject rec) throws SQLException {
        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++;
        sizeMemory += rec.getMemorySize();
        addToFront(rec);
        removeOldIfRequired();
    }

    public CacheObject update(int pos, CacheObject rec) throws SQLException {
        CacheObject old = find(pos);
        if (old == null) {
            put(rec);
        } else {
            if (SysProperties.CHECK) {
                if (old != rec) {
                    throw Message.getInternalError("old != record old=" + old + " new=" + rec);
                }
            }
            removeFromLinkedList(rec);
            addToFront(rec);
        }
        return old;
    }

    private void removeOldIfRequired() throws SQLException {
        // a small method, to allow inlining
        if (sizeMemory >= maxSize) {
            removeOld();
        }
    }

    private void removeOld() throws SQLException {
        int i = 0;
        ObjectArray changed = new ObjectArray();
        while (sizeMemory * 4 > maxSize * 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;
            }
            CacheObject last = head.next;
            if (SysProperties.CHECK && last == head) {
                throw Message.getInternalError("try to remove head");
            }
            // we are not allowed to remove it if the log is not yet written
            // (because we need to log before writing the data)
            // also, can't write it if the record is pinned
            if (!last.canRemove()) {
                removeFromLinkedList(last);
                addToFront(last);
                continue;
            }
            remove(last.getPos());
            if (last.isChanged()) {
                changed.add(last);
            }
        }
        if (changed.size() > 0) {
            CacheObject.sort(changed);
            for (i = 0; i < changed.size(); i++) {
                CacheObject rec = (CacheObject) changed.get(i);
                writer.writeBack(rec);
            }
        }
    }

    private void addToFront(CacheObject rec) {
        if (SysProperties.CHECK && rec == head) {
            throw Message.getInternalError("try to move head");
        }
        rec.next = head;
        rec.previous = head.previous;
        rec.previous.next = rec;
        head.previous = rec;
    }

    private void removeFromLinkedList(CacheObject rec) {
        if (SysProperties.CHECK && rec == head) {
            throw Message.getInternalError("try to remove head");
        }
        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 void remove(int pos) {
        int index = pos & mask;
        CacheObject rec = values[index];
        if (rec == null) {
            return;
        }
        if (rec.getPos() == pos) {
            values[index] = rec.chained;
        } else {
            CacheObject last;
            do {
                last = rec;
                rec = rec.chained;
                if (rec == null) {
                    return;
                }
            } while (rec.getPos() != pos);
            last.chained = rec.chained;
        }
        recordCount--;
        sizeMemory -= rec.getMemorySize();
        removeFromLinkedList(rec);
        if (SysProperties.CHECK) {
            rec.chained = null;
            if (find(pos) != null) {
                throw Message.getInternalError("not removed!");
            }
        }
    }

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

    public CacheObject get(int pos) {
        CacheObject rec = find(pos);
        if (rec != null) {
            removeFromLinkedList(rec);
            addToFront(rec);
        }
        return rec;
    }

//    private void testConsistency() {
//        int s = size;
//        HashSet set = new HashSet();
//        for(int i=0; i<values.length; i++) {
//            Record rec = values[i];
//            if(rec == null) {
//                continue;
//            }
//            set.add(rec);
//            while(rec.chained != null) {
//                rec = rec.chained;
//                set.add(rec);
//            }
//        }
//        Record rec = head.next;
//        while(rec != head) {
//            set.add(rec);
//            rec = rec.next;
//        }
//        rec = head.previous;
//        while(rec != head) {
//            set.add(rec);
//            rec = rec.previous;
//        }
//        if(set.size() != size) {
//            System.out.println("size="+size+" but el.size="+set.size());
//        }
//    }

    public ObjectArray getAllChanged() {
//        if(Database.CHECK) {
//            testConsistency();
//        }
        // TODO cache: should probably use the LRU list
        ObjectArray list = new ObjectArray();
        for (int i = 0; i < len; i++) {
            CacheObject rec = values[i];
            while (rec != null) {
                if (rec.isChanged()) {
                    list.add(rec);
                    if (list.size() >= recordCount) {
                        if (SysProperties.CHECK) {
                            if (list.size() > recordCount) {
                                throw Message.getInternalError("cache chain error");
                            }
                        } else {
                            break;
                        }
                    }
                }
                rec = rec.chained;
            }
        }
        return list;
    }

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

    public String getTypeName() {
        return TYPE_NAME;
    }

}

// Unmaintained reference code (very old)
//import java.util.Iterator;
//import java.util.LinkedHashMap;
//import java.util.Map;
//
//public class Cache extends LinkedHashMap {
//
//    final static int MAX_SIZE = 1 << 10;
//    private CacheWriter writer;
//
//    public Cache(CacheWriter writer) {
//        super(16, (float) 0.75, true);
//        this.writer = writer;
//    }
//
//    protected boolean removeEldestEntry(Map.Entry eldest) {
//        if(size() <= MAX_SIZE) {
//            return false;
//        }
//        Record entry = (Record) eldest.getValue();
//        if(entry.getDeleted()) {
//            return true;
//        }
//        if(entry.isChanged()) {
//            try {
////System.out.println("cache write "+entry.getPos());
//                writer.writeBack(entry);
//            } catch(SQLException e) {
//                // TODO cache: printStackTrace not needed 
//                // if we use our own hashtable
//                e.printStackTrace();
//            }
//        }
//        return true;
//    }
//
//    public void put(Record rec) {
//        put(new Integer(rec.getPos()), rec);
//    }
//
//    public Record get(int pos) {
//        return (Record)get(new Integer(pos));
//    }
//
//    public void remove(int pos) {
//        remove(new Integer(pos));
//    }
//
//    public ObjectArray getAllChanged() {
//        Iterator it = values().iterator();
//        ObjectArray list = new ObjectArray();
//        while(it.hasNext()) {
//            Record rec = (Record)it.next();
//            if(rec.isChanged()) {
//                list.add(rec);
//            }
//        }
//        return list;
//    }
//}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区av| 一个色综合网站| 在线视频你懂得一区二区三区| 日本成人在线看| 亚洲色图.com| 久久久久国色av免费看影院| 欧美三级在线看| 不卡高清视频专区| 韩国精品久久久| 天天色天天操综合| 亚洲视频一二三| 久久亚洲欧美国产精品乐播| 欧美亚洲免费在线一区| 成人av资源在线| 国产在线精品一区二区不卡了| 水野朝阳av一区二区三区| 亚洲精品乱码久久久久久久久 | 久久69国产一区二区蜜臀| 综合网在线视频| 久久久噜噜噜久久人人看| 欧美色国产精品| 色综合视频在线观看| 成人黄色免费短视频| 精品一区二区久久久| 日韩国产欧美在线播放| 亚洲国产精品一区二区尤物区| 亚洲欧洲美洲综合色网| 国产精品理论片在线观看| 国产亚洲va综合人人澡精品 | 亚洲人成7777| 国产日韩欧美a| 久久日韩粉嫩一区二区三区| 欧美xxxx在线观看| 精品欧美一区二区三区精品久久| 欧美理论在线播放| 欧美日韩高清一区| 欧美精品久久久久久久多人混战| 在线观看一区日韩| 欧美在线一区二区| 欧美日韩国产综合久久| 欧美性生交片4| 欧美二区乱c少妇| 欧美精品丝袜久久久中文字幕| 欧美亚洲国产一区在线观看网站| 在线观看亚洲精品视频| 欧美无砖砖区免费| 91麻豆精品国产91久久久更新时间| 欧美三级韩国三级日本一级| 欧美精选在线播放| 日韩一区二区三区视频在线| 欧美va天堂va视频va在线| 26uuu欧美日本| 国产精品乱码一区二三区小蝌蚪| 国产精品免费看片| 亚洲精品国产高清久久伦理二区| 亚洲综合一区二区精品导航| 午夜久久电影网| 蜜臀av一区二区三区| 国产精品一区二区不卡| www.欧美色图| 欧美网站大全在线观看| 欧美一区二区在线播放| 国产日产欧美一区二区三区| 亚洲视频一区二区在线观看| 亚洲18女电影在线观看| 久久国产欧美日韩精品| 国产成人免费9x9x人网站视频| 成人av网址在线观看| 欧美亚洲免费在线一区| 精品国产免费久久| 亚洲视频一区二区在线| 日本美女一区二区| 大白屁股一区二区视频| 欧美亚州韩日在线看免费版国语版| 欧美一级理论性理论a| 欧美—级在线免费片| 亚洲国产欧美日韩另类综合| 乱一区二区av| 色哟哟亚洲精品| 欧美一区国产二区| 亚洲同性同志一二三专区| 午夜视频在线观看一区| 国产经典欧美精品| 欧美色手机在线观看| 久久精品亚洲一区二区三区浴池| 亚洲精品国产无天堂网2021| 精品一区二区三区视频| 色婷婷国产精品久久包臀| 精品久久久久久无| 亚洲图片欧美综合| 国产成人精品一区二区三区四区| 欧美日韩一区二区在线观看视频| 国产色产综合色产在线视频| 亚洲电影在线播放| 成人免费av资源| 日韩一区二区在线免费观看| 亚洲啪啪综合av一区二区三区| 欧美影院一区二区| 精品福利av导航| 亚洲午夜一区二区三区| 国产suv精品一区二区三区| 91精品久久久久久久久99蜜臂| 国产精品久久久久久久久果冻传媒| 日本特黄久久久高潮| 色综合久久99| 中文字幕第一区| 激情综合色综合久久综合| 欧美喷潮久久久xxxxx| 国产精品国产自产拍高清av| 国产精品一区三区| 欧美人狂配大交3d怪物一区| 中文字幕字幕中文在线中不卡视频| 国产一区不卡在线| 日韩丝袜情趣美女图片| 香蕉影视欧美成人| 色视频成人在线观看免| 中文字幕在线不卡一区二区三区| 国产在线不卡一区| 精品国产不卡一区二区三区| 日本怡春院一区二区| 欧美日韩一区高清| 亚洲国产精品精华液网站| 色综合色综合色综合| 国产精品高清亚洲| 成人h精品动漫一区二区三区| 久久久久久久免费视频了| 国内精品久久久久影院色 | 色老汉一区二区三区| 中文字幕一区不卡| 99久久国产综合精品色伊| 国产精品电影一区二区| 成人黄动漫网站免费app| 国产精品入口麻豆原神| 国产aⅴ综合色| 国产精品福利一区| 色综合久久久久综合| 亚洲免费伊人电影| 欧美在线一二三四区| 亚洲综合另类小说| 欧美日韩国产在线播放网站| 婷婷久久综合九色综合绿巨人| 欧美群妇大交群中文字幕| 首页国产丝袜综合| 日韩午夜三级在线| 国模冰冰炮一区二区| 国产亚洲一区字幕| 99久久综合色| 亚洲精品国产a| 欧美日韩高清在线播放| 麻豆国产欧美一区二区三区| 亚洲精品在线三区| 高清国产一区二区三区| 亚洲情趣在线观看| 在线观看免费视频综合| 亚洲国产欧美日韩另类综合| 欧美一区二区三区在线电影| 韩日精品视频一区| 国产精品人人做人人爽人人添| 99久久综合国产精品| 亚洲韩国一区二区三区| 欧美一级理论片| 丰满白嫩尤物一区二区| 亚洲精品成人悠悠色影视| 欧美精品在线观看一区二区| 激情五月激情综合网| 国产精品青草综合久久久久99| 99视频精品在线| 日韩av一二三| 欧美国产成人精品| 欧美视频中文一区二区三区在线观看| 奇米影视在线99精品| 国产日韩欧美综合一区| 欧美日韩一区二区在线视频| 狠狠色狠狠色合久久伊人| 中文字幕日韩一区二区| 制服.丝袜.亚洲.另类.中文| 国产精品影音先锋| 亚洲精品成人悠悠色影视| 日韩欧美在线观看一区二区三区| 国产成人亚洲精品狼色在线 | 国产精品欧美一级免费| 欧美色国产精品| 国产成人午夜视频| 五月天精品一区二区三区| 久久久久久久综合| 欧美剧在线免费观看网站| 国产99久久久国产精品潘金 | 国产欧美一区视频| 欧美日韩精品二区第二页| 丁香六月久久综合狠狠色| 日韩中文字幕麻豆| 国产精品卡一卡二| 日韩精品一区二区三区swag | 久久―日本道色综合久久| 色妹子一区二区| 国产精品夜夜嗨| 午夜激情久久久| 亚洲精品伦理在线| 亚洲国产岛国毛片在线| 日韩欧美国产系列|