Typical Application Scenarios and Configurations
Log Diagnosis
ODBC logs are classified into unixODBC driver manager logs and psqlODBC driver logs. The former is used to trace whether the application API is successfully executed, and the latter is used to locate problems based on DFX logs generated during underlying implementation.
1 2 3 4 5 6 7 |
[ODBC] Trace=Yes TraceFile=/path/to/odbctrace.log [GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so |
[gaussdb] Driver=GaussMPP Servername=10.10.0.13 (database server IP address) ... Debug=1 (Enable the debug log function of the driver.)
The unixODBC logs are generated in the path configured by TraceFile. The psqlODBC generates the mylog_xxx.log file in the /tmp/ directory.
High Performance
- Set UseBatchProtocol to 1 in odbc.ini and set support_batch_bind in the database.
- The ODBC program binding type must be the same as that in the database.
- The character set of the client is the same as that of the database.
- The transaction is committed manually.
[gaussdb] Driver=GaussMPP Servername=10.10.0.13 (database server IP address) ... UseBatchProtocol=1 (enabled by default) ConnSettings=set client_encoding=UTF8 (Set the character code on the client to be the same as that on the server.)
#ifdef WIN32 #include <windows.h> #endif #include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqlext.h> #include <string.h> #include <sys/time.h> #define MESSAGE_BUFFER_LEN 128 SQLHANDLE h_env = NULL; SQLHANDLE h_conn = NULL; SQLHANDLE h_stmt = NULL; void print_error() { SQLCHAR Sqlstate[SQL_SQLSTATE_SIZE+1]; SQLINTEGER NativeError; SQLCHAR MessageText[MESSAGE_BUFFER_LEN]; SQLSMALLINT TextLength; SQLRETURN ret = SQL_ERROR; ret = SQLGetDiagRec(SQL_HANDLE_STMT, h_stmt, 1, Sqlstate, &NativeError, MessageText, MESSAGE_BUFFER_LEN, &TextLength); if ( SQL_SUCCESS == ret) { printf("\n STMT ERROR-%05d %s", NativeError, MessageText); return; } ret = SQLGetDiagRec(SQL_HANDLE_DBC, h_conn, 1, Sqlstate, &NativeError, MessageText, MESSAGE_BUFFER_LEN, &TextLength); if ( SQL_SUCCESS == ret) { printf("\n CONN ERROR-%05d %s", NativeError, MessageText); return; } ret = SQLGetDiagRec(SQL_HANDLE_ENV, h_env, 1, Sqlstate, &NativeError, MessageText, MESSAGE_BUFFER_LEN, &TextLength); if ( SQL_SUCCESS == ret) { printf("\n ENV ERROR-%05d %s", NativeError, MessageText); return; } return; } /* Expect the function to return SQL_SUCCESS. */ #define RETURN_IF_NOT_SUCCESS(func) \ {\ SQLRETURN ret_value = (func);\ if (SQL_SUCCESS != ret_value)\ {\ print_error();\ printf("\n failed line = %u: expect SQL_SUCCESS, but ret = %d", __LINE__, ret_value);\ return SQL_ERROR; \ }\ } /* Expect the function to return SQL_SUCCESS. */ #define RETURN_IF_NOT_SUCCESS_I(i, func) \ {\ SQLRETURN ret_value = (func);\ if (SQL_SUCCESS != ret_value)\ {\ print_error();\ printf("\n failed line = %u (i=%d): : expect SQL_SUCCESS, but ret = %d", __LINE__, (i), ret_value);\ return SQL_ERROR; \ }\ } /* Expect the function to return SQL_SUCCESS_WITH_INFO. */ #define RETURN_IF_NOT_SUCCESS_INFO(func) \ {\ SQLRETURN ret_value = (func);\ if (SQL_SUCCESS_WITH_INFO != ret_value)\ {\ print_error();\ printf("\n failed line = %u: expect SQL_SUCCESS_WITH_INFO, but ret = %d", __LINE__, ret_value);\ return SQL_ERROR; \ }\ } /* Expect the values are the same. */ #define RETURN_IF_NOT(expect, value) \ if ((expect) != (value))\ {\ printf("\n failed line = %u: expect = %u, but value = %u", __LINE__, (expect), (value)); \ return SQL_ERROR;\ } /* Expect the character strings are the same. */ #define RETURN_IF_NOT_STRCMP_I(i, expect, value) \ if (( NULL == (expect) ) || (NULL == (value)))\ {\ printf("\n failed line = %u (i=%u): input NULL pointer !", __LINE__, (i)); \ return SQL_ERROR; \ }\ else if (0 != strcmp((expect), (value)))\ {\ printf("\n failed line = %u (i=%u): expect = %s, but value = %s", __LINE__, (i), (expect), (value)); \ return SQL_ERROR;\ } // prepare + execute SQL statement int execute_cmd(SQLCHAR *sql) { if ( NULL == sql ) { return SQL_ERROR; } if ( SQL_SUCCESS != SQLPrepare(h_stmt, sql, SQL_NTS)) { return SQL_ERROR; } if ( SQL_SUCCESS != SQLExecute(h_stmt)) { return SQL_ERROR; } return SQL_SUCCESS; } // execute + commit handle int commit_exec() { if ( SQL_SUCCESS != SQLExecute(h_stmt)) { return SQL_ERROR; } // Manual commit if ( SQL_SUCCESS != SQLEndTran(SQL_HANDLE_DBC, h_conn, SQL_COMMIT)) { return SQL_ERROR; } return SQL_SUCCESS; } int begin_unit_test() { SQLINTEGER ret; /* Allocate an environment handle. */ ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &h_env); if ((SQL_SUCCESS != ret) && (SQL_SUCCESS_WITH_INFO != ret)) { printf("\n begin_unit_test::SQLAllocHandle SQL_HANDLE_ENV failed ! ret = %d", ret); return SQL_ERROR; } /* Set the version number before connection. */ if (SQL_SUCCESS != SQLSetEnvAttr(h_env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0)) { print_error(); printf("\n begin_unit_test::SQLSetEnvAttr SQL_ATTR_ODBC_VERSION failed ! ret = %d", ret); SQLFreeHandle(SQL_HANDLE_ENV, h_env); return SQL_ERROR; } /* Allocate a connection handle. */ ret = SQLAllocHandle(SQL_HANDLE_DBC, h_env, &h_conn); if (SQL_SUCCESS != ret) { print_error(); printf("\n begin_unit_test::SQLAllocHandle SQL_HANDLE_DBC failed ! ret = %d", ret); SQLFreeHandle(SQL_HANDLE_ENV, h_env); return SQL_ERROR; } /* Establish a connection. */ ret = SQLConnect(h_conn, (SQLCHAR*) "gaussdb", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0); if (SQL_SUCCESS != ret) { print_error(); printf("\n begin_unit_test::SQLConnect failed ! ret = %d", ret); SQLFreeHandle(SQL_HANDLE_DBC, h_conn); SQLFreeHandle(SQL_HANDLE_ENV, h_env); return SQL_ERROR; } /* Allocate a statement handle. */ ret = SQLAllocHandle(SQL_HANDLE_STMT, h_conn, &h_stmt); if (SQL_SUCCESS != ret) { print_error(); printf("\n begin_unit_test::SQLAllocHandle SQL_HANDLE_STMT failed ! ret = %d", ret); SQLFreeHandle(SQL_HANDLE_DBC, h_conn); SQLFreeHandle(SQL_HANDLE_ENV, h_env); return SQL_ERROR; } return SQL_SUCCESS; } void end_unit_test() { /* Release a statement handle. */ if (NULL != h_stmt) { SQLFreeHandle(SQL_HANDLE_STMT, h_stmt); } /* Release a connection handle. */ if (NULL != h_conn) { SQLDisconnect(h_conn); SQLFreeHandle(SQL_HANDLE_DBC, h_conn); } /* Release an environment handle. */ if (NULL != h_env) { SQLFreeHandle(SQL_HANDLE_ENV, h_env); } return; } int main() { // begin test if (begin_unit_test() != SQL_SUCCESS) { printf("\n begin_test_unit failed."); return SQL_ERROR; } // The handle configuration is the same as that in the preceding case int i = 0; SQLCHAR* sql_drop = "drop table if exists test_bindnumber_001"; SQLCHAR* sql_create = "create table test_bindnumber_001(" "f4 number, f5 number(10, 2)" ")"; SQLCHAR* sql_insert = "insert into test_bindnumber_001 values(?, ?)"; SQLCHAR* sql_select = "select * from test_bindnumber_001"; SQLLEN RowCount; SQL_NUMERIC_STRUCT st_number; SQLCHAR getValue[2][MESSAGE_BUFFER_LEN]; /* Step 1. Create a table. */ RETURN_IF_NOT_SUCCESS(execute_cmd(sql_drop)); RETURN_IF_NOT_SUCCESS(execute_cmd(sql_create)); /* Step 2.1 Bind parameters using the SQL_NUMERIC_STRUCT structure. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); // First line: 1234.5678 memset(st_number.val, 0, SQL_MAX_NUMERIC_LEN); st_number.precision = 8; st_number.scale = 4; st_number.sign = 1; st_number.val[0] = 0x4E; st_number.val[1] = 0x61; st_number.val[2] = 0xBC; RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0, NULL)); // Disable automatic commit. SQLSetConnectAttr(h_conn, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); // Second line: 12345678 memset(st_number.val, 0, SQL_MAX_NUMERIC_LEN); st_number.precision = 8; st_number.scale = 0; st_number.sign = 1; st_number.val[0] = 0x4E; st_number.val[1] = 0x61; st_number.val[2] = 0xBC; RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 0, &st_number, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 0, &st_number, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); // Third line: 12345678 memset(st_number.val, 0, SQL_MAX_NUMERIC_LEN); st_number.precision = 0; st_number.scale = 4; st_number.sign = 1; st_number.val[0] = 0x4E; st_number.val[1] = 0x61; st_number.val[2] = 0xBC; RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.2 Bind parameters by using the SQL_C_CHAR character string in the fourth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); SQLCHAR* szNumber = "1234.5678"; RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_NUMERIC, strlen(szNumber), 0, szNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_NUMERIC, strlen(szNumber), 0, szNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.3 Bind parameters by using SQL_C_FLOAT in the fifth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); SQLREAL fNumber = 1234.5678; RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_NUMERIC, sizeof(fNumber), 4, &fNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_NUMERIC, sizeof(fNumber), 4, &fNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.4 Bind parameters by using SQL_C_DOUBLE in the sixth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); SQLDOUBLE dNumber = 1234.5678; RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_NUMERIC, sizeof(dNumber), 4, &dNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_NUMERIC, sizeof(dNumber), 4, &dNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); SQLBIGINT bNumber1 = 0xFFFFFFFFFFFFFFFF; SQLBIGINT bNumber2 = 12345; /* Step 2.5 Bind parameters by using SQL_C_SBIGINT in the seventh line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_SBIGINT, SQL_NUMERIC, sizeof(bNumber1), 4, &bNumber1, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_SBIGINT, SQL_NUMERIC, sizeof(bNumber2), 4, &bNumber2, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.6 Bind parameters by using SQL_C_UBIGINT in the eighth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_UBIGINT, SQL_NUMERIC, sizeof(bNumber1), 4, &bNumber1, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_UBIGINT, SQL_NUMERIC, sizeof(bNumber2), 4, &bNumber2, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); SQLLEN lNumber1 = 0xFFFFFFFFFFFFFFFF; SQLLEN lNumber2 = 12345; /* Step 2.7 Bind parameters by using SQL_C_LONG in the ninth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_NUMERIC, sizeof(lNumber1), 0, &lNumber1, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_NUMERIC, sizeof(lNumber2), 0, &lNumber2, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.8 Bind parameters by using SQL_C_ULONG in the tenth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_NUMERIC, sizeof(lNumber1), 0, &lNumber1, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_NUMERIC, sizeof(lNumber2), 0, &lNumber2, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); SQLSMALLINT sNumber = 0xFFFF; /* Step 2.9 Bind parameters by using SQL_C_SHORT in the eleventh line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_SHORT, SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_SHORT, SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.10 Bind parameters by using SQL_C_USHORT in the twelfth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_USHORT, SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_USHORT, SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); SQLCHAR cNumber = 0xFF; /* Step 2.11 Bind parameters by using SQL_C_TINYINT in the thirteenth line. */ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_TINYINT, SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_TINYINT, SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Step 2.12 Bind parameters by using SQL_C_UTINYINT in the fourteenth line.*/ RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT, SQL_C_UTINYINT, SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT, SQL_C_UTINYINT, SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL)); RETURN_IF_NOT_SUCCESS(commit_exec()); RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1, RowCount); /* Use the character string type to unify the expectation. */ SQLCHAR* expectValue[14][2] = {{"1234.5678", "1234.57"}, {"12345678", "12345678"}, {"0", "0"}, {"1234.5678", "1234.57"}, {"1234.5677", "1234.57"}, {"1234.5678", "1234.57"}, {"-1", "12345"}, {"18446744073709551615", "12345"}, {"-1", "12345"}, {"4294967295", "12345"}, {"-1", "-1"}, {"65535", "65535"}, {"-1", "-1"}, {"255", "255"}, }; RETURN_IF_NOT_SUCCESS(execute_cmd(sql_select)); while ( SQL_NO_DATA != SQLFetch(h_stmt)) { RETURN_IF_NOT_SUCCESS_I(i, SQLGetData(h_stmt, 1, SQL_C_CHAR, &getValue[0], MESSAGE_BUFFER_LEN, NULL)); RETURN_IF_NOT_SUCCESS_I(i, SQLGetData(h_stmt, 2, SQL_C_CHAR, &getValue[1], MESSAGE_BUFFER_LEN, NULL)); //RETURN_IF_NOT_STRCMP_I(i, expectValue[i][0], getValue[0]); //RETURN_IF_NOT_STRCMP_I(i, expectValue[i][1], getValue[1]); i++; } RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(i, RowCount); SQLCloseCursor(h_stmt); /* Final step. Delete the table and restore the environment. */ RETURN_IF_NOT_SUCCESS(execute_cmd(sql_drop)); end_unit_test(); }
In the preceding example, the number column is defined. When the SQLBindParameter API is called, the performance of binding SQL_NUMERIC is higher than that of SQL_LONG. If char is used, the data type needs to be converted when data is inserted to the database server, causing a performance bottleneck.
Load Balancing
- Load balancing is to randomly distribute concurrent connections to all CNs to prevent a single CN from being overloaded and improve performance.
- Set AutoBalance to 1 to enable load balancing.
- Set RefreshCNListTime to 5 as required. The default refresh interval is 10 seconds.
- Set Priority to 1 as required. In this case, concurrent connections are preferentially sent to the CNs configured in the configuration file. If all the configured CNs are unavailable, the connections are distributed to the remaining CNs.
Example:
Six CNs, namely, CN1, CN2, CN3, CN4, CN5, and CN6, are configured in the cluster, and four CNs, namely, CN1, CN2, CN3, and CN4, are configured in the configuration file.
Example content of the odbc.ini file:
[gaussdb] Driver=GaussMPP Servername=10.145.130.26,10.145.130.27,10.145.130.28,10.145.130.29 (IP address of the database server) Database=postgres (database name) Username=omm (database username) Password= (database user password) Port=8000 (database listening port) Sslmode=allow AutoBalance=1 RefreshCNListTime=3 Priority=1
If the configuration file and cluster environment are the same as those in the example, concurrent connections are randomly and evenly distributed to CN1, CN2, CN3, and CN4. When CN1, CN2, CN3, and CN4 are all unavailable, concurrent connections are randomly and evenly sent to CN5 and CN6. If any CN among CN1, CN2, CN3, and CN4 becomes available, the connections are not sent to CN5 and CN6 but to the available CN.
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot