From 2c80424031c195333cfa6785ea7ab57dc9613fa3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 1 Dec 2015 22:40:05 +0100 Subject: Cache ResourceAccess instances. We want one connection per application per resource instance. With this change the connection is maintained for the lifetime of the client process (it should probably time out instead), but we at least avoid creating a connection per operation/query, which results in a significant performance boost (~10% for reading, 90% for writing in dummyresourcebenchmark). --- common/facade.cpp | 23 ++++++++++++++++++++++- common/resourceaccess.h | 2 ++ 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'common') diff --git a/common/facade.cpp b/common/facade.cpp index 1d6b9a7..ab41f96 100644 --- a/common/facade.cpp +++ b/common/facade.cpp @@ -28,6 +28,27 @@ using namespace Akonadi2; +class ResourceAccessFactory { +public: + static ResourceAccessFactory &instance() + { + static ResourceAccessFactory *instance = 0; + if (!instance) { + instance = new ResourceAccessFactory; + } + return *instance; + } + + Akonadi2::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier) + { + if (!mCache.contains(instanceIdentifier)) { + mCache.insert(instanceIdentifier, Akonadi2::ResourceAccess::Ptr::create(instanceIdentifier)); + } + return mCache.value(instanceIdentifier); + } + + QHash mCache; +}; template GenericFacade::GenericFacade(const QByteArray &resourceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &adaptorFactory , const QSharedPointer resourceAccess) @@ -37,7 +58,7 @@ GenericFacade::GenericFacade(const QByteArray &resourceIdentifier, c mResourceInstanceIdentifier(resourceIdentifier) { if (!mResourceAccess) { - mResourceAccess = QSharedPointer::create(resourceIdentifier); + mResourceAccess = ResourceAccessFactory::instance().getAccess(resourceIdentifier); } } diff --git a/common/resourceaccess.h b/common/resourceaccess.h index e87a1f7..527cfa3 100644 --- a/common/resourceaccess.h +++ b/common/resourceaccess.h @@ -63,6 +63,8 @@ class ResourceAccess : public ResourceAccessInterface { Q_OBJECT public: + typedef QSharedPointer Ptr; + ResourceAccess(const QByteArray &resourceName); ~ResourceAccess(); -- cgit v1.2.3