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