Skip to content

Commit 97e5d31

Browse files
committed
add oracle connection pooling
1 parent cd830c4 commit 97e5d31

10 files changed

+137
-13
lines changed

src/providers/oracle/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ SET(ORACLE_SRCS
1313
qgsoracletablemodel.cpp
1414
qgsoraclecolumntypethread.cpp
1515
qgsoraclefeatureiterator.cpp
16+
qgsoracleconnpool.cpp
1617
)
1718

1819
SET(ORACLE_MOC_HDRS
@@ -23,6 +24,7 @@ SET(ORACLE_MOC_HDRS
2324
qgsoraclenewconnection.h
2425
qgsoracletablemodel.h
2526
qgsoraclecolumntypethread.h
27+
qgsoracleconnpool.h
2628
)
2729

2830

src/providers/oracle/qgsoraclecolumntypethread.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ email : jef at norbit dot de
1717

1818
#include "qgsoraclecolumntypethread.h"
1919
#include "qgslogger.h"
20+
#include "qgsoracleconnpool.h"
2021

2122
#include <QMetaType>
2223

@@ -40,7 +41,7 @@ void QgsOracleColumnTypeThread::run()
4041
mStopped = false;
4142

4243
QgsDataSourceURI uri = QgsOracleConn::connUri( mName );
43-
QgsOracleConn *conn = QgsOracleConn::connectDb( uri );
44+
QgsOracleConn *conn = QgsOracleConnPool::instance()->acquireConnection( uri.connectionInfo() );
4445
if ( !conn )
4546
{
4647
QgsDebugMsg( "Connection failed - " + uri.connectionInfo() );
@@ -92,5 +93,5 @@ void QgsOracleColumnTypeThread::run()
9293
emit progress( 0, 0 );
9394
emit progressMessage( tr( "Table retrieval finished." ) );
9495

95-
conn->disconnect();
96+
QgsOracleConnPool::instance()->releaseConnection( conn );
9697
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/***************************************************************************
2+
qgsoracleconnpool.cpp
3+
---------------------
4+
begin : November 2015
5+
copyright : (C) 2015 by Juergen E. Fischer
6+
email : jef at norbit dot de
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsoracleconnpool.h"
17+
#include "qgsoracleconn.h"
18+
19+
QgsOracleConnPool QgsOracleConnPool::sInstance;
20+
21+
QgsOracleConnPool* QgsOracleConnPool::instance()
22+
{
23+
return &sInstance;
24+
}
25+
26+
QgsOracleConnPool::QgsOracleConnPool() : QgsConnectionPool<QgsOracleConn*, QgsOracleConnPoolGroup>()
27+
{
28+
QgsDebugCall;
29+
}
30+
31+
QgsOracleConnPool::~QgsOracleConnPool()
32+
{
33+
QgsDebugCall;
34+
}
35+
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/***************************************************************************
2+
qgsoracleonnpool.h
3+
---------------------
4+
begin : November 2015
5+
copyright : (C) 2015 by Juergen Fischer
6+
email : jef at norbit dot de
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSORACLECONNPOOL_H
17+
#define QGSORACLECONNPOOL_H
18+
19+
#include "qgsconnectionpool.h"
20+
#include "qgsoracleconn.h"
21+
22+
23+
inline QString qgsConnectionPool_ConnectionToName( QgsOracleConn* c )
24+
{
25+
return c->connInfo();
26+
}
27+
28+
inline void qgsConnectionPool_ConnectionCreate( QgsDataSourceURI uri, QgsOracleConn*& c )
29+
{
30+
c = QgsOracleConn::connectDb( uri );
31+
}
32+
33+
inline void qgsConnectionPool_ConnectionDestroy( QgsOracleConn* c )
34+
{
35+
c->disconnect(); // will delete itself
36+
}
37+
38+
inline void qgsConnectionPool_InvalidateConnection( QgsOracleConn* c )
39+
{
40+
Q_UNUSED( c );
41+
}
42+
43+
inline bool qgsConnectionPool_ConnectionIsValid( QgsOracleConn* c )
44+
{
45+
Q_UNUSED( c );
46+
return true;
47+
}
48+
49+
50+
class QgsOracleConnPoolGroup : public QObject, public QgsConnectionPoolGroup<QgsOracleConn*>
51+
{
52+
Q_OBJECT
53+
54+
public:
55+
explicit QgsOracleConnPoolGroup( QString name ) : QgsConnectionPoolGroup<QgsOracleConn*>( name ) { initTimer( this ); }
56+
57+
protected slots:
58+
void handleConnectionExpired() { onConnectionExpired(); }
59+
void startExpirationTimer() { expirationTimer->start(); }
60+
void stopExpirationTimer() { expirationTimer->stop(); }
61+
62+
protected:
63+
Q_DISABLE_COPY( QgsOracleConnPoolGroup )
64+
65+
};
66+
67+
/** Oracle connection pool - singleton */
68+
class QgsOracleConnPool : public QgsConnectionPool<QgsOracleConn*, QgsOracleConnPoolGroup>
69+
{
70+
public:
71+
static QgsOracleConnPool* instance();
72+
73+
protected:
74+
Q_DISABLE_COPY( QgsOracleConnPool )
75+
76+
private:
77+
QgsOracleConnPool();
78+
~QgsOracleConnPool();
79+
80+
static QgsOracleConnPool sInstance;
81+
};
82+
83+
84+
#endif // QGSORACLECONNPOOL_H

src/providers/oracle/qgsoraclefeatureiterator.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "qgsoraclefeatureiterator.h"
1717
#include "qgsoracleprovider.h"
18+
#include "qgsoracleconnpool.h"
1819

1920
#include "qgslogger.h"
2021
#include "qgsmessagelog.h"
@@ -26,7 +27,7 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource* sour
2627
: QgsAbstractFeatureIteratorFromSource<QgsOracleFeatureSource>( source, ownSource, request )
2728
, mRewind( false )
2829
{
29-
mConnection = QgsOracleConn::connectDb( mSource->mUri.connectionInfo() );
30+
mConnection = QgsOracleConnPool::instance()->acquireConnection( mSource->mUri.connectionInfo() );
3031
if ( !mConnection )
3132
{
3233
close();
@@ -269,7 +270,7 @@ bool QgsOracleFeatureIterator::close()
269270
mQry.finish();
270271

271272
if ( mConnection )
272-
mConnection->disconnect();
273+
QgsOracleConnPool::instance()->releaseConnection( mConnection );
273274
mConnection = 0;
274275

275276
iteratorClosed();

src/providers/oracle/qgsoraclenewconnection.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgscontexthelp.h"
2424
#include "qgsdatasourceuri.h"
2525
#include "qgsoracletablemodel.h"
26+
#include "qgsoracleconnpool.h"
2627

2728
QgsOracleNewConnection::QgsOracleNewConnection( QWidget *parent, const QString& connName, Qt::WindowFlags fl )
2829
: QDialog( parent, fl ), mOriginalConnName( connName )
@@ -138,7 +139,7 @@ void QgsOracleNewConnection::on_btnConnect_clicked()
138139
if ( !txtOptions->text().isEmpty() )
139140
uri.setParam( "dboptions", txtOptions->text() );
140141

141-
QgsOracleConn *conn = QgsOracleConn::connectDb( uri );
142+
QgsOracleConn *conn = QgsOracleConnPool::instance()->acquireConnection( uri.connectionInfo() );
142143

143144
if ( conn )
144145
{
@@ -148,7 +149,7 @@ void QgsOracleNewConnection::on_btnConnect_clicked()
148149
tr( "Connection to %1 was successful" ).arg( txtDatabase->text() ) );
149150

150151
// free connection resources
151-
conn->disconnect();
152+
QgsOracleConnPool::instance()->releaseConnection( conn );
152153
}
153154
else
154155
{

src/providers/oracle/qgsoracleprovider.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "qgsoraclesourceselect.h"
3434
#include "qgsoracledataitems.h"
3535
#include "qgsoraclefeatureiterator.h"
36+
#include "qgsoracleconnpool.h"
3637

3738
#include <QSqlRecord>
3839
#include <QSqlField>
@@ -69,7 +70,7 @@ QgsOracleProvider::QgsOracleProvider( QString const & uri )
6970
mRequestedGeomType = mUri.wkbType();
7071
mUseEstimatedMetadata = mUri.useEstimatedMetadata();
7172

72-
mConnection = QgsOracleConn::connectDb( mUri );
73+
mConnection = QgsOracleConnPool::instance()->acquireConnection( mUri.connectionInfo() );
7374
if ( !mConnection )
7475
{
7576
return;
@@ -210,7 +211,7 @@ QgsAbstractFeatureSource *QgsOracleProvider::featureSource() const
210211
void QgsOracleProvider::disconnectDb()
211212
{
212213
if ( mConnection )
213-
mConnection->disconnect();
214+
QgsOracleConnPool::instance()->releaseConnection( mConnection );
214215
mConnection = 0;
215216
}
216217

@@ -2973,7 +2974,6 @@ QGISEXTERN bool deleteLayer( const QString& uri, QString& errCause )
29732974
if ( !conn )
29742975
{
29752976
errCause = QObject::tr( "Connection to database failed" );
2976-
conn->disconnect();
29772977
return false;
29782978
}
29792979

src/providers/oracle/qgsoraclesourceselect.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,6 @@ QgsOracleSourceSelect::~QgsOracleSourceSelect()
439439
if ( mColumnTypeThread )
440440
{
441441
mColumnTypeThread->stop();
442-
mColumnTypeThread->wait();
443442
finishList();
444443
}
445444

src/providers/oracle/qgsoraclesourceselect.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgsdbfilterproxymodel.h"
2323
#include "qgsoracletablemodel.h"
2424
#include "qgscontexthelp.h"
25+
#include "qgsoracleconnpool.h"
2526

2627
#include <QMap>
2728
#include <QPair>
@@ -56,7 +57,7 @@ class QgsOracleSourceSelectDelegate : public QItemDelegate
5657
void setConnectionInfo( const QgsDataSourceURI& connInfo ) { mConnInfo = connInfo; }
5758

5859
protected:
59-
void setConn( QgsOracleConn *conn ) const { if ( mConn ) mConn->disconnect(); mConn = conn; }
60+
void setConn( QgsOracleConn *conn ) const { if ( mConn ) QgsOracleConnPool::instance()->releaseConnection( mConn ); mConn = conn; }
6061

6162
QgsOracleConn* conn() const
6263
{

src/providers/oracle/qgsoracletablecache.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ void _testTableCache()
274274
// fetch
275275

276276
QgsDataSourceURI uri = QgsOracleConn::connUri( connName );
277-
QgsOracleConn* c = QgsOracleConn::connectDb( uri.connectionInfo() );
277+
QgsOracleConn* c = QgsOracleConnectionPool::instance()->acquireConnection( uri.connectionInfo() );
278278
if ( !c )
279279
return;
280280

@@ -289,7 +289,7 @@ void _testTableCache()
289289
c->retrieveLayerTypes( layerProperty, useEstimated, onlyExisting );
290290
}
291291

292-
c->disconnect();
292+
QgsOracleConnPool::instance()->releaseConnection( c );
293293

294294
// save
295295

0 commit comments

Comments
 (0)