美文网首页
QgsConnectionPool类分析

QgsConnectionPool类分析

作者: NullUser | 来源:发表于2022-11-02 11:49 被阅读0次

基本

QgsConnectionPool是一个负责维持开放连接的模板类,用于避免每次创建新连接时的开销。接口都是线程安全的。

template <typename T, typename T_Group>
class QgsConnectionPool
{
  public:

    typedef QMap<QString, T_Group *> T_Groups;

T一般表示连接类,T_Group表示连接的集合。在QgConnectionPool内部通过成员变量protected: T_Groups mGroups;管理连接,T_Groups为:typedef QMap<QString, T_Group *> T_Groups

acquireConnection()

T acquireConnection( const QString &connInfo, int timeout = -1, bool requestMayBeNested = false, QgsFeedback *feedback = nullptr )

acquireConnection()用于获取一个连接。

      mMutex.lock();
      typename T_Groups::iterator it = mGroups.find( connInfo );
      if ( it == mGroups.end() )
      {
        it = mGroups.insert( connInfo, new T_Group( connInfo ) );
      }
      T_Group *group = *it;
      mMutex.unlock();

首先从Map中根据连接信息查找到连接集合,如果没有,则新建并插入到map中。

      if ( feedback )
      {
        QElapsedTimer timer;
        timer.start();

        while ( !feedback->isCanceled() )
        {
          if ( T conn = group->acquire( 300, requestMayBeNested ) )
            return conn;

          if ( timeout > 0 && timer.elapsed() >= timeout )
            return nullptr;
        }
        return nullptr;
      }

feedback用于在获得连接前取消该请求。如果传入了feedback,则开始计时并一直尝试获取,直到被取消或超时。

      else
      {
        return group->acquire( timeout, requestMayBeNested );
      }

如果没有feedback,则直接调用T_Group的acquire()接口获取连接。关于T_Group如何获取连接的可参考QgsConnectionPoolGroup类分析

releaseConnection()

void releaseConnection( T conn )

releaseConnection()用于将使用完的连接放回连接池中。

      mMutex.lock();
      typename T_Groups::iterator it = mGroups.find( qgsConnectionPool_ConnectionToName( conn ) );
      Q_ASSERT( it != mGroups.end() );
      T_Group *group = *it;
      mMutex.unlock();

      group->release( conn );

releaseConnection()的实现很简单,根据conn获得连接信息,并从连接map中查找,之后调用T_Group的release()接口减少一个引用。

相关文章

  • ios 底层原理 : 类与类结构分析

    本文主要分析类与类结构 类的分析 类的分析主要是分析 isa 的走向与继承关系 准备 创建两个类 1.继承自 NS...

  • OC底层原理 07:类 & 类结构分析

    本文的主要目的是分析 类 & 类的结构,整篇都是围绕一个类展开的一些探索 类 的分析 类的分析 主要是分析 isa...

  • iOS底层原理07:类 & 类结构分析

    本文的主要目的是分析 类 & 类的结构,整篇都是围绕一个类展开的一些探索 类的分析 类的分析主要是分析 isa的走...

  • iOS底层类结构分析

    类 的分析 类的分析 主要是分析 isa的走向 以及 继承关系 定义两个类 继承自NSObject的类LGPers...

  • iOS 类的结构分析

    类 的分析 类的分析 主要是分析 isa的走向 以及 继承关系 准备工作 定义两个类 继承自NSObject的类C...

  • iOS 类原理探索:类的结构分析

    OC 类原理探索 系列文章 OC 类原理探索:类的结构分析 OC 类原理探索:类结构分析补充[https://ju...

  • 类,类结构分析

    忙不是不学习的借口 在isa和类的关联[https://www.jianshu.com/p/079a6ad90f1...

  • 8、面向对象

    分析面向对象 先分析类,分析静态的属性和动态的方法 创建对象:类名 对象名=new 类名(); 为对象的属性赋值:...

  • Jun_25.md

    今日任务 以主类为目标尝试新的分析方式 Que 0x01 整理分析的主类 当前分析主类: com.samsung....

  • OC底层原理06 - 类 & 类结构分析

    类 的分析 类的分析主要是分析isa的走向以及继承关系 首先定义两个类,一个HLPerson继承自NSObject...

网友评论

      本文标题:QgsConnectionPool类分析

      本文链接:https://www.haomeiwen.com/subject/ndxetdtx.html