TimesTen 应用层数据库缓存学习:18. 利用TimesTen实现Sharding或数据分区

本文主要是介绍TimesTen 应用层数据库缓存学习:18. 利用TimesTen实现Sharding或数据分区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

考虑到恢复和磁盘加载到内存的速度,单个TimesTen数据库可以缓存的数据一般不超过100G,如果需要缓存的数据较大,一般可以利用多个TimesTen来实现数据分区或分片(Sharding)。
虽然TimesTen有Cache Grid即Global Cache Group的概念,但由于其还不太成熟,一般采用手工分区的方式,即通过应用服务器定向到指定的TimesTen的方式。

以下给出了只读和读写数据分区的例子。

另外强调一点,TimesTen没有Oracle Partition的概念。

TimesTen can cache Oracle Database partitioned tables at the table level, but individual partitions cannot be cached. The following describes how operations on partitioned tables affect cache groups:
DDL operations on a table that has partitions do not affect the cache group unless there is data loss. For example, if a partition with data is truncated, an AUTOREFRESH operation does not delete the data from the corresponding cached table.
WHERE clauses in any cache group operations cannot reference individual partitions or subpartitions. Any attempt to define a single partition of a table returns an error.

只读分区

利用只读分区可以指定where条件的便利,可以在不同的TimesTen中建立带where条件的cache group,来缓存Oracle数据库不同部分的数据。
以下的例子虽然Oracle中的表具有分区,但只是示例而已,即使没有分区结果也是一样的。

在Oracle中建表,分为东西南北四个区

create table datapart
( region varchar2(1),
id int,
city varchar2(20),
primary key(id)
)
partition by list(region)
( 
partition part_1 values ( 'N' ),
partition part_2 values ( 'S' ),
partition part_3 values ( 'W' ),
partition part_4 values ( 'E' )
);insert into datapart values ('N', 1, 'Beijing');
insert into datapart values ('S', 2, 'Guangzhou');
insert into datapart values ('E', 3, 'Shanghai');
insert into datapart values ('W', 4, 'Chengdu');SQL> select * from datapart partition(part_2);R         ID CITY
- ---------- --------------------
S          2 Guangzhougrant select, delete, update, insert on datapart to cacheadm;

分别在两个TimesTen数据库cachedb1和cachedb2中建立Cache Group,缓存北区和南区的数据

cachedb1>
CREATE READONLY CACHE GROUP "DATAPART1" AUTOREFRESH MODE INCREMENTAL INTERVAL 5 SECONDSSTATE ONFROM"TTHR"."DATAPART" ("REGION" VARCHAR2(1 BYTE) ,"ID"     NUMBER(38)        NOT NULL,"CITY"   VARCHAR2(20 BYTE),PRIMARY KEY("ID"))WHERE (REGION='N')cachedb1> select * from datapart;
< N, Beijing >cachedb2>
CREATE READONLY CACHE GROUP "DATAPART2" AUTOREFRESH MODE INCREMENTAL INTERVAL 5 SECONDSSTATE ONFROM"TTHR"."DATAPART" ("REGION" VARCHAR2(1 BYTE) ,"ID"     NUMBER(38)        NOT NULL,"CITY"   VARCHAR2(20 BYTE),PRIMARY KEY("ID"))WHERE (REGION='S')cachedb2> select * from datapart;
< S, Guangzhou >

在Oracle中插入数据

insert into datapart values ('N', 5, 'Qingdao');
insert into datapart values ('S', 6, 'Haikou');

然后在两个TimesTen中可自动得到新数据

cachedb1> select * from datapart;
< N, 1, Beijing >
< N, 5, Qingdao >cachedb2> select * from datapart;
< S, 2, Guangzhou >
< S, 6, Haikou >

可写分区

可写分区以AWT为例,和只读分区不一样,AWT在建立时不能指定where条件,但是可以在LOAD操作时指定where条件来进行数据分区

在cachedb1中建立Cache Group, LOAD时指定缓存北区的数据:

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP "AWT1" FROM"TTHR"."DATAPART" ("REGION" VARCHAR2(1 BYTE) ,"ID"     NUMBER(38)        NOT NULL,"CITY"   VARCHAR2(20 BYTE),PRIMARY KEY("ID"))cachedb1> call ttrepstart;cachedb1> load cache group awt1 where region = 'N' commit every 256 rows;
cachedb1> select * from datapart;
< N, 1, Beijing >
< N, 5, Qingdao >cachedb1> truncate table datapart;8238: Cannot truncate cache group table DATAPART; please use DROP/REFRESH/UNLOAD CACHE GROUP insteadinsert into datapart values ('N', 7, 'Tianjing');

在cachedb2中建立Cache Group, LOAD时指定缓存南区的数据:

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP "AWT2" FROM"TTHR"."DATAPART" ("REGION" VARCHAR2(1 BYTE) ,"ID"     NUMBER(38)        NOT NULL,"CITY"   VARCHAR2(20 BYTE),PRIMARY KEY("ID"))cachedb2> call ttrepstart;cachedb2> load cache group awt2 where region = 'S' commit every 256 rows;
cachedb2> select * from datapart;
< S, 2, Guangzhou >
< S, 6, Haikou >
cachedb2> insert into datapart values ('S', 8, 'Changsha');

在Oracle中可以看到由各个TimesTen新插入的数据

SQL> select * from datapart order by id; R         ID CITY
- ---------- --------------------
N          1 Beijing
S          2 Guangzhou
E          3 Shanghai
W          4 Chengdu
N          5 Qingdao
S          6 Haikou
N          7 Tianjing
S          8 Changsha8 rows selected.

在Oracle中插入数据,然后各个缓存组通过LOAD/REFRESH操作得到新数据。
注意,对于Explicitly load的缓存组,LOAD和REFRESH的作用是一样的。

SQL>
insert into datapart values ('N', 9, 'Baoding');
insert into datapart values ('S', 10, 'Wuhan');
commit;cachedb1> select * from datapart;
< N, 1, Beijing >
< N, 5, Qingdao >
< N, 7, Tianjing >cachedb1> refresh cache group awt1 where region = 'N' commit every 256 rows;
cachedb1> select * from datapart;
< N, 1, Beijing >
< N, 5, Qingdao >
< N, 7, Tianjing >
< N, 9, Baoding >cachedb2> select * from datapart;
< S, 2, Guangzhou >
< S, 6, Haikou >
< S, 8, Changsha >cachedb2> load cache group awt2 where region = 'S' commit every 256 rows;cachedb2> select * from datapart;
< S, 2, Guangzhou >
< S, 6, Haikou >
< S, 8, Changsha >
< S, 10, Wuhan >

参考

https://community.oracle.com/thread/3594994?start=0&tstart=0

这篇关于TimesTen 应用层数据库缓存学习:18. 利用TimesTen实现Sharding或数据分区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677690

相关文章

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更