
# 典型应用场景配置
#### 日志诊断场景
ODBC日志分为unixODBC驱动管理器日志和gsqlODBC驱动端日志。前者可以用于追踪应用程序API调用的执行状态，后者包含驱动底层实现的诊断（DFX）日志，用于帮助定位问题。
unixODBC日志需要在odbcinst.ini文件中配置：
```
[ODBC]
Trace=Yes
TraceFile=/path/to/odbctrace.log
[GaussMPP]
Driver64=/usr/local/lib/gsqlodbcw.so
setup=/usr/local/lib/gsqlodbcw.so
```
gsqlODBC日志只需在odbc.ini加上如下内容：
```
[gaussdb]
Driver=GaussMPP
#数据库Server IP
Servername=10.10.0.13
...
#打开驱动端debug日志，日志级别为TRACE
Debug=5
```
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
unixODBC日志将生成在TraceFile指定的路径下，gsqlODBC驱动生成的调试日志将存储在系统"/tmp/"目录下的"mylog_xxx.log"文件中。
#### 负载均衡场景
当应用程序有大并发场景时可开启负载均衡：
- 负载均衡即为将并发连接随机分发到所有CN上，避免单个CN负载过大，达到提高性能的目的。
- 配置参数AutoBalance=1，开启负载均衡功能。
- 参数RefreshCNListTime=5可以选择性配置，默认刷新时间为10s。
- 参数Priority=1可以选择性配置，即为并发连接优先发送到配置文件中配置的CN上，当配置的CN全部不可连接时，连接才会被分发到剩余CN上。
 
示例场景：
集群环境有6个CN，CN1、CN2、CN3、CN4、CN5和CN6；配置文件配置4个CN，CN1、CN2、CN3和CN4。
odbc.ini配置文件示例：
```
[gaussdb]
Driver=GaussMPP
#数据库Server IP。
Servername=10.145.130.26,10.145.130.27,10.145.130.28,10.145.130.29  
#数据库名称。
Database=db1  
#数据库用户名。
Username=omm  
#数据库用户密码。
Password=  
#数据库侦听端口。
Port=8000  
Sslmode=allow
AutoBalance=1
RefreshCNListTime=3
Priority=1
```
当配置文件和集群环境如示例时，并发连接会随机、平均发送到CN1、CN2、CN3和CN4上，连接数均衡。当CN1、CN2、CN3和CN4全部不可用时，并发连接会随机、平均发送到CN5和CN6上。如果此时CN1、CN2、CN3和CN4中有CN重新可用时，连接则不会再发送到CN5和CN6上，而是重新发送到重新可用的CN上。
#### 备机读场景
配置文件配置CN节点，设置StandbyRead=1开启分布式备机读模式。
odbc.ini配置文件示例：
```
[gaussdb]
Driver=GaussMPP
#数据库Server IP。
Servername=10.145.130.26,10.145.130.27,10.145.130.28,10.145.130.29  
#数据库名称。
Database=db1  
#数据库用户名称。
Username=omm  
#数据库用户密码。
Password=  
#数据库侦听端口。
Port=8000  
#打开备机读模式。
StandbyRead=1  
Sslmode=allow
#开启负载均衡模式。
AutoBalance=1
```
 #### 连接池场景
连接池允许应用程序重复使用预先建立的连接，无需每次都重新建立连接。连接一旦创建并放入连接池，应用程序即可重复利用，避免了重复执行完整的连接过程。
该池化连接机制的使用可以显著提升性能，尤其对于需要频繁建立和断开连接的中间层应用程序或网络连接的应用程序而言，性能提升尤为明显。
除了性能优势外，连接池架构还能够实现环境中的连接在单个进程中被多个组件共享的目的。这意味着，同一进程中的不同组件可以在不互相干扰的情况下共享连接池中的连接，进一步提高了系统的运行效率和资源利用率。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
在连接池中，打开的连接可能被多个用户重用，如果您的应用程序脚本会更改数据库连接的状态，可能会导致数据状态冲突或泄露，为了安全起见，建议谨慎评估使用连接池。
**Linux场景配置**
在odbcinst.ini配置文件中开启连接池，连接池相关参考配置如下：
```
[ODBC]
#开启连接池
Pooling=Yes 
[GaussMPP]
#一个连接在连接池中未被重用则会被释放的计时，默认为0，开启连接池需要设置为大于0
CPTimeout=60 
#该驱动下连接池存在的计时
CPTimeToLive=60 
[GaussMPP2]
#关闭连接池
CPTimeout=0
```
**Windows场景配置**
在打开的驱动管理器上，选择"连接池"后双击"GaussDB Unicode"驱动名称，选择"使用池连接此驱动程序"\[默认为60s\]，该设置参数同**Linux场景配置**的CPTimeout参数，参考例图如下：
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620640607.png "点击放大")
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
1. 在应用程序中配置连接池参数，需要在环境句柄创建前通过调用SQLSetEnvAttr设置连接池参数，其中的环境句柄应设置为NULL，这使得SQL_ATTR_CONNECTION_POOLING成为进程级属性。目前在Windows上支持配置SQL_ATTR_CONNECTION_POOLING为以下两种值：
   - SQL_CP_OFF：默认参数设置，禁用连接池。
   
   - SQL_CP_ONE_PER_DRIVER：开启连接池，每个驱动支持一个连接池，驱动其中的所有连接共享一个池。
    
2. 应用程序调用SQLConnect或SQLDriverConnect时，会从连接池中提取连接，如果连接已超时，或者池中没有与请求匹配的连接，则会打开一个新连接，连接池对调用应用程序是透明的。
3. 应用程序调用SQLDisconnect时，连接将被放回连接池而非直接释放，供后续请求复用。

4. 在环境上调用SQLFreeHandle释放环境句柄前，应用程序成功为环境设置的所有环境属性都会持续存在。
5. 若应用程序的连接在一段时间内处于非活动状态（未在连接中使用），则会从池中删除该连接。连接池的大小仅受内存限制和服务器限制。
 
