更新日期:2024年09月11日
使用预处理快速插入数据
#include
#include
#include
#include "gbase.h"
#define NUM_INSERT 1000
void main(void)
{
GBASE* gbase=NULL;
GBASE_STMT* stmt;
GBASE_BIND bind[2];
const char* sql_drop_table
= "drop table if exists
g_demo2";
const char* sql_create_table
=
"create
table
g_demo2(id
int,
name varchar(20))";
const char* insert_mode
= "insert into g_demo2(id,
name)values(?, ?)";
int in_id[NUM_INSERT];
char in_name[NUM_INSERT][20];
unsigned int i = 0;
char* host = "192.168.111.96";
char* user = "gbase";
char* passwd = "gbase20110531";
char* db = "test";
int port = 5258;
GBase 8a 程序员手册C API 篇
- 86 -
南大通用数据技术股份有限公司
/*初始化GBASE 结构体*/
if(!(gbase = gbase_init(0)))
{
fprintf(stderr, "不能初始化GBASE 结构体!\n");
exit(1);
}
/*数据库连接*/
if(!gbase_real_connect(gbase, host, user, passwd, db, port,
NULL, 0))
{
fprintf(stderr, "\n%s\n", gbase_error(gbase));
exit(1);
}
gbase->reconnect = 1;
/*在数据库中创建表*/
if(gbase_query(gbase, sql_drop_table))
{
fprintf(stderr, "%s", gbase_error(gbase));
exit(1);
}
if(gbase_query(gbase, sql_create_table))
{
fprintf(stderr, "\n%s\n", gbase_error(gbase));
exit(1);
}
gbase_autocommit(gbase, 0);
/*向数据库表中插入数据*/
for(i=0; i
in_id[i] = i;
sprintf(in_name[i], "name_%d", i);
}
if(!(stmt = gbase_stmt_init(gbase)))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
GBase 8a 程序员手册C API 篇
南大通用数据技术股份有限公司
- 87 -
}
if(gbase_stmt_prepare(stmt, insert_mode,
strlen(insert_mode)))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
}
memset(bind, 0, sizeof(bind));
bind[0].buffer_type = GBASE_TYPE_LONG;
bind[1].buffer_type = GBASE_TYPE_STRING;
printf("开始插入%d 条数据\n", NUM_INSERT);
for(i=0; i
bind[0].buffer = (void*)∈_id[i];
bind[1].buffer = (void*)in_name[i];
bind[1].buffer_length = strlen(in_name[i]);
if(gbase_stmt_bind_param(stmt, bind))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
}
if(gbase_stmt_execute(stmt))
{
fprintf(stderr, "\n%s\n", gbase_stmt_error(stmt));
exit(1);
}
}
gbase_commit(gbase);
/*关闭STMT 语句句柄*/
if(gbase_stmt_close(stmt))
{
fprintf(stderr, "%s\n", gbase_stmt_error(stmt));
GBase 8a 程序员手册C API 篇
- 88 -
南大通用数据技术股份有限公司
exit(1);
}
/*释放数据库连接句柄*/
gbase_close(gbase);
}
简单大对象数据(TEXT 和 BYTE 数据类型)可能太多,无法包含在逻辑日志记录中。
如果始终记录简单大对象,它们可能会非常大,以致减缓了逻辑日志。
数据库服务器假设您将数据库设计为较小简单大对象存储在数据库空间中而较大简单大对
象存储在 BLOB 空间中:
•
对于存储在数据库空间中的简单大对象,数据库服务器将简单大对象数据包含在
日志记录中。
•
对于存储在 BLOB 空间中的简单大对象,数据库服务器不会将简单大对象数据包
含在日志记录中。仅当您备份逻辑日志时,逻辑日志才记录 BLOB 空间数据。
为了那些对 BLOB 空间中简单大对象执行频繁更新的应用程序能获取更好的整体性能,
可减少逻辑日志的大小。较小日志可改进对必须重新使用的简单大对象的访问。
切换日志文件以激活 BLOB 空间
您必须在以下情况中切换到下一个逻辑日志文件:
•
在创建 BLOB 空间后,如果您想要立即将简单大对象插入 BLOB 空间
•
向现有 BLOB 空间添加新块后,如果您要将简单大对象插入到将使用该新块的
BLOB 空间
数据库服务器需要在不同的逻辑日志文件中创建用于创建 BLOB 空间的语句、在 BLOB
空间中创建块的语句,以及将简单大对象插入该 BLOB 空间的语句。此需求与数据库日
志记录状态无关。
有关切换到下一个日志文件的指示信息,请参阅切换到下一个逻辑日志文件。
备份日志文件以释放 BLOB 页
在删除存储在 BLOB 空间页中的数据时,不必为重新使用而释放那些页。仅当以下两个
操作均已发生时,BLOB 空间页是可用的:
•
通过对列的更新或通过删除行而删除了 TEXT 或 BYTE 数据
•
备份了存储行(包含 TEXT 或 BYTE 数据)中插入的逻辑日志
插入或删除 TEXT 和 BYTE 数据之前备份 BLOB 空间
GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 286 -
请确保备份所有包含有关 BLOB 空间中所存储简单大对象的事务的 BLOB 空间和逻辑
日志。在日志备份期间,数据库服务器在逻辑日志中使用数据指针将更改过的 text 和
byte 数据从 BLOB 空间复制到逻辑日志中。