自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程安全学习

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

2025-04-16 20:27:06 75

原创 gbase8s odbc学习

【代码】gbase8s odbc学习。

2025-04-10 22:48:34 95

原创 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 670

原创 从微信复制代码的坑

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

2025-03-22 15:01:40 96

原创 gbase8s rss集群通信流程

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

2025-03-10 11:40:01 371

原创 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 697

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

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

2025-03-06 20:39:54 213

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

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

2024-11-13 21:40:45 308

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

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

2024-11-11 22:26:14 534

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

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

2024-11-05 20:34:58 273

原创 shell基础下

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

2024-10-28 16:03:56 637

原创 shell基础中

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

2024-10-28 15:22:40 752

原创 shell 基础上

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

2024-10-26 15:29:33 605

原创 gbase8s权限管理

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

2024-10-24 14:35:30 305

原创 gbase8s用户管理

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

2024-10-15 15:23:20 481

原创 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 455

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

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

2024-10-10 11:43:49 1049

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

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

2024-10-09 13:30:15 130

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

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

2024-10-08 21:41:14 238

原创 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 325

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

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

2024-09-21 22:53:21 509

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

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

2024-09-19 23:47:42 353

原创 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 282

原创 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 695 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 299

原创 druid连接gbase8s数据库报错空指针

原因在获取数据库类型(dbTypeName)时不支持gbase8s数据库,导致获取类型为null,然后在createPhysicalConnection 中构建数据库连接时直接使用dbTypeName.equals做判断,导致此处空指针,异常传递到上层最终报错空指针。1 在com.alibaba.druid.util.JdbcUtils的getDriverClassName方法中加入gbase8s支持。3 在com.alibaba.druid枚举类 DbType 中加入gbase8s支持。

2024-09-09 22:51:37 524

原创 mybatis与gbase8s plsql适配问题二

Caused by: java.sql.SQLException: 不明确的 java.sql.Type,请使用 IfxRegisterOutParameter()。原因为 oracle 中的游标类型为 cursor(-10) gbase8s 中游标类型为IFX_TYPE_CURSOR(2100)在CallableStatementHandler.registerOutputParameters。plsql中out参数为cursor时报错。解决方案,在类型为cursor 单独处理。

2024-09-07 14:08:12 454

原创 mybatis与gbase8s plsql适配问题一

其中在最终调用到gbasedbt.jdbc 下的 getResultSet 方法时,当resultset为空时 会直接throw Exception ,将异常传递给上层,导致最终空指针错误。在使用 mybatis 调用 gbase8s oracle模式下创建的plsql时 ,出现空指针的报错。2 在getResultSet 的上一层 主动 try catch 异常。1 使用<update> 标签去调用plsql。

2024-09-03 15:50:37 553

原创 mybatis 适配gbase8s中批量插入问题

其原因为在使用 foreach 标签做数据插入时,本质是将集合中的数据拼接成一个大sql,如果sql中使用了#{},则超出 32765 报错主机变量不足,oracle 的上限为65535,mysql中 当整体 sql长度超出范围后一样会报错。使用ExecutorType.BATCH 时 只做一次PREPARE,多次 SQ_BIND,并且返回结果也是批量一起返回,而不使用批量插入则每一条数据都需要先PREPARE,SQ_BIND,返回结果。1减少一次传入集合的数量,保证整体sql 绑定变量不超过32765。

2024-08-29 15:32:06 472

原创 hibernate 适配gbase8s 在使用boolean 时报错could not execute query

查看生成的sql发现 将boolean 类型 true 替换成了1 即 where c1=true 解析成了 c1=1。跟踪代码发现在语法解析类SqlGeneratorBase进行了替换动作。具体原因为在hibernate 方言中默认转换规则如下。解决方案,在具体方言实现中重写此方法。

2024-08-21 14:31:38 488

原创 mybatis /mybatis-plus适配gbase8s 问题:报错Unknown object type

在 mybatis /mybatis-plus与 gbase8s数据库适配过程中,出现Unknown object type报错。报错原因为在发生 setParameters时 如果 对象或者属性为null时,产生上述错误。在没有配置JdbctypeForNull时 默认的类型为OTHER类型,导致报错类型不支持。

2024-08-21 10:36:27 411

原创 gbase8s在数据迁移过程中数据膨胀问题

如果启用了 MAX_FILL_DATA_PAGES,服务器将 在最近修改的页面中添加一个新行,其中包含现有行(如果添加) 该行至少留出 10% 的页面空间,以便将来扩展 页面中的所有行。如果未设置 MAX_FILL_DATA_PAGES,则仅当页面上有足够的空间时,服务器才会添加该行以允许新行增长到其最大长度。如果将 MAX_FILL_DATA_PAGES 配置参数设为 1,数据库服务器将可向具有可变长度行的表中每个页面插入更多行。当MAX_FILL_DATA_PAGES=1 时。

2024-08-20 13:52:24 248

原创 gbase8s索引介绍一

B-树B树(B-tree)是一种树状数据结构,是,能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。B-树有如下性质每一个节点最多有 m 个子节点每一个非叶子节点(除根节点)最少有 ⌈m/2⌉ 个子节点,⌈m/2⌉表示向上取整。如果根节点不是叶子节点,那么它至少有两个子节点有 k 个子节点的非叶子节点拥有 k − 1 个键所有的叶子节点都在同一层限制。

2024-08-18 16:39:07 683

原创 mybatis 适配gbase8s数据库返回结果异常

发现此问题为gbase8s 数据库早期版本问题 ,现有版本均已修复。按照现场的使用方式在本地搭建简化环境验证发现确实存才问题。猜测为绑定变量异常,使用纯jdbc 测试发现确实如此。而server 到client 协议为。根据收集到的jdbc 协议发现。

2024-08-18 16:20:56 225

原创 springboot data jpa 适配 gbase8s 报错could not prepare statement

在hibernate 默认的方言中配置为true ,即在空元素时 生成 in () sql语句,改为false 时 生成 in (null) 语法 ,在gbase 数据库中 不支持前者 ,导致 报错 201 语法错误。根据绑定变量的结构发现 selentity.total 为List 集合 ,在集合元素为0 时产生如下异常。在绑定变量为集合的场景下,需要从方言中判断 在集合元素为0 的时候,拼接sql时 时候将空集合替换为null。在适配过程中,发现部分sql报错 201 语法错误。

2024-08-18 15:08:47 423

原创 gbase8s数据库设置开机自启的两种常见方式

数据库用户 gbasedbt。

2024-06-27 15:03:08 433

原创 gbase8s递归

在迁移的过程中要仔细的对比二者结果集差异,包括是否存在递归循环,有时需要稍微调整下,connect by 与 with as 并不是完全等效。在从oracle迁移至gbase8s时 ,oracle 的with as 递归并不支持,可以修改为其他写法,例如。而在gbase8s中只支持第一种。oracle下的递归为。

2024-06-11 20:04:36 553

原创 gbase8s数据库启动异常

根据52a24801 查找看是否有使用此共享内存的残留进程。在实际场景中偶尔会遇到数据库启动异常且后台无任何错误日志。kill 掉之后再次启动,数据库启动成功。排查发现 系统中存在大量的僵尸进程。则对应的key 为52a24801。计算出数据库对应的共享内存段起始。可以猜测数据库启动异常与此有关。启动异常退出,后台无错误日志。

2024-05-25 16:13:21 305 1

原创 hibernate 方言包加载流程

在VersionInsensitiveMapper中内置了常见数据库以及方言映射。2 获取数据库连接信息,如 版本,服务名,方言信息等。4 在使用国产数据库时一般都会单独实现自己的方言。3 加载方言信息,如未配置则走默认内置。

2024-05-22 17:41:38 285 1

原创 gbase8s 浮点数与日期时间存储

DECIMAL(p,s) NUMERIC(p,s) (p +3)/2 个字节(如果小数位是偶数)或 (p + 4)/2 个字节(如果小数位是奇数)向上取整。FLOAT (DOUBLE PRECISION) 8 字节 双精度浮点数 精度为16位。c (未知) 0/1/2 标识整数部分所占字节,为0 时 整数位0,其余则为小数部分。符号位(1)+指数和偏移(2-12)+尾数(13-64)DECIMAL(p,s) 存储与DECIMAL(p)类似。DECIMAL(p) 1 + p/2 个字节向上取整。

2024-05-22 17:19:18 1034 1

空空如也

空空如也

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

TA关注的人

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