Hi @Prasad_Saya , thank you for your advice, I upgrade my MongoDB Server version from 4.0 to 4.4, but the block problem of Golangv1.17 is still remain, while the insertion with Golang1.13 is normal. The test code is as follows. And there was no error during the insertion, I also checked mongod.log and found no error.
type student struct {
ID int `bson:"_id"`
SId int `bson:"sId"`
Subject string `bson:"subject"`
Name string
Gender string
SNO int
}
var (
host string
port string
uname string
pwd string
dbname string
authDB string
)
func parseStartParams() {
flag.StringVar(&host, "h", "127.0.0.1", "server ip")
flag.StringVar(&port, "P", "10019", "server port")
flag.StringVar(&uname, "u", "tsmpadmin", "database user")
flag.StringVar(&pwd, "p", "tsmpadmin2021_isv_com", "user's password")
flag.StringVar(&dbname, "d", "temp", "database name")
flag.StringVar(&authDB, "auth", "admin", "authDatabase")
flag.Parse()
}
func main() {
parseStartParams()
client, err := connectMongo()
if err != nil {
return
}
defer client.Disconnect(context.TODO())
db, err := getDatabase(client, dbname)
if err != nil {
return
}
colName := "students17"
col := getCollection(db, colName)
fmt.Println("go version:", runtime.Version())
count := 0
bt := time.Now()
for i := 0; i < 1000000; i++ {
s := student{
ID: 1000000 + i,
SId: 1000000 + i,
Subject: "biology",
Name: fmt.Sprintf("stu%05d", i),
SNO: i,
}
if i%2 == 0 {
s.Gender = "male"
} else {
s.Gender = "female"
}
_, err := col.InsertOne(context.TODO(), &s)
if err != nil {
fmt.Println("InsertOne error: ", err)
break
}
count++
if count%100000 == 0 {
fmt.Printf("%d documents have been writen, cost %d ms\n", count, time.Since(bt)/time.Millisecond)
bt = time.Now()
}
}
}
func getCollection(db *mongo.Database, colNam string) *mongo.Collection {
return db.Collection(colNam)
}
func getDatabase(client *mongo.Client, dbnam string) (*mongo.Database, error) {
dbs, err := client.ListDatabaseNames(context.TODO(), bson.D{})
if err != nil {
fmt.Println("ListDatabaseNames error:", err)
return nil, err
}
var exist bool
for _, db := range dbs {
if db == dbnam {
exist = true
break
}
}
if !exist {
fmt.Printf("database %s not exist!\n", dbnam)
return nil, errors.New("database not exist")
}
return client.Database(dbnam), nil
}
func connectMongo() (*mongo.Client, error) {
host := fmt.Sprintf("mongodb://%s:%s@%s:%s/%s?retryWrites=false", uname, pwd, host, port, authDB)
clientOptions := options.Client().ApplyURI(host)
var err error
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
fmt.Println("mongo.Connect error:", err)
return nil, err
}
err = client.Ping(context.TODO(), nil)
if err != nil {
fmt.Println("mongo client.ping error:", err)
return nil, err
}
fmt.Printf("Connected to MongoDB!\n")
return client, nil
}