@@ -54,7 +54,6 @@ find_path (LIBPQ_INCLUDE_DIRS NAMES libpq-fe.h HINTS /usr/include/postgresql NO_
5454
5555### 写入普通表
5656``` c
57- holo_client_logger_open ();
5857char * connInfo = " host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx" ;
5958HoloConfig config = holo_client_new_config(connInfo);
6059
@@ -76,13 +75,11 @@ holo_client_submit(client, mutation);
7675holo_client_flush_client(client);
7776
7877holo_client_close_client(client);
79- holo_client_logger_close();
8078```
8179
8280### 写入分区表
8381若分区已存在,不论dynamicPartition为何值,写入数据都将插入到正确的分区表中;若分区不存在,dynamicPartition设置为true时,将会自动创建不存在的分区,否则插入失败
8482```c
85- holo_client_logger_open();
8683char* connInfo = "host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx";
8784HoloConfig config = holo_client_new_config(connInfo);
8885config.dynamicPartition = true;
@@ -105,12 +102,10 @@ holo_client_submit(client, mutation);
105102holo_client_flush_client(client);
106103
107104holo_client_close_client(client);
108- holo_client_logger_close();
109105```
110106
111107### 写入含主键表
112108``` c
113- holo_client_logger_open ();
114109char * connInfo = " host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx" ;
115110HoloConfig config = holo_client_new_config(connInfo);
116111config.writeMode = INSERT_OR_UPDATE;// 配置主键冲突时策略
@@ -133,11 +128,9 @@ holo_client_submit(client, mutation);
133128holo_client_flush_client(client);
134129
135130holo_client_close_client(client);
136- holo_client_logger_close();
137131```
138132### 根据主键删除
139133```c
140- holo_client_logger_open();
141134char* connInfo = "host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx";
142135HoloConfig config = holo_client_new_config(connInfo);
143136
@@ -157,12 +150,10 @@ holo_client_submit(client, mutation);
157150holo_client_flush_client(client);
158151
159152holo_client_close_client(client);
160- holo_client_logger_close();
161153```
162154
163155### 写入失败的处理
164156``` c
165- holo_client_logger_open ();
166157char * connInfo = " host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx" ;
167158HoloConfig config = holo_client_new_config(connInfo);
168159config.exceptionHandler = handle_failed_record; // 每条插入失败的record都会调用这个函数
@@ -180,12 +171,38 @@ holo_client_submit(client, mutation);
180171holo_client_flush_client(client);
181172
182173holo_client_close_client(client);
183- holo_client_logger_close();
174+ ```
175+
176+ v1.3.7之后的版本,增加了 holo_client_flush_client_with_errmsg(HoloClient*, char**) 接口,可以获取一次flush中引擎返回的第一个报错的message
177+ ```c
178+ char* connInfo = "host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx";
179+ HoloConfig config = holo_client_new_config(connInfo);
180+ HoloClient* client = holo_client_new_client(config);
181+
182+ HoloTableSchema* schema = holo_client_get_tableschema(client, "schema_name", "table_name", true);
183+ HoloMutation mutation = holo_client_new_mutation_request(schema);
184+ holo_client_set_req_int32_val_by_colindex(mutation, 0, 0);
185+ holo_client_submit(client, mutation);
186+
187+ mutation = holo_client_new_mutation_request(schema);
188+ holo_client_set_req_int32_val_by_colindex(mutation, 0, 1);
189+ holo_client_submit(client, mutation);
190+
191+ char* errMsg = NULL;
192+ int ret = holo_client_flush_client_with_errmsg(client, &errMsg); //传入参数为errMsg的地址,即char**
193+ if (ret != HOLO_CLIENT_RET_OK) {
194+ printf("holo client flush failed!\n");
195+ if (errMsg != NULL) {
196+ printf("errMsg: %s\n", errMsg); //如果flush后errMsg不为NULL,则返回了flush中引擎返回的第一个报错的message
197+ free(errMsg); //message需要用户手动free,否则会发生内存泄漏
198+ }
199+ }
200+
201+ holo_client_close_client(client);
184202```
185203
186204### 根据主键点查
187205``` c
188- holo_client_logger_open();
189206char * connInfo = " host=xxxx.hologres.aliyuncs.com port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx" ;
190207HoloConfig config = holo_client_new_config(connInfo);
191208
@@ -213,7 +230,6 @@ holo_client_destroy_get_request(get); //得到结果后需要手动释放
213230holo_client_flush_client(client);
214231
215232holo_client_close_client(client);
216- holo_client_logger_close();
217233```
218234
219235## 附录
@@ -222,14 +238,16 @@ holo_client_logger_close();
222238| --- | --- | --- |
223239| connInfo| 无 | 必填, 格式:“host=xxxxxxxxx port=xxx dbname=xxxxx user=xxxxxxxxxx password=xxxxxxxxxx”|
224240| dynamicPartition | false | 若为true,当分区不存在时自动创建分区 |
241+ | unnestMode | false | 若为true,则会采用unnest模式写入,当batchSize不稳定时,不会产生多个PreparedStatement,节省服务端内存,但是会影响写入速度 |
225242| useFixedFe | false | 若为true,写入将交给holo的FixedFE执行,会降低写入时的并发连接数 |
226243| writeMode | INSERT_OR_REPLACE | 当INSERT目标表为有主键的表时采用不同策略<br>INSERT_OR_IGNORE 当主键冲突时,不写入<br>INSERT_OR_UPDATE 当主键冲突时,更新相应列<br>INSERT_OR_REPLACE当主键冲突时,更新所有列|
244+ | autoFlush | true | 是否自动触发批量提交,若为false,当合并后的插入数量达到batchSize,或合并后的插入数据字节数达到writeBatchByteSize,或距离上次提交超过writeMaxIntervalMs时,不会触发批量提交,此时再次插入会报错 |
227245| batchSize | 512 | 每个写入线程的最大批次大小,在经过WriteMode合并后的插入数量达到batchSize时进行一次批量提交 |
228246| threadSize | 1 | 写入并发线程数(每个并发占用1个数据库连接) |
229247| shardCollectorSize | 2 * threadSize | 每个表的缓冲区个数,建议shardCollectorSize大于threadSize |
230248| writeBatchByteSize | 2MB | 每个写入线程的最大批次bytes大小,在经过WriteMode合并后的插入数据字节数达到writeBatchByteSize时进行一次批量提交 |
231249| writeBatchTotalByteSize | writeBatchByteSize * shardCollectorSize | 所有表所有缓冲区所有数据总和最大bytes大小,达到writeBatchTotalByteSize时全部提交 |
232- | writeMaxIntervalMs | 10000 ms | 距离上次提交超过writeMaxIntervalMs会触发一次批量提交 |
250+ | writeMaxIntervalMs | 10000 ms | 距离上次提交超过writeMaxIntervalMs会触发一次批量提交,若小于等于0表示不检查writeMaxIntervalMs |
233251| exceptionHandler | handle_exception_by_doing_nothing | 对于写入失败的数据的处理函数 |
234252| retryCount | 3 | 当连接故障时的重试次数 |
235253| retrySleepInitMs | 1000 ms | 每次重试的等待时间 = retrySleepInitMs + retry * retrySleepStepMs |
@@ -238,15 +256,12 @@ holo_client_logger_close();
238256
239257
240258### LOG说明
241- holo client用的是log库是log4c
242-
243- 在所有跟holo client有关的代码开始前需要调用 holo_client_logger_open();
244- 结束后需要调用 holo_client_logger_close();
259+ holo client默认用的是log库是log4c,用户可以自己实现自己的log函数,并使用holo_client_setup_logger设置log level和自定义log函数(在调用holo_client_new_client之前),参考logger.h。
245260
246261*注意
247-
248- holo_client_logger_open()和holo_client_logger_close()在整个代码里分别只能调用一次,建议在所有和holo client有关的代码的开始前和结束后调用 。
249- 将log4crc文件复制到最终生成的可执行文件的同一文件夹下 。如果要修改log的level和打印到的地点,就修改log4crc
262+ 默认的log4c需要在所有跟holo client有关的代码开始前调用holo_client_logger_open(),结束后调用holo_client_logger_close();
263+ holo_client_logger_open()和holo_client_logger_close()在整个代码里分别只能调用一次。
264+ log4c库需要配置log4crc文件,并将log4crc文件复制到最终生成的可执行文件的同一文件夹下 。如果要修改log的level和打印到的地点,就修改log4crc
250265
251266log4crc example1(打印到stdout):
252267```xml
@@ -383,7 +398,6 @@ import "C"
383398import " unsafe"
384399
385400func main () {
386- C.holo_client_logger_open ()
387401 connInfo := " host=xxxx port=xx dbname=xxx user=xxx password=xxxxx"
388402 cInfo := C.CString (connInfo)
389403 config := C.holo_client_new_config (cInfo)
@@ -409,7 +423,6 @@ func main() {
409423
410424 C.holo_client_flush_client (client)
411425 C.holo_client_close_client (client)
412- C.holo_client_logger_close ()
413426 C.free (unsafe.Pointer (cInfo))
414427 C.free (unsafe.Pointer (cTableName))
415428}
@@ -436,7 +449,6 @@ import (
436449)
437450
438451func main () {
439- C.holo_client_logger_open ()
440452 connInfo := " host=xxxxx port=xxx dbname=xxxxx user=xxxxx password=xxxxx"
441453 cInfo := C.CString (connInfo)
442454 config := C.holo_client_new_config (cInfo)
@@ -465,7 +477,6 @@ func main() {
465477 }
466478 C.holo_client_flush_client (client)
467479 C.holo_client_close_client (client)
468- C.holo_client_logger_close ()
469480 C.free (unsafe.Pointer (cInfo))
470481 C.free (unsafe.Pointer (cTableName))
471482 C.free (unsafe.Pointer (cSchemaName))
0 commit comments