diff --git a/data/data.go b/data/data.go
index c5b0925..2566afa 100644
--- a/data/data.go
+++ b/data/data.go
@@ -45,7 +45,12 @@
 var log, dbTraceLog apid.LogService
 var config apid.ConfigService
 
-var dbMap = make(map[string]*sql.DB)
+type dbMapInfo struct {
+	db *sql.DB
+	closed chan bool
+}
+
+var dbMap = make(map[string]*dbMapInfo)
 var dbMapSync sync.RWMutex
 
 func CreateDataService() apid.DataService {
@@ -101,12 +106,17 @@
 	dbMapSync.Lock()
 	defer dbMapSync.Unlock()
 
-	db := dbMap[versionedID]
-	if db != nil {
-		dbMap[versionedID] = nil
+	dbm := dbMap[versionedID]
+	if dbm.db != nil {
+		if strings.EqualFold(config.GetString(logger.ConfigLevel), logrus.DebugLevel.String()) {
+			dbm.closed <- true
+		}
 		log.Warn("SETTING FINALIZER")
 		finalizer := Delete(versionedID)
-		runtime.SetFinalizer(db, finalizer)
+		runtime.SetFinalizer(dbm.db, finalizer)
+		dbMap[versionedID] = nil
+	} else {
+		log.Error("Cannot find DB handle for ver {%s} to release", version)
 	}
 
 	return
@@ -114,23 +124,19 @@
 
 func (d *dataService) dbVersionForID(id, version string) (db *sql.DB, err error) {
 
+	var stoplogchan chan bool
 	versionedID := VersionedDBID(id, version)
 
 	dbMapSync.RLock()
-	db = dbMap[versionedID]
+	dbm := dbMap[versionedID]
 	dbMapSync.RUnlock()
-	if db != nil {
-		return
+	if dbm != nil && dbm.db != nil {
+		return dbm.db, nil
 	}
 
 	dbMapSync.Lock()
 	defer dbMapSync.Unlock()
 
-	db = dbMap[versionedID]
-	if db != nil {
-		return
-	}
-
 	dataPath := DBPath(versionedID)
 
 	if err = os.MkdirAll(path.Dir(dataPath), 0700); err != nil {
@@ -175,15 +181,16 @@
 		log.Errorf("error enabling foreign_keys: %s", err)
 		return
 	}
-	dbLvl := config.GetString(logger.ConfigLevel)
-	if strings.EqualFold(dbLvl, logrus.DebugLevel.String()) {
-		go printDBStatsInfo(db, versionedID)
+	if strings.EqualFold(config.GetString(logger.ConfigLevel),
+			logrus.DebugLevel.String()) {
+		stoplogchan = logDBInfo(versionedID, db)
 	}
 
 	db.SetMaxOpenConns(config.GetInt(api.ConfigDBMaxConns))
 	db.SetMaxIdleConns(config.GetInt(api.ConfigDBIdleConns))
 	db.SetConnMaxLifetime(time.Duration(config.GetInt(api.ConfigDBConnsTimeout)) * time.Second)
-	dbMap[versionedID] = db
+	dbInfo := dbMapInfo {db: db, closed: stoplogchan}
+	dbMap[versionedID] = &dbInfo
 	return
 }
 
@@ -212,9 +219,20 @@
 	return path.Join(storagePath, relativeDataPath, id, "sqlite3")
 }
 
-func printDBStatsInfo(db *sql.DB, versionedId string) {
-	tick := time.Duration(statCollectionInterval * time.Second)
-	for _ = range time.Tick(tick) {
-		log.Debugf("Current number of open DB connections for ver {%s} is {%d}", versionedId, db.Stats().OpenConnections)
-	}
+func logDBInfo(versionedId string, db *sql.DB) chan bool {
+	stop := make(chan bool)
+	go func() {
+		for {
+			select {
+			case <-time.After(time.Duration(statCollectionInterval * time.Second)):
+				log.Debugf("Current number of open DB connections for ver {%s} is {%d}",
+					versionedId, db.Stats().OpenConnections)
+			case <-stop:
+				log.Debugf("Stop DB conn. logging for ver {%s}", versionedId)
+				return
+			}
+		}
+	}()
+	return stop
 }
+
