`
BucketLi
  • 浏览: 195185 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

一个简单的BufferPool

 
阅读更多
一个简单的buffer分配和收集代码,将一大段buffer分片,外部向这个pool申请,如果全部用完,就额外分配,但不计入pool所持有的数量,外部使用完后,回收分片.

import java.nio.ByteBuffer;
import java.util.concurrent.locks.ReentrantLock;

public final class BufferPool {

    private final int chunkSize;
    private final ByteBuffer[] items;
    private final ReentrantLock lock;
    private int putIndex;
    private int takeIndex;
    private int count;
    private volatile int newCount;

    public BufferPool(int bufferSize, int chunkSize) {
        this.chunkSize = chunkSize;
        int capacity = bufferSize / chunkSize;
        capacity = (bufferSize % chunkSize == 0) ? capacity : capacity + 1;
        this.items = new ByteBuffer[capacity];
        this.lock = new ReentrantLock();
        for (int i = 0; i < capacity; i++) {
            insert(create(chunkSize));
        }
    }

    public int capacity() {
        return items.length;
    }

    public int size() {
        return count;
    }

    public int getNewCount() {
        return newCount;
    }

    public ByteBuffer allocate() {
        ByteBuffer node = null;
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            node = (count == 0) ? null : extract();
        } finally {
            lock.unlock();
        }
        if (node == null) {
            ++newCount;
            return create(chunkSize);
        } else {
            return node;
        }
    }

    public void recycle(ByteBuffer buffer) {
        // 拒绝回收null和容量大于chunkSize的缓存
        if (buffer == null || buffer.capacity() > chunkSize) {
            return;
        }
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            if (count != items.length) {
                buffer.clear();
                insert(buffer);
            }
        } finally {
            lock.unlock();
        }
    }

    private void insert(ByteBuffer buffer) {
        items[putIndex] = buffer;
        putIndex = inc(putIndex);
        ++count;
    }

    private ByteBuffer extract() {
        final ByteBuffer[] items = this.items;
        ByteBuffer item = items[takeIndex];
        items[takeIndex] = null;
        takeIndex = inc(takeIndex);
        --count;
        return item;
    }

    private int inc(int i) {
        return (++i == items.length) ? 0 : i;
    }

    private ByteBuffer create(int size) {
        return ByteBuffer.allocate(size);
    }
}
分享到:
评论

相关推荐

    41 在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样.pdf

    Buffer Pool是数据库用来缓存磁盘上数据页的一个内存结构,它能够提高数据库操作的效率。但为了保证数据库的可靠性,确保在发生故障时能够恢复数据,数据库还需要将这些操作记录到日志文件中。这部分日志文件记录被...

    深入理解MVCC与BufferPool缓存机制

    ### 深入理解MVCC与BufferPool缓存机制 #### 一、MVCC多版本并发控制机制 **MVCC**(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库事务处理的重要技术,它允许读取操作和写入操作在不相互...

    行业-16 简单的LRU链表在Buffer Pool实际运行中,可能导致哪些问题.rar

    Buffer Pool是数据库为了提高磁盘I/O性能而设立的一个内存区域,它用于存放数据库中的数据页。当Buffer Pool容量有限,而需要加载的数据页超过其大小时,LRU链表就起到了决定哪些页面应该被替换到磁盘上的作用。然而...

    16 简单的LRU链表在Buffer Pool实际运行中,可能导致哪些问题.pdf

    LRU链表在数据库管理系统中,特别是在MySQL的Buffer Pool缓冲池管理中,起到了核心的作用。其基本原理是将最近使用的数据页保留在链表的头部,而最少使用的数据页则位于链表的尾部。当缓冲池满时,系统会通过LRU链表...

    47 简单回顾一下, MySQL运行时多个事务同时执行是什么场景?l.pdf

    buffer pool是MySQL的一个重要组件,用于缓存从磁盘读取的数据页,提高数据库的访问速度。在执行增删改操作时,系统会先尝试在buffer pool中找到相应的缓存页,然后进行更新。如果缓存页不存在,则从磁盘加载数据页...

    mysql优化笔记参考

    - **InnoDB Buffer Pool** 是 InnoDB 存储引擎内部的一个缓存机制,主要用于缓存数据页和索引页。其目的是减少磁盘I/O操作,提高数据读取速度。 - **监控 Buffer Pool 的状态**:通过执行 `SHOW GLOBAL STATUS ...

    揭秘SQL Server 2014有哪些新特性(2)-固态硬盘 Buffer Pool(缓冲池) 扩展

    扩展文件在物理磁盘中表现为一个特殊的文件,其性能类似于操作系统的页面文件,但专用于数据库引擎。 启用时需要注意,缓冲池扩展的大小不能小于物理内存或设置的阈值,否则系统会报错。SQL Server为此提供了新的...

    SimpleDB实验1

    - **BufferPool**:缓冲池是SimpleDB中的一个重要组件,用于缓存磁盘上的数据页,以提高数据访问效率。当需要访问数据时,BufferPool会从磁盘加载数据并创建相应的`HeapPage`实例,然后将这个实例存储在缓冲池中。...

    mysql数据库经典操作工具(64位)

    它提供了直观的图形界面,使得数据库设计和管理变得简单易行。例如,你可以通过Navicat创建新的数据库,设置表结构,添加字段,定义数据类型,设置索引,甚至执行复杂的SQL查询。此外,Navicat还支持数据可视化,...

    Buffer_Handle_State_Object.rar

    在Oracle数据库中,每个Buffer Handle都会关联一个状态对象,用于记录该缓冲区当前的状态,如是否被修改(脏),是否被锁定,或者是否正被其他进程使用等。这种状态信息对于并发控制、事务处理和数据一致性维护起着...

    28 我们每一行的实际数据在磁盘上是如何存储的.pdf

    由于NULL值不需要占用存储空间,因此这个列表是一个位图,其中每个位代表一个列,位值为1表示相应列的值为NULL。 3. 然后是数据头,通常占用40个bit位,里面可能包含记录的事务ID(DB_TRX_ID)、回滚指针(DB_ROLL_...

    DB2缓冲池和索引调优的方法

    * 缓冲池的个数:每个表空间对应一个缓冲池,缓冲池的个数太多,会增加数据库的负载。 * 缓冲池的_pagesize:缓冲池的_pagesize决定了缓冲池的大小,缓冲池的_pagesize太小,会导致缓冲池的大小太小,缓冲池的_...

    优化 MySQL: 3 个简单的小调整1

    MySQL 数据库优化是一个重要的议题,尤其对于处理大量数据和高并发请求的Web应用程序。本文将介绍三个简单但有效的调整策略,旨在显著提升MySQL的性能。 首先,强烈推荐使用InnoDB存储引擎替代MyISAM。InnoDB提供了...

    DB2数据库创建脚本自动生成脚本 bash shell和Python开发

    之所以使用方便,是因为完全省去了人工换算表空间容器页大小,页数量换算操作,而且自动处理bufferpool与表空间关系,仅仅是简单回答问题,脚本自动生成脚本。静默模式,很高效的一种批量创建多套db2数据库的解决...

    MySQL 5.5 新特性介绍和性能评估

    MySQL 5.5 作为 Oracle 接管 MySQL AB 后发布的第一个重要版本,不仅对于 Oracle 自身的 LAMP / WAMP 软件堆栈具有重要意义,而且在功能和性能上也实现了显著的提升。MySQL 5.5 的设计主要面向 Web 应用程序,通过多...

    ORACLE SQL性能优化

    比如当一个where子句中的一列有索引时去走索引。 COST (基于成本) 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. CHOOSE (选择性) 如果table已经被analyze过, 优化器...

    bpc类图1

    【BPC 类图1】是描述了一个面向对象的软件系统中的类和它们之间的关系,主要涉及到以下几个关键类:CProcessMgr、CMsgThread、CLinkThread 和 CBpcRun,以及辅助类如 CBF_SimpleLog、CBF_BufferPool 和 CHostInfo。...

    MySQL压力测试报告模版

    文档给出了一个具体的测试案例,即当InnoDB Buffer Pool设置为24GB,CPU核心数为8时的测试情况。测试中使用了`select.lua`脚本来执行简单的`SELECT`查询,以评估不同并发数量下的性能差异。 - **命令示例**: ```...

    MySQL全局共享内存介绍

    前言 全局共享内存则主要是 MySQL Instance(mysqld进程)以及底层存储引擎用来暂...下面针对 MySQL 主要的共享内存进行一个简单的分析。 查询缓存(Query Cache) 查询缓存是 MySQL 比较独特的一个缓存区域,用来缓存

Global site tag (gtag.js) - Google Analytics