自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 gbase8s sql优化之星型连接

学生其他属性...][学生住址表] -- [学生表(事实表)] -- [分数表]星型连接 主要为 一个事实表与多个维度表的join 连接。2.2 查询中的所有表必须至少具有低级别统计信息。以学生表为中心,像四周发射,就像星星一样。2 gbase8s星型连接的前置条件。2.3 只能有一张事实表。2.1 必须开启PDQ。

2025-07-03 19:30:39 106

原创 oracle 游标学习

【代码】oracle 游标学习。

2025-07-03 16:36:34 80

原创 oracle集合三嵌套表(Nested Table)学习

NESTED_TABLE_ID实际上是与主表的行标识符(ROWID)相关联,虽然基于行标识的概念,但不是直接存储主表的物理ROWID。嵌套表(Nested Table)是Oracle中的一种集合数据类型,它允许在表中存储多值属性,类似于在表中嵌套另一个表。嵌套表存储表会自动创建一个系统生成的NESTED_TABLE_ID列,用于与主表关联。-- 查看嵌套表存储表的结构(不显示NESTED_TABLE_ID列)-- 创建一个嵌套表类型,基于address_type。-- 在嵌套表存储表上创建索引。

2025-07-02 16:21:56 353

原创 oracle 集合二 可变数组(VARRAY)学习

传统数组内存一定是连续的,可变数组也是如此,因可变数组并不分配所有内存,如果发生在连续的内存不足以满足扩容请求则发生数组复制,即寻找一块可以容纳的连续空间进行复制。可变数组初始化也需要指定长度,但并不会分配所有内存,而是先预分配部分,后边自动扩容,直到达到定义大小上限。传统数组初始化时需要指定长度,即使脏内存未被清理,此时该内存也已经可以使用,也就是说初始化即分配内存。能在PL/SQL外定义使用,也可在PL/SQL内定义使用,也可在PL/SQL内使用外部定义的数组。在PLSQL外定义,在PLSQL内使用。

2025-06-29 17:55:16 304

原创 oracle集合一 关联数组(索引表)学习

PRIOR key := arr.PRIOR(current_key) 返回小于指定键的上一个键。删除单个元素 arr.DELETE(key) 移除指定键的元素 O(1)NEXT key := arr.NEXT(current_key) 返回大于指定键的下一个键。TO_CHAR TO_CHAR(arr(key)) 元素值转为字符串。

2025-06-27 18:49:52 403

原创 gbase8s自定义数据类型

gbase8s 要求必须实现 创建转换等组函数,其中还需要实现流支持函数以及存储支持函数,部分函数反编译出来看不太明白,舍弃了。2 未知数据类型 比如 现在想实现一个 描述 正方体体积的数据类型 volume(长,宽,高)1 如果为已知数据类型,可使用 distinct type。2.3 创建数据类型。2.4 创建相关函数。

2025-06-24 17:45:25 189

原创 gbase8s数据库获取jdbc/odbc协议的几种方式

解析二进制协议的命令为sqliprint 该命令位置为 gbase8s数据库 csdk 安装路径/bin 下。jdbc参数,密文协议,需使用解密工具解析,解析后每个sid对应一个文件。需要使用gbase8s协议解析器进行解析,例如 gbase_8s.lua。jdbc 参数 ,明文协议,并发时 会错乱,适合单线程调试。密文协议,需使用解密工具解析,解析后每个sid对应一个文件。密文协议,需使用解密工具解析,解析后每个sid对应一个文件。wireshark 或者类似工具。日志文件路径为数据库安装路径下。

2025-06-11 13:35:21 513

原创 gbase8s jdbc协议简单描述

【代码】gbase8s jdbc协议简单描述。

2025-06-10 10:44:17 107

原创 mybatis学习

在创建 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler 时会使用 Plugin.wrap() 方法为这些对象创建代理。这些对象被创建时,会通过 InterceptorChain.pluginAll() 方法将所有配置的拦截器应用到目标对象上,形成代理链。在xml中注册拦截器后,在XMLConfigBuilder中的 pluginElement()组件会解析拦截器并反射创建实例。

2025-06-06 13:27:31 178

原创 gbase8s数据库+mybatis问题记录

最后判断statement.isClosed()时,会直接调用jdbc底层的isClosed()函数,查看文档发现,该函数为jdk1.6引入,当时gbase jdbc并未实现该函数,导致判断异常,从而无法释放statement对象资源,在大量的循环中易发生内存泄漏。在实际使用中一般都是mybatis+数据库连接池组合使用,单独使用mybatis 连接数据库时,在循环使用PreparedStatement 时 会发生内存泄漏,PreparedStatement资源得不到释放。

2025-05-30 17:11:14 282

原创 gbase8s统计更新(UPDATE STATISTICS)介绍

比如 p1 中引用了 t1.c1列 ,当发生 alter table t1 modify 时 ,p1可能会存在错误风险,此时统计更新后会生成新的执行计划,新计划中包含了 直接或间接引用的对象变化后的信息。medium 默认的 bin 的采样的行的 percent 为 2.5 这个值将每一列的值的范围分成大约40 个间隔。high 默认的 bin 的采样的行的 percent 为 0.5 这个值将每一列的值的范围分成大约 200 个间隔。优化器确定执行sql的最有效策略,使用系统表的信息来确定最佳查询策略。

2025-05-27 17:00:00 381

原创 gbase8s数据库IFX_CODESETLOB,LOBCACHE参数说明

以下测试为两个参数的触发场景,在不同的驱动版本中,可能会有不同的优化,以下测试版本为 jdbc_3.3.0_*版本。在 gbase8s官方文档描述中,IFX_CODESETLOB、LOBCACHE参数在发生字符集转换时生效,参数单位为字节,即规定了转换过程是在内存还是在临时文件的阈值。而在text类型时 IFX_CODESETLOB 不配置 则默认不开启,当配置时 会按照配置大小决定是在内存还是再临时文件。byte getBinaryStream IFX_CODESETLOB LOBCACHE 生效。

2025-05-18 13:01:51 205

原创 gbase8s数据库 tcp连接不同阶段的超时处理

在配置后,使用操作系统 net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes 参数进行tcp keepalive 检测。数据库端无需配置,会按照上述三个参数进行连接检测,若net.ipv4.tcp_keepalive_time 为0 则默认30s。LOGINTIMEOUT 参数生效,该参数为socket超时参数,单位毫秒。IFX_SOC_TIMEOUT 参数生效 单位 毫秒。

2025-05-07 16:20:50 174

原创 gbase8s存储学习一 rootdbs存储结构以及寻址分析

该空闲链表页的数量可能因数据块内部的碎片化程度而有所不同(可能存在多个这样的页),它包含指向未使用区段(extents)的结构体。先找到表空间的TBLspace 根据extent 以及 table 的partnum 信息找到 表的TBLspace,再根据rowid/ifx_fow_id定为到数据所在page 以及slot。系统中的每个表空间都有一个特殊页来描述,这种特殊类型的页称作分区页(TBLspace )。该表空间为数据库的根空间,主要存储数据库的一些系统元数据(系统表),以及数据库的保留页。

2025-04-23 23:36:21 1060

原创 gbase8s触发器使用

相比oracle 在for each row 触发时 是没有 before 或者after 修饰,也就是说在gbase8s中for each row没有触发前后的说法,仍然可以通过一些用例简单测试下触发时机。在实际使用中可同时存在before、after、以及for each row 触发器,顺序必须为。before after 因为是语句级触发器,没有 new值 old值的说法。for each row 为行级触发器,即每一行都会触发触发列表的操作。同样,当需要处理逻辑时,仍然需要调用存储过程来实现。

2025-04-22 18:51:45 405

原创 线程安全学习

产生原因也很简单,在现代操作系统下 cpu并不是直接访问内存,每个cpu核心都有一个 独立的L0 L1 缓存,以及共享的L2 缓存,在线程1 将 a 从主存写入缓存时,进行++操作,此时a +1 并未回写至主存, 此时线程2 去主存中读取的值仍然为1, 并且 ++操作也非原子操作,多种可能都会导致结果不符合预期。线程是cpu调度的最小单位,在Linux 下 实现线程的方式为轻量级进程,复用进程的结构体,使用clone函数创建。所谓线程安全,更确切的应该描述为内存安全。

2025-04-16 20:27:06 186

原创 gbase8s odbc学习

【代码】gbase8s odbc学习。

2025-04-10 22:48:34 131

原创 gbase8s cdc协议解析

000000C8 4字节 cdc记录号 代表 具体的操作,存储于cdc 系统库下的syscdcrectypes 表 主要包括插入、删除、修改、事务开始、事务提交、truncate等等。000000C9 4字节 cdc记录号 c9 对应为超时 CDC_REC_TIMEOUT ,即没有新的数据变化。先进行CDC_REC_TABSCHEM 操作,该操作主要返回了一些信息,比如 捕获列的信息,数据类型为变长或者固定长度等。c8对应的操作为CDC_REC_TABSCHEM 描述信息。

2025-03-23 20:30:19 775

原创 从微信复制代码的坑

这个地方应该是中文的空格,因为命令都是使用微信发送的,可能不小心将尾部的空格也复制了,知道原因后处理起来就非常简单了,去掉尾部空格后,一切正常。近期,在协助客户调试odbc 时 所有的配置均已完成,数据库也一切正常,使用 isql 测试连接的时候报错库文件找不到。sqlhosts 文件是gbase数据库的监听配置文件,依赖与GBASEDBTSQLHOSTS环境变量。神奇的是我们查看LD_LIBRARY_PATH 时一切正常。与之前的库文件问题一样,此时终于意识到是环境变量出了问题。在进行连接时仍然报错。

2025-03-22 15:01:40 113

原创 gbase8s rss集群通信流程

如果主服务器发生故障,那么备用服务器可以接管,直到主服务器恢复运行为止。基于逻辑日志的复制技术,需要传输大量的逻辑日志,数据库需启用日志模式。最大允许主节点发送64个log buffers 后返回ack。如下线程主要作用为解析主机发送的逻辑日志然后在备机重做。RSS是一种将数据从主服务器复制到备服务器的方法。实例级别的复制 (所有启用日志记录功能的数据库)RSS 节点不能提升为主节点,只能提升为标准节点。RSS 节点不能提升为HDR备节点。DRAUTO 必须使用CM切换。HDR备节点可降级为RSS节点。

2025-03-10 11:40:01 406

原创 gbase8s hdr(hac)集群通信流程

xtrace 是用来追踪在线运行ids的工具,这个工具可以打印代码中已经插针的日志,使用时会先初始化一个环形队列,将用来记录日志信息。1 向备机发送DR_MSG_PING 消息,每隔DR_TIMEOUT s 一次(有的版本固定1s)检查是否收到 主节点 每隔DR_TIMEOUT s 的DR_MSG_PING 消息。主要函数 smx_send_from_recv_thread()主要函数 dr_idx_send_thread()主要函数 dr_idx_recv_thread()

2025-03-08 16:47:18 736

原创 gbase8s数据库检测非法字符

在实际项目中,数据库有可能会出现非法字符,其原因有多种,如下提供一种非法字符的检测方法,仅供参考。

2025-03-06 20:39:54 244

原创 gbase8s数据库常见的连接算法

外表指针指向第一条数据,内表指针顺序移动,找到和外表匹配项,记录,内表循环结束后外边指针继续向下移动,一直到外表循环结束为止。hash 连接中只有极少量的随机读,大部分都为顺序读,极大缓解了大量随机读的压力。有则取捅中进行匹配(若捅中有多条数据则发生hash碰撞),没有则继续匹配下一。hash 连接避免了嵌套循环的大量的随机读,简单伪代码如下。在gbase8s 中 ,常见的连接算法主要分为如下几种。细分可分为索引嵌套循环,块嵌套循环,半嵌套循环等。嵌套循环的缺点,在大量数据下会发生大量的随机读。

2024-11-13 21:40:45 337

原创 gbase8s数据库获取随机数方法

/ 取低31位作为结果,避免符号位影响。在早期的数据库版本中,没有获取随机数的函数,为此,提供如下几种方式,仅供测试参考,具体使用请联系gbase8s官方技术支持。--将结果映射到[0,100]区间。--简单的线性同余生成器(LCG)的变种。--XORSHIFT算法。

2024-11-11 22:26:14 613

原创 字符类型模糊查询优化案例一

在实际开中中经常会遇到 like '%a' 运算,一般在数据库中此种写法不能使用索引优化查询,本示例提供一个简单的优化思路。由此,c1 like '%a' 可以转化为 c2 like 'a%'可以在改该表结构的基础上增加一个新的字段,该字段为目标字段的。这里借鉴 oracle 的反向索引的设计理念。使用触发器等方式实现目标字段的。

2024-11-05 20:34:58 283

原创 shell基础下

Linux 利用信号与系统中的进程进行通信。kill -l 列出信号列表在默认情况下,bash shell 会忽略收到的任何 SIGQUIT(3)信号和 SIGTERM(15)信号。会处理收到的所有 SIGHUP(1)信号和SIGINT(2)信号。

2024-10-28 16:03:56 659

原创 shell基础中

向 shell 脚本传递数据的最基本方法是使用命令行参数。命令行参数允许运行脚本时在命令行中添加数据:将文本字符串作为参数传递时,引号并不是数据的一部分,仅用于表明数据的起止位置。

2024-10-28 15:22:40 788

原创 shell 基础上

常见的shell 主要分为以下几种bash ,dash,csh,tcsh,zsh等。

2024-10-26 15:29:33 622

原创 gbase8s权限管理

举个例子 ,数据库下创建一张表 t1,使用dba 对 user01 用户授予对t1表的查询权限,由于user01拥有public用户的权限,所以 也可以去insert t1 update t1。此种方式有个问题为回收权限只能回收已经存在的表权限,新建的表仍然会有public 用户的权限,所以需要定时去刷一下权限。回收public 用户权限之后,用户的权限来源就只剩下 dba用户授予的权限。其中常用的为 数据库级权限,表级权限,序列级权限以及例程级权限。使用此环境变量创建的表没有public 用户权限。

2024-10-24 14:35:30 367

原创 gbase8s用户管理

第二种方式每创建一个用户都必须映射到代理用户上,而第三种以模版用户为基础,因为模版用户指定了代理用户,所以每次创建内部用户时无需指定代理用户,此时的create user的语法更有普遍性。3 操作用户作为内部用户的代理用户,根据代理用户创建模版用户,以模版用户作为基础创建内部用户。如果不创建模版用户直接创建内部用户,并且不映射到代理用户时,服务器将返回错误。2.5 创建内部用户(将user02映射到user_agent用户上)2 操作用户作为内部用户的代理用户,根据代理用户直接创建内部用户。

2024-10-15 15:23:20 509

原创 gbase8s 锁监控与解锁

t1表上有意向独占锁,rowid为0 代表为表锁,type IX 为意向独占锁 owner 44 表示session id 为44。t1表中有行锁,rowid 268代表被锁的行 type X 为独占锁 owner 44 表示session id 为44。信息可知 tblsnum 为 600617 的表上存在意向独占锁 行上有独占锁,并且行操作为 delete (D)rowid 为 10c 十进制为268 与 sql查看的结果一致。该事务未提交,此时会在表上和行上分别有意向独占锁与独占锁。

2024-10-10 16:27:16 539

原创 gbase8s的事务、并发控制、锁机制、隔离级别

这种隔离级别能确保所有的记录都是提交到数据库的,因而能避免读取到脏数据,能确保所有读取到的记录都是已提交的,当一个进程读完记录后,其它进程就可以修改。不仅可以看到提交的记录,也可以保证看到的记录不会被更新,其它进程不能更新或删除你锁看到的记录,当移动到下一行时,锁才会释放,记录就可以进行修改。:多个用户可以读取相同的记录,如果一个对象上没有排他锁,则共享锁可以加在该对象上,它可以防止其他事务更新数据,但同时,其他事务可以读取该数据,多个事务可以在同一个对象上加多个共享锁。表需要设置为行级锁,不能是页级锁。

2024-10-10 11:43:49 1125

原创 gbase8s数据库XADATASOURCE/两阶段提交简单案例

【代码】gbase8s数据库XADATASOURCE/两阶段提交简单案例。

2024-10-09 13:30:15 146

原创 gbase8s数据库基于标签访问控制简单案例

ARRAY 标签组件的特点为权限从左到右一次降低,即使用权限高的标签可以访问低权限标签的资源。在使用 root 或者test 用户是可以访问c2列,其他用户则报错。更多关于标签访问控制请参考gbase8s语法手册。6 创建测试表,对 c2列 添加标签。1 授予DBSECADM权限。2 创建安全标签组件。信息存储于如下系统表。信息存储于如下系统表。信息存储于如下系统表。

2024-10-08 21:41:14 265

原创 gbase8s数据库实现黑白名单的几种方案

实际效果为 162 与163 机器的 root 用户可以连接数据库,其他ip 或者非root用户不能连接,从 root切换成 wangyx用户时不需要输入密码。1)在部分环境中由于DNS反向解析策略很有可能将实际IP解析成bogon,需要额外关注下。2)若 sysdbopen 未知异常会导致数据库无法连接,最简单的处理方案为。2、使用数据库 TRUSTED CONTEXT 机制。更多语法以及配置细节可参考gbase8s语法手册。4 某些高版本中支持在参数中直接配置黑白名单。3 利用数据库现有机制实现。

2024-10-08 21:32:03 348

原创 gbase8s数据库常见的索引扫描方式

5 自动索引扫描(Auto-index scan):自动索引扫描特性允许数据库服务器在一个或多个字段上自动创建临时索引,数据库服务器通过这个临时索引读取相应的数据。6 多路径扫描 (skip-scan):当数据表上有多个查询字段时,优化器有可能会选择多路径扫描,即同时扫描多字段上的索引 在对所有扫描命中的rowID 取交集。3 键值扫描(Key-only index scan):如果读取的相关数据包含在索引节点中,数据库服务器就只需读取索引,不需要再去读取相应的数据页。多路径扫描 常发生在多个查询条件时。

2024-09-21 22:53:21 531

原创 gbase8s存储过程一些隐藏的错误写法

当游标处于最后一条记录时满足 sqlcode!=100 ,然后还会再次进入 while 循环中 ,导致最后一条数据会重复一次,因为是先return 再退出循环,所以需要在 return 前就退出循环。比如应该返回 1,2,3,4,5 实际返回 1,2,3,4,5,5。在某项目现场使用存储过程返回结果集时最后一条数据会重复一次。问题出现在while 循环中。

2024-09-19 23:47:42 396

原创 gbase8s早期版本CLOB 等值比较问题

但是在进行等值查询时 select * from zz where clob_to_str(c1) = 'aaaaaaa';具体逻辑为 先获取到 CLOB类型的数据长度 ,再将 CLOB类型转换为 varchar。近期在某现场使用早期的gbase8s项目中遇到了 需要等值比较clob 的问题。为满足对于LOB类型数据的操作,gbase8s提供了 多组处理LOB类型的函数。直接查询 clob_to_str(c1) 时 又显示 'aaaaaaa'一 使用 gbase8s提供的擦除函数将末尾回车擦除。

2024-09-19 23:30:44 297

原创 spring-session-jdbc 适配gbase8s

其中 this.createSessionAttributeQuery 是异常的sql,那么这个类是在什么时候被初始化的饿呢,观察发现此类为 spring bean 管理。只是一个简单的insert语句,后使用jdbc 验证 ,当绑定变量 包含 blob 类型是需要做一个显示的类转换才可以,此为早期数据库版本问题,后期均已处理。近期,在某现场使用spring-session-jdbc 2.3.1 RELEASE版本时出现数据转换错误(Data conversion error)as blob)即可。

2024-09-12 13:29:41 738 1

原创 gbase8s 集群互信配置方式

4 REMOTE_USERS_CFG参数,其对应为/home/gbasedbt/.rhosts,格式与其一致。3 REMOTE_SERVER_CFG参数,其对应为 /etc/hosts.equiv,格式与其一致。文件必须存在为数据库安装路径/etc下 一般为 gbasedbt:gbasedbt 0660。文件必须存在为数据库安装路径/etc下 一般为 gbasedbt:gbasedbt 0660。gbase01,02 为 hosts中映射的主机名。或者 + gbasedbt。

2024-09-10 15:29:12 325

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除