• C++连接池
    • 连接池用法
    • 例子

    C++连接池

    C++ 驱动的连接池提供给用户一个快速获取连接实例的途径。

    连接池用法

    使用类 sdbDatasource 的 getConnection 方法从连接池中获取一个连接,使用 releaseConnection 方法把取出的连接放回连接池。当连接池使用的连接数到达连接上限时,下一个请求连接的操作将会等待一段时间,若在规定的时间内无空闲的连接可用,请求将失败。类 sdbDataSourceConf 可以设置连接池的各种参数。

    详情请查看相关 C++ API 介绍。

    例子

    1. #include "common.hpp" // by default, this file is in /opt/sequoiadb/samples/CPP
    2. #include "sdbDataSourceComm.hpp"
    3. #include "sdbDataSource.hpp"
    4. #include <vector>
    5.  
    6. using namespace std ;
    7. using namespace sdbclient ;
    8. using namespace bson ;
    9.  
    10. void queryTask( sdbDataSource &ds )
    11. {
    12. INT32 rc = SDB_OK ;
    13. // 定义一个sdb对象用来连接数据库
    14. sdb* connection ;
    15. // 定义sdbCursor对象用来查询
    16. sdbCursor cursor ;
    17.  
    18. // 定义BSONObj对象
    19. BSONObj obj ;
    20.  
    21. // 向连接池添加一个协调节点
    22. ds.addCoord( "192.168.20.53:50000" ) ;
    23.  
    24. // 从连接池获取一个连接
    25. rc = ds.getConnection( connection ) ;
    26. if ( SDB_OK != rc )
    27. {
    28. cout << "Fail to get a connection, rc = " << rc << endl ;
    29. goto error ;
    30. }
    31. // 列出复制组
    32. rc = connection->listReplicaGroups( cursor ) ;
    33. if ( SDB_OK != rc )
    34. {
    35. cout << "Fail to list replica groups, rc = " << rc << endl ;
    36. goto error ;
    37. }
    38. // 游标向前移动
    39. rc = cursor.next( obj ) ;
    40. if ( SDB_OK != rc )
    41. {
    42. cout << "sdbCursor fail to move forward, rc = " << rc << endl ;
    43. goto error ;
    44. }
    45. // 输出信息
    46. cout << obj.toString() << endl ;
    47. // 归还连接到连接池
    48. ds.releaseConnection( connection ) ;
    49. done:
    50. return ;
    51. error:
    52. goto done ;
    53. }
    54.  
    55.  
    56. INT32 main( INT32 argc, CHAR **argv )
    57. {
    58. INT32 rc = SDB_OK ;
    59. sdbDataSourceConf conf ;
    60. sdbDataSource ds ;
    61.  
    62. // 设置连接池配置,userName="",passwd=""
    63. conf.setUserInfo( "", "" ) ;
    64. // 初始化时预生成10个连接, 连接池中空闲连接不够用时每次生成10个连接
    65. // 最大空闲连接数为20,连接池最多维护500个连接
    66. conf.setConnCntInfo( 10, 10, 20, 500 ) ;
    67. // 每隔60秒将连接池中多于最大空闲连接数限定的空闲连接关闭,
    68. // 并将存活时间过长(连接已停止收发超过keepAliveTimeout时间)的连接关闭。
    69. // 0表示不关心连接隔多长时间没有收发消息。
    70. conf.setCheckIntervalInfo( 60, 0 ) ;
    71. // 每隔30s从编目节点同步协调节点信息(若为0,则表示不同步)
    72. conf.setSyncCoordInterval( 30 ) ;
    73. // 连接池采用负载均衡策略生成连接
    74. conf.setConnectStrategy( DS_STY_BALANCE ) ;
    75. // 当获取一个连接时,是否检查连接的有效性
    76. conf.setValidateConnection( TRUE ) ;
    77. // 是否启用SSL
    78. conf.setUseSSL( FALSE ) ;
    79. // 提供协调节点信息
    80. vector<string> v ;
    81. v.push_back( "192.168.20.53:11810" );
    82. v.push_back( "192.168.20.53:11910" ) ;
    83. // 初始化连接池对象
    84. rc = ds.init( v, conf ) ;
    85. if ( SDB_OK != rc )
    86. {
    87. cout << "Fail to init sdbDataSouce, rc = " << rc << endl ;
    88. goto error ;
    89. }
    90.  
    91. // 启动连接池
    92. rc = ds.enable() ;
    93. if ( SDB_OK != rc )
    94. {
    95. cout << "Fail to enable sdbDataSource, rc = " << rc << endl ;
    96. goto error ;
    97. }
    98.  
    99. // 在单线程中或多线程中使用连接池对象
    100. queryTask( ds ) ;
    101.  
    102. // 停止连接池
    103. rc = ds.disable() ;
    104. if ( SDB_OK != rc )
    105. {
    106. cout << "Fail to disable sdbDataSource, rc = " << rc << endl ;
    107. goto error ;
    108. }
    109.  
    110. // 关闭连接池
    111. ds.close() ;
    112. done:
    113. return 0 ;
    114. error:
    115. goto done ;
    116. }