summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-12-01 22:40:05 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-12-01 22:40:05 +0100
commit2c80424031c195333cfa6785ea7ab57dc9613fa3 (patch)
tree9e4a0bc1dc83224aae67661a74a85dabe1aeca98
parent2dfa85df6cf46dc2a5ee0c6bf69aa030b19a8435 (diff)
downloadsink-2c80424031c195333cfa6785ea7ab57dc9613fa3.tar.gz
sink-2c80424031c195333cfa6785ea7ab57dc9613fa3.zip
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).
-rw-r--r--common/facade.cpp23
-rw-r--r--common/resourceaccess.h2
2 files changed, 24 insertions, 1 deletions
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 @@
28 28
29using namespace Akonadi2; 29using namespace Akonadi2;
30 30
31class ResourceAccessFactory {
32public:
33 static ResourceAccessFactory &instance()
34 {
35 static ResourceAccessFactory *instance = 0;
36 if (!instance) {
37 instance = new ResourceAccessFactory;
38 }
39 return *instance;
40 }
41
42 Akonadi2::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier)
43 {
44 if (!mCache.contains(instanceIdentifier)) {
45 mCache.insert(instanceIdentifier, Akonadi2::ResourceAccess::Ptr::create(instanceIdentifier));
46 }
47 return mCache.value(instanceIdentifier);
48 }
49
50 QHash<QByteArray, Akonadi2::ResourceAccess::Ptr> mCache;
51};
31 52
32template<class DomainType> 53template<class DomainType>
33GenericFacade<DomainType>::GenericFacade(const QByteArray &resourceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &adaptorFactory , const QSharedPointer<Akonadi2::ResourceAccessInterface> resourceAccess) 54GenericFacade<DomainType>::GenericFacade(const QByteArray &resourceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &adaptorFactory , const QSharedPointer<Akonadi2::ResourceAccessInterface> resourceAccess)
@@ -37,7 +58,7 @@ GenericFacade<DomainType>::GenericFacade(const QByteArray &resourceIdentifier, c
37 mResourceInstanceIdentifier(resourceIdentifier) 58 mResourceInstanceIdentifier(resourceIdentifier)
38{ 59{
39 if (!mResourceAccess) { 60 if (!mResourceAccess) {
40 mResourceAccess = QSharedPointer<Akonadi2::ResourceAccess>::create(resourceIdentifier); 61 mResourceAccess = ResourceAccessFactory::instance().getAccess(resourceIdentifier);
41 } 62 }
42} 63}
43 64
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
63{ 63{
64 Q_OBJECT 64 Q_OBJECT
65public: 65public:
66 typedef QSharedPointer<ResourceAccess> Ptr;
67
66 ResourceAccess(const QByteArray &resourceName); 68 ResourceAccess(const QByteArray &resourceName);
67 ~ResourceAccess(); 69 ~ResourceAccess();
68 70