diff --git a/broker/bin/main b/broker/bin/main
deleted file mode 100755
index 60fc519df924ef0d6eae045e88ff9b2cffe47632..0000000000000000000000000000000000000000
Binary files a/broker/bin/main and /dev/null differ
diff --git a/broker/src/hidra2_broker/database/database.go b/broker/src/hidra2_broker/database/database.go
index e4f2a57882194f474a7673b6ada18a586c0c3be6..e530bf03e1587c224a9e13dc92437fa45c656d2a 100644
--- a/broker/src/hidra2_broker/database/database.go
+++ b/broker/src/hidra2_broker/database/database.go
@@ -4,6 +4,7 @@ type Agent interface {
 	GetNextRecord(db_name string) ([]byte, error)
 	Connect(string) error
 	Close()
+	Copy() Agent
 }
 
 type DBError struct {
diff --git a/broker/src/hidra2_broker/database/database_test.go b/broker/src/hidra2_broker/database/database_test.go
index e6af70358f445f3eb52d8d1dbfd5c237c6351b6b..207b40683c2a6575b546a468a4b698d6f7071d9a 100644
--- a/broker/src/hidra2_broker/database/database_test.go
+++ b/broker/src/hidra2_broker/database/database_test.go
@@ -10,9 +10,9 @@ func TestMockDataBase(t *testing.T) {
 	var db MockedDatabase
 	db.On("Connect", mock.AnythingOfType("string")).Return(nil)
 	db.On("Close").Return()
+	db.On("Copy").Return(nil)
 	db.On("GetNextRecord", "").Return([]byte(""), nil)
 
 	db.Connect("")
 	db.GetNextRecord("")
-	db.Close()
 }
diff --git a/broker/src/hidra2_broker/database/mock_database.go b/broker/src/hidra2_broker/database/mock_database.go
index ebfdcf881e67607c198834328a8dd0de3df28a9e..fbeb4582c4e4304979a1d05f7ee70b7dd2a04ce8 100644
--- a/broker/src/hidra2_broker/database/mock_database.go
+++ b/broker/src/hidra2_broker/database/mock_database.go
@@ -19,6 +19,11 @@ func (db *MockedDatabase) Close() {
 	db.Called()
 }
 
+func (db *MockedDatabase) Copy() Agent{
+	db.Called()
+	return db
+}
+
 func (db *MockedDatabase) GetNextRecord(db_name string) (answer []byte, err error) {
 	args := db.Called(db_name)
 	return args.Get(0).([]byte), args.Error(1)
diff --git a/broker/src/hidra2_broker/database/mongodb.go b/broker/src/hidra2_broker/database/mongodb.go
index c653a63bb96f508145097ab94cbea779acb9cbad..4c76cb3f9c69a9890716c74fb51c5912c65053b7 100644
--- a/broker/src/hidra2_broker/database/mongodb.go
+++ b/broker/src/hidra2_broker/database/mongodb.go
@@ -27,6 +27,14 @@ type Mongodb struct {
 	databases    []string
 }
 
+func (db *Mongodb) Copy() Agent {
+	new_db:= new(Mongodb)
+	new_db.main_session = db.main_session.Copy()
+	new_db.databases = make([]string,len(db.databases))
+	copy(new_db.databases,db.databases)
+	return new_db
+}
+
 func (db *Mongodb) databaseInList(dbname string) bool {
 	return utils.StringInSlice(dbname, db.databases)
 }
@@ -46,7 +54,7 @@ func (db *Mongodb) dataBaseExist(dbname string) (err error) {
 	}
 
 	if !db.databaseInList(dbname) {
-		return errors.New(dbname + " not found")
+		return errors.New("database not found: " + dbname)
 	}
 
 	return nil
@@ -58,6 +66,14 @@ func (db *Mongodb) Connect(address string) (err error) {
 	}
 
 	db.main_session, err = mgo.DialWithTimeout(address, time.Second)
+	if err != nil {
+		return err
+	}
+
+	if err := db.updateDatabaseList(); err != nil {
+		return err
+	}
+
 	return
 }
 
diff --git a/broker/src/hidra2_broker/server/get_next.go b/broker/src/hidra2_broker/server/get_next.go
index efdcf40746b1cfa586a0bf306f13961312dd9615..ae29d355f5d7f1181d867b32cc811df9df7910cd 100644
--- a/broker/src/hidra2_broker/server/get_next.go
+++ b/broker/src/hidra2_broker/server/get_next.go
@@ -15,7 +15,8 @@ func extractRequestParameters(r *http.Request) (string, bool) {
 
 func routeGetNext(w http.ResponseWriter, r *http.Request) {
 	r.Header.Set("Content-type", "application/json")
-
+   // w.Write([]byte("Hello"))
+   // return
 	db_name, ok := extractRequestParameters(r)
 	if !ok {
 		w.WriteHeader(http.StatusBadRequest)
@@ -28,7 +29,9 @@ func routeGetNext(w http.ResponseWriter, r *http.Request) {
 }
 
 func getNextRecord(db_name string) (answer []byte, code int) {
-	answer, err := db.GetNextRecord(db_name)
+	db_new := db.Copy()
+	defer db_new.Close()
+	answer, err := db_new.GetNextRecord(db_name)
 	if err != nil {
 		err_db, ok := err.(*database.DBError)
 		code = utils.StatusError
diff --git a/broker/src/hidra2_broker/server/get_next_test.go b/broker/src/hidra2_broker/server/get_next_test.go
index ba177fb4cdd6e437690accd99c59d55c12b9f6e2..11385f121b5412533e9d30ff6c87357ca211fe07 100644
--- a/broker/src/hidra2_broker/server/get_next_test.go
+++ b/broker/src/hidra2_broker/server/get_next_test.go
@@ -30,10 +30,16 @@ func TestGetNextWithoutDatabaseName(t *testing.T) {
 	assert.Equal(t, http.StatusNotFound, w.Code, "no database name")
 }
 
+func ExpectCopyClose(mock_db *database.MockedDatabase){
+	mock_db.On("Copy").Return(mock_db)
+	mock_db.On("Close").Return()
+}
+
 func TestGetNextWithWrongDatabaseName(t *testing.T) {
 	mock_db := new(database.MockedDatabase)
 	db = mock_db
 	defer func() { db = nil }()
+	ExpectCopyClose(mock_db)
 	mock_db.On("GetNextRecord", "foo").Return([]byte(""),
 		&database.DBError{utils.StatusWrongInput, ""})
 
@@ -46,6 +52,7 @@ func TestGetNextWithInternalDBError(t *testing.T) {
 	mock_db := new(database.MockedDatabase)
 	db = mock_db
 	defer func() { db = nil }()
+	ExpectCopyClose(mock_db)
 	mock_db.On("GetNextRecord", "foo").Return([]byte(""), errors.New(""))
 
 	w := doRequest("/database/foo/next")
@@ -57,6 +64,7 @@ func TestGetNextWithGoodDatabaseName(t *testing.T) {
 	mock_db := new(database.MockedDatabase)
 	db = mock_db
 	defer func() { db = nil }()
+	ExpectCopyClose(mock_db)
 	mock_db.On("GetNextRecord", "dbname").Return([]byte("Hello"), nil)
 
 	w := doRequest("/database/dbname/next")
diff --git a/broker/src/hidra2_broker/server/server_nottested.go b/broker/src/hidra2_broker/server/server_nottested.go
index 640e6d9b8727639fef5ff15d6994b7ac42a3b041..461d25649e5fd9228c5638b27ed48daadf82a3e1 100644
--- a/broker/src/hidra2_broker/server/server_nottested.go
+++ b/broker/src/hidra2_broker/server/server_nottested.go
@@ -6,9 +6,51 @@ import (
 	"hidra2_broker/utils"
 	"log"
 	"net/http"
+	"fmt"
+	"time"
+	"sync"
 )
 
 func Start() {
+//	test(os.Args[1])
+//	return
 	mux := utils.NewRouter(listRoutes)
 	log.Fatal(http.ListenAndServe("127.0.0.1:5005", http.HandlerFunc(mux.ServeHTTP)))
 }
+
+func test(db_name string) {
+	nattempts := 50000
+	nconns := 8
+	start := time.Now()
+	nattempts = nattempts / nconns
+	counts := make([]int, nconns)
+	nbad := make([]int, nconns)
+	ngood := make([]int, nconns)
+
+	var waitGroup sync.WaitGroup
+	waitGroup.Add(nconns)
+
+	a := func(i int) {
+		for ; counts[i] < nattempts; counts[i]++ {
+			_,code := getNextRecord(db_name)
+			if code != utils.StatusOK {
+				nbad[i]++
+			} else {
+				ngood[i]++
+			}
+		}
+		waitGroup.Done()
+	}
+
+	for i := 0; i < nconns; i++ {
+		go a(i)
+	}
+	waitGroup.Wait()
+	sum := 0
+	for i := range counts {
+		sum += counts[i]
+	}
+	elapsed := time.Since(start)
+	fmt.Println("rate:", float64(sum)/elapsed.Seconds())
+	fmt.Println("good,bad:", ngood, nbad)
+}
diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt
index 12e73fc50834e6f2b006728b4a0ffd6d28da6172..8404ee9e46d62c69fc9f9906f67e129bf4db7eee 100644
--- a/worker/api/cpp/CMakeLists.txt
+++ b/worker/api/cpp/CMakeLists.txt
@@ -26,7 +26,7 @@ target_include_directories(${TARGET_NAME} PUBLIC include ${HIDRA2_CXX_COMMON_INC
 
 IF(WIN32)
     target_compile_definitions(${TARGET_NAME} PUBLIC -DCURL_STATICLIB)
-ELSE()
+ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
     SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
 ENDIF(WIN32)