一个简单的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);
}
}
分享到:
相关推荐
Buffer Pool是数据库用来缓存磁盘上数据页的一个内存结构,它能够提高数据库操作的效率。但为了保证数据库的可靠性,确保在发生故障时能够恢复数据,数据库还需要将这些操作记录到日志文件中。这部分日志文件记录被...
### 深入理解MVCC与BufferPool缓存机制 #### 一、MVCC多版本并发控制机制 **MVCC**(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库事务处理的重要技术,它允许读取操作和写入操作在不相互...
Buffer Pool是数据库为了提高磁盘I/O性能而设立的一个内存区域,它用于存放数据库中的数据页。当Buffer Pool容量有限,而需要加载的数据页超过其大小时,LRU链表就起到了决定哪些页面应该被替换到磁盘上的作用。然而...
LRU链表在数据库管理系统中,特别是在MySQL的Buffer Pool缓冲池管理中,起到了核心的作用。其基本原理是将最近使用的数据页保留在链表的头部,而最少使用的数据页则位于链表的尾部。当缓冲池满时,系统会通过LRU链表...
buffer pool是MySQL的一个重要组件,用于缓存从磁盘读取的数据页,提高数据库的访问速度。在执行增删改操作时,系统会先尝试在buffer pool中找到相应的缓存页,然后进行更新。如果缓存页不存在,则从磁盘加载数据页...
- **InnoDB Buffer Pool** 是 InnoDB 存储引擎内部的一个缓存机制,主要用于缓存数据页和索引页。其目的是减少磁盘I/O操作,提高数据读取速度。 - **监控 Buffer Pool 的状态**:通过执行 `SHOW GLOBAL STATUS ...
扩展文件在物理磁盘中表现为一个特殊的文件,其性能类似于操作系统的页面文件,但专用于数据库引擎。 启用时需要注意,缓冲池扩展的大小不能小于物理内存或设置的阈值,否则系统会报错。SQL Server为此提供了新的...
- **BufferPool**:缓冲池是SimpleDB中的一个重要组件,用于缓存磁盘上的数据页,以提高数据访问效率。当需要访问数据时,BufferPool会从磁盘加载数据并创建相应的`HeapPage`实例,然后将这个实例存储在缓冲池中。...
它提供了直观的图形界面,使得数据库设计和管理变得简单易行。例如,你可以通过Navicat创建新的数据库,设置表结构,添加字段,定义数据类型,设置索引,甚至执行复杂的SQL查询。此外,Navicat还支持数据可视化,...
在Oracle数据库中,每个Buffer Handle都会关联一个状态对象,用于记录该缓冲区当前的状态,如是否被修改(脏),是否被锁定,或者是否正被其他进程使用等。这种状态信息对于并发控制、事务处理和数据一致性维护起着...
由于NULL值不需要占用存储空间,因此这个列表是一个位图,其中每个位代表一个列,位值为1表示相应列的值为NULL。 3. 然后是数据头,通常占用40个bit位,里面可能包含记录的事务ID(DB_TRX_ID)、回滚指针(DB_ROLL_...
* 缓冲池的个数:每个表空间对应一个缓冲池,缓冲池的个数太多,会增加数据库的负载。 * 缓冲池的_pagesize:缓冲池的_pagesize决定了缓冲池的大小,缓冲池的_pagesize太小,会导致缓冲池的大小太小,缓冲池的_...
MySQL 数据库优化是一个重要的议题,尤其对于处理大量数据和高并发请求的Web应用程序。本文将介绍三个简单但有效的调整策略,旨在显著提升MySQL的性能。 首先,强烈推荐使用InnoDB存储引擎替代MyISAM。InnoDB提供了...
之所以使用方便,是因为完全省去了人工换算表空间容器页大小,页数量换算操作,而且自动处理bufferpool与表空间关系,仅仅是简单回答问题,脚本自动生成脚本。静默模式,很高效的一种批量创建多套db2数据库的解决...
MySQL 5.5 作为 Oracle 接管 MySQL AB 后发布的第一个重要版本,不仅对于 Oracle 自身的 LAMP / WAMP 软件堆栈具有重要意义,而且在功能和性能上也实现了显著的提升。MySQL 5.5 的设计主要面向 Web 应用程序,通过多...
比如当一个where子句中的一列有索引时去走索引。 COST (基于成本) 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. CHOOSE (选择性) 如果table已经被analyze过, 优化器...
【BPC 类图1】是描述了一个面向对象的软件系统中的类和它们之间的关系,主要涉及到以下几个关键类:CProcessMgr、CMsgThread、CLinkThread 和 CBpcRun,以及辅助类如 CBF_SimpleLog、CBF_BufferPool 和 CHostInfo。...
文档给出了一个具体的测试案例,即当InnoDB Buffer Pool设置为24GB,CPU核心数为8时的测试情况。测试中使用了`select.lua`脚本来执行简单的`SELECT`查询,以评估不同并发数量下的性能差异。 - **命令示例**: ```...
前言 全局共享内存则主要是 MySQL Instance(mysqld进程)以及底层存储引擎用来暂...下面针对 MySQL 主要的共享内存进行一个简单的分析。 查询缓存(Query Cache) 查询缓存是 MySQL 比较独特的一个缓存区域,用来缓存