Index: Provider/FdoRfpCommonReader.h
===================================================================
--- Provider/FdoRfpCommonReader.h	(revision 4508)
+++ Provider/FdoRfpCommonReader.h	(working copy)
@@ -49,7 +49,16 @@
 
 // protected constructor
 protected:
-	FdoRfpCommonReader(const FdoPtr<FdoRfpQueryResult>& queryResult) : m_queryResult(queryResult), m_cursor(-1) {}
+	FdoRfpCommonReader(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult) : m_queryResult(queryResult), m_cursor(-1) 
+    {
+        m_connection = FDO_SAFE_ADDREF(conn);
+    }
+
+    virtual ~FdoRfpCommonReader()
+    {
+        FDO_SAFE_RELEASE(m_connection);
+    }
+
 	void Dispose() { delete this; }
 
 //
@@ -221,6 +230,9 @@
 	// get column index according to the property name
 	int _getColumnIndex(FdoString* propertyName);
 
+    //the owner connection
+    FdoIConnection* m_connection;
+
 };
 
 template<typename READER>
Index: Provider/FdoRfpDataReader.cpp
===================================================================
--- Provider/FdoRfpDataReader.cpp	(revision 4508)
+++ Provider/FdoRfpDataReader.cpp	(working copy)
@@ -26,14 +26,14 @@
 #include "FDORFP.h"
 #include "FdoRfpDataReader.h"
 
-FdoRfpDataReader::FdoRfpDataReader(const FdoPtr<FdoRfpQueryResult>& queryResult) :
-											FdoRfpCommonReader<FdoIDataReader>(queryResult)
+FdoRfpDataReader::FdoRfpDataReader(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult) :
+											FdoRfpCommonReader<FdoIDataReader>(conn, queryResult)
 {
 }
 
-FdoRfpDataReader* FdoRfpDataReader::Create(const FdoPtr<FdoRfpQueryResult>& queryResult)
+FdoRfpDataReader* FdoRfpDataReader::Create(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult)
 {
-	FdoRfpDataReaderP fr = new FdoRfpDataReader(queryResult);
+	FdoRfpDataReaderP fr = new FdoRfpDataReader(conn, queryResult);
 
 	return FDO_SAFE_ADDREF(fr.p);
 }
Index: Provider/FdoRfpDataReader.h
===================================================================
--- Provider/FdoRfpDataReader.h	(revision 4508)
+++ Provider/FdoRfpDataReader.h	(working copy)
@@ -51,10 +51,10 @@
 // Constructor(s), desctrucotr, factory function(s)
 //
 protected:
-	FdoRfpDataReader(const FdoPtr<FdoRfpQueryResult>& queryResult);
+	FdoRfpDataReader(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult);
 public:
 	// Static factory function
-	static FdoRfpDataReader* Create(const FdoPtr<FdoRfpQueryResult>& queryResult);
+	static FdoRfpDataReader* Create(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult);
 
 // 
 // Exposed functions
Index: Provider/FdoRfpDatasetCache.cpp
===================================================================
--- Provider/FdoRfpDatasetCache.cpp	(revision 4508)
+++ Provider/FdoRfpDatasetCache.cpp	(working copy)
@@ -194,11 +194,11 @@
 FdoGdalMutexHolder::FdoGdalMutexHolder()
 
 {
-    g_GdalMutex.Enter();
+    //g_GdalMutex.Enter();
 }
 
 FdoGdalMutexHolder::~FdoGdalMutexHolder()
 
 {
-    g_GdalMutex.Leave();
+    //g_GdalMutex.Leave();
 }
Index: Provider/FdoRfpFeatureReader.cpp
===================================================================
--- Provider/FdoRfpFeatureReader.cpp	(revision 4508)
+++ Provider/FdoRfpFeatureReader.cpp	(working copy)
@@ -27,14 +27,14 @@
 #include "FdoRfpFeatureReader.h"
 #include "FdoCommonSchemaUtil.h"
 
-FdoRfpFeatureReader::FdoRfpFeatureReader(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult) :
-											FdoRfpCommonReader<FdoIFeatureReader>(queryResult), m_classDef(classDef)
+FdoRfpFeatureReader::FdoRfpFeatureReader(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult) :
+											FdoRfpCommonReader<FdoIFeatureReader>(conn, queryResult), m_classDef(classDef)
 {
 }
 
-FdoRfpFeatureReader* FdoRfpFeatureReader::Create(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult)
+FdoRfpFeatureReader* FdoRfpFeatureReader::Create(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult)
 {
-	FdoRfpReatureReaderP fr = new FdoRfpFeatureReader(classDef, queryResult);
+	FdoRfpReatureReaderP fr = new FdoRfpFeatureReader(conn, classDef, queryResult);
 
 	return FDO_SAFE_ADDREF(fr.p);
 }
Index: Provider/FdoRfpFeatureReader.h
===================================================================
--- Provider/FdoRfpFeatureReader.h	(revision 4508)
+++ Provider/FdoRfpFeatureReader.h	(working copy)
@@ -54,10 +54,10 @@
 // Constructor(s), desctrucotr, factory function(s)
 //
 protected:
-	FdoRfpFeatureReader(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
+	FdoRfpFeatureReader(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
 public:
 	// Static factory function
-	static FdoRfpFeatureReader* Create(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
+	static FdoRfpFeatureReader* Create(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
 
 // 
 // Exposed functions
Index: Provider/FdoRfpSelectAggregate.cpp
===================================================================
--- Provider/FdoRfpSelectAggregate.cpp	(revision 4508)
+++ Provider/FdoRfpSelectAggregate.cpp	(working copy)
@@ -76,7 +76,7 @@
 
 	FdoPtr<FdoRfpQueryResult> queryResult = executor.Execute();
 
-	return FdoRfpDataReader::Create(queryResult);
+	return FdoRfpDataReader::Create(connection, queryResult);
 }
 
 /// <summary>Set the distinct option of the selection. Note that grouping criteria is not supported with Distinct. 
Index: Provider/FdoRfpSelectCommand.cpp
===================================================================
--- Provider/FdoRfpSelectCommand.cpp	(revision 4508)
+++ Provider/FdoRfpSelectCommand.cpp	(working copy)
@@ -128,7 +128,7 @@
     if (queryResult->aggregated)
         throw FdoCommandException::Create(NlsMsgGet(GRFP_88_CAN_NOT_SELECT_AGGREGATE, "Can not select aggregated result by Select command."));
 
-    return FdoRfpFeatureReader::Create(classDef, queryResult);
+    return FdoRfpFeatureReader::Create(connection, classDef, queryResult);
 }
 
 

