返回首页

gbase数据、南大通用产品文档:GBase8agcluster_use_new_decimal

更新日期:2024年09月11日

功能
这个参数用于设置使用decimal 的方式。
参数取值含义说明

参数= 0:精度为18;

参数= 1:精度为65。
该参数的默认值是1。
表6- 27 参数值范围说明表
默认值
最小值
最大值
1
0
1

JDBC 配置
目前,
GBase 8c 相关的第三方工具都是通过JDBC 进行连接的,
此部分将介绍工具配置

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
53
时的注意事项。
连接参数

【关注】第三方工具通过JDBC 连接GBase 8c 时,JDBC 向GBase 8c 发起连接请求,
会默认添加以下配置参数,详见JDBC 代码ConnectionFactoryImpl 类的实现。
params = {
{ "user", user },
{ "database", database },
{ "client_encoding", "UTF8" },
{ "DateStyle", "ISO" },
{ "extra_float_digits", "3" },
{ "TimeZone", createPostgresTimeZone() },
};
这些参数可能会导致JDBC 客户端的行为与gsql 客户端的行为不一致,例如,Date 数
据显示方式、浮点数精度表示、timezone 显示。
如果实际期望和这些配置不符,建议在java 连接设置代码中显式设定这些参数。

【建议】通过JDBC 连接数据库时,应该保证下面三个时区设置一致:

JDBC 客户端所在主机的时区。

数据库实例所在主机的时区。

数据库实例配置过程中时区。
时区设置相关的操作,请参考《安装指南》中“初始配置> 同步系统时间”章节内容。
fetchsize

【关注】
在应用程序中,
如果需要使用fetchsize,
必须关闭autocommit。
开启autocommit,
会令fetchsize 配置失效。
autocommit

【建议】在JDBC 向GBase 8c 申请连接的代码中,建议显式打开autocommit 开关。如
果基于性能或者其它方面考虑,需要关闭autocommit 时,需要应用程序自己来保证事
务的提交。
例如,
在指定的业务SQL 执行完之后做显式提交,
特别是客户端退出之前务
必保证所有的事务已经提交。
释放连接

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
54

【建议】
推荐使用连接池限制应用程序的连接数。
每执行一条SQL 就连接一次数据库,
是一种不好SQL 的编写习惯。

【建议】在应用程序完成作业任务之后,应当及时断开和GBase 8c 的连接,释放资源。
建议在任务中设置session 超时时间参数。

【建议】使用JDBC 连接池,在将连接释放给连接池前,需要执行以下操作,重置会话
环境。否则,可能会因为历史会话信息导致的对象冲突。
如果在连接中设置了GUC 参数,那么在将连接归还连接池之前,必须使用“SET
SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。
如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。
CopyManager

【建议】在不使用ETL 工具,数据入库实时性要求又比较高的情况下,建议在开发应
用程序时,使用GBase 8c JDBC 驱动的copyManger 接口进行微批导入。

在给定的时间中,虚拟处理器只可运行一个线程。虚拟处理器通过在多个线程之间切换来
并发地为这些线程提供服务。虚拟处理器运行线程直到其中止。当一个线程中止时,虚拟

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 81 -
处理器将切换到下一个已准备好运行的线程。虚拟处理器将继续此过程,并且最后在原始
的线程准备好继续时返回到该线程。有些线程完成了它们的工作,虚拟处理器会启动新线
程来处理新的工作。由于虚拟处理器持续在线程之间切换,它可以使得 CPU 持续处理。
发生处理时的速度使虚拟处理器看上去就像同时在处理多个任务,而实际上也的确如此。
运行多个并发线程需要调度和同步以防一个线程干扰另一个线程的工作。虚拟处理器可以
使用下列结构和方法协调多个线程的并发处理:
• 控制结构
• 上下文切换
• 堆栈
• 队列
• 互斥
这些主题描述虚拟处理器如何使用这些结构和方法。

控制结构
当客户机连接到数据库服务器时,数据库服务器创建会话结构(称为会话控制块)以保存
有关连接和用户的信息。会话在客户机连接到数据库服务器时开始并在连接终止时结束。
接下来,数据库服务器将创建线程结构(该线程结构被称为会话的线程控制块 (TCB)),
并启动主线程(sqlexec)来处理客户机请求。当线程中止,即当它暂停并允许另一个线程
运行时,虚拟处理器将保存有关线程控制块中线程状态的信息。此信息包括系统注册的进
程内容、程序计数器(下一个要执行的指令的地址)以及堆栈指针。此信息组成线程的内
容。
在大多数情况下,数据库服务器将在每个会话中运行一个主线程。然而,在它执行并行处
理的情况下,它将为单台客户机创建多个会话线程以及多个相应的线程控制块。

上下文切换
通过上下文切换,虚拟处理器将从运行一个线程切换到运行另一个线程。当固定的时间量
(时间片)期满时,数据库服务器不会像操作系统对进程那样预占一个正在运行的线程。
而是,线程会在下列点中的一个点上让步:

代码中预先确定的点

当线程在满足某个条件前不再可以执行时
当完成任务所需的处理量会引起其他线程等待一段长度过长的时间时,线程在预先确定的
点中止。用于这些长时间运行的任务的代码包括处理中的策略点上对让步函数的调用。当
线程执行这些任务之一时,它会在遇到让步函数调用时让步。然后,就绪队列中的其他线
程将有机会运行。当下一次轮到原来的线程时,该线程将在对让步函数进行调用后立即重
新在点上执行代码。对中止函数的预先确定的调用将允许数据库服务器在对性能最有利的
点上中断线程。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 82 -
当线程无法再继续它的任务时,它也会中止直到出现某种条件。例如,当线程等待磁盘
I/O 完成时、当等待来自客户机的数据时或当等待一个锁定或其他资源时,线程中止。
当一个线程中止时,虚拟处理器在线程控制块中保存其上下文。 然后,虚拟处理器将从
一队就绪的线程中选择要运行的新线程、从该新线程的线程控制块中装入该新线程的上下
文,然后在程序计数器中的新地址处开始执行。下图说明了虚拟处理器如何完成上下文切
换。
图: 上下文切换:虚拟处理器如何从一个线程切换到另一个线程



堆栈
数据库服务器将在共享内存的虚拟部分中分配一个区域以便为线程所执行的函数存储非共
享数据。此区域称为堆栈。有关如何设置堆栈大小的信息,请参阅堆栈。
堆栈使虚拟处理器能够保护线程中非共享数据免遭并发执行相同代码的其他线程的覆盖。
例如,如果几台客户机应用程序并发地执行 SELECT 语句,那么每台客户机的会话线程
将在代码中执行许多同样的函数。如果线程没有专用堆栈,那么一个线程可能会覆盖属于
函数中另一个线程的本地数据。
当虚拟处理器切换到新的线程时,它会为该线程从线程控制块中装入堆栈指针。堆栈指针
将存储堆栈的开始地址。 然后,虚拟处理器可以将偏移量指定到在堆栈中存取数据的开
始地址。该图说明了虚拟处理器如何使用堆栈来为会话线程分离非共享数据。
图: 虚拟处理器为每个用户分离非共享数据


GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 83 -


队列
数据库服务器使用三种类型的队列来调度多个并发运行的线程的处理。
相同类的虚拟处理器将共享队列。有些时候,这将使线程能够在需要时从类中的一个虚拟
处理器迁移到另一个虚拟处理器。

就绪队列
就绪队列将在当前的(正在运行的)线程中止时容纳已准备好运行的线程。 当一个线程
让步时,虚拟处理器将从就绪队列中选取下一个具有适当优先级的线程。在该队列中,虚
拟处理器处理在先进先出 (FIFO) 基础上具有相同优先级的线程。
在多处理器计算机上,如果您注意到线程正在一类的虚拟处理器的就绪队列中堆积(表示
工作堆积的速度比虚拟处理器可以处理它的速度块),那么您可以启动该类的附加虚拟处
理器以分发处理负载。有关如何监视就绪队列的信息,请参阅监视虚拟处理器。有关如何
在数据库服务器处于联机方式时添加虚拟处理器的信息,请参阅在联机方式下添加虚拟处
理器。

睡眠队列
睡眠队列将容纳特定的时间中没有工作要做的线程的上下文。使线程在指定的时间段或永
久睡眠。
虚拟处理器的管理类 (ADM) 运行系统计时器和特殊的实用程序线程。此类中的虚拟处理
器将自动创建并运行。没有配置参数会影响此类虚拟处理器。
ADM 虚拟处理器唤醒已休眠了指定时间段的线程。运行在 ADM 虚拟处理器中的线程以
一秒为时间间隔来检查正在休眠的线程。 如果休眠的线程已休眠了指定时间段,那么
ADM 虚拟处理器将其移动到适当的就绪队列。正在睡眠指定时间段的线程也可以显式地
由另一个线程唤醒。
永久睡眠的线程会在其有更多的工作要做时被唤醒。例如,当 CPU 虚拟处理器上运行的
线程必须访问磁盘时,该线程会发出 I/O 请求,将其自身置于 CPU 虚拟处理器的休眠队

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 84 -
列中,然后停止。当 I/O 线程通知 CPU 虚拟处理器 I/O 已经完成时,CPU 虚拟处理器
调度原来的线程通过将该线程从休眠队列移动到就绪队列来继续处理。下图说明了数据库
服务器线程如何排队执行数据库 I/O。
图: 数据库服务器线程如何排队执行数据库 I/O



等待队列
等待队列保存了必须等待特定事件才能继续运行的线程。例如,等待队列将协调线程对共
享数据的访问。当用户线程尝试获取逻辑日志锁存器但发现锁存器由另一个用户所持有
时,遭拒绝的线程会将其自身放在逻辑日志等待队列中。当拥有锁的线程准备好释放锁存
器时,它会检查等待的线程,如果线程正在等待,它将唤醒等待队列中的下一个线程。

互斥
互斥(互相排斥),又称为锁存器,是数据库服务器用于同步多个线程对共享资源的访问
的一种锁存机制。互斥与信号相似,一些操作系统使用后者来控制多个进程对共享数据的
访问。然而,互斥比信号允许更高的并行度。
互斥是与共享资源(如缓冲区)关联的变量。线程必须在可以访问资源前获取资源的互
斥。其他线程将不能访问该资源直到所有者将其释放。在互斥可用后,线程通过将其状态
设置为使用状态而获得互斥。互斥的同步确保一次只有一个线程写入共享内存的区域。
有关监视互斥的信息,请参阅监视共享内存概要文件和锁存器。