package main import ( "database/sql" "fmt" "log" "os" "sync" "time" _ "xugu_go_driver/xugu" ) func main3() { db, err := sql.Open("xugusql", "IP=192.168.2.216;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=15138;AUTO_COMMIT=on;CHAR_SET=UTF8") if err != nil { log.Fatal("err ", err) } // if err := db.Ping(); err != nil { // log.Fatal("err ping ", err) // } // rows, err := db.Query("select * from dual") // if err != nil { // log.Fatal(err) // } // // rows, err := db.Query("select * from test1 where id = ?;", 4) // // if err != nil { // // log.Fatal(err) // // } // var cols []string // cols, err = rows.Columns() // if err != nil { // log.Fatal(err) // } // fmt.Println("cols: ", cols) // pvals := make([]interface{}, len(cols)) // for key, _ := range pvals { // dest := make([]byte, 216) // pvals[key] = &dest // } /* end for */ // for rows.Next() { // err = rows.Scan(pvals...) // if err != nil { // log.Fatal(err) // } // for _, v := range pvals { // fmt.Printf("输出 %s\t", string(*(v.(*[]byte)))) // } // fmt.Printf("\n") // } // rows.Close() // stmt, err := db.Prepare("select * from test1 where id = ?") // if err != nil { // log.Fatal(err) // } // stmt.Exec(2) // ret, err := db.Exec("insert into test1 (id) values (9)") // if err != nil { // log.Fatal(err) // } // ret.LastInsertId() // stmt, err := db.Prepare("select * from test1 where id = ?") // if err != nil { // log.Fatal(err) // } // rows, err := stmt.Query(5) // if err != nil { // log.Fatal(err) // } // var cols []string // cols, err = rows.Columns() // if err != nil { // log.Fatal(err) // } // fmt.Println("cols: ", cols) // pvals := make([]interface{}, len(cols)) // for key, _ := range pvals { // dest := make([]byte, 216) // pvals[key] = &dest // } /* end for */ // for rows.Next() { // err = rows.Scan(pvals...) // if err != nil { // log.Fatal(err) // } // for _, v := range pvals { // fmt.Printf("输出 %s\t", string(*(v.(*[]byte)))) // } // fmt.Printf("\n") // } // rows.Close() // db.Exec("set auto_commit on;") // rows, err := db.Query("select * from gotab2;") // if err != nil { // fmt.Printf("[ERROR] %s\n", err.Error()) // return // } // column, err := rows.Columns() // if err != nil { // fmt.Printf("[ERROR] %s\n", err.Error()) // return // } // rows_value := make([]interface{}, len(column)) // for key, _ := range rows_value { // dest := make([]byte, 216) // rows_value[key] = &dest // } // for rows.Next() { // rows.Scan(rows_value...) // for _, v := range rows_value { // fmt.Printf("结果: %s\t", string(*(v.(*[]byte)))) // } // fmt.Printf("\n") // } // rows.Close() // db.Close() // 打开文件以写入 file, err := os.OpenFile("output.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Fatalf("无法打开文件: %v", err) } defer file.Close() // 创建一个新的日志记录器,将输出写入文件 logger := log.New(file, "", log.LstdFlags) var wg sync.WaitGroup const numGoroutines = 10000 for i := 0; i < numGoroutines; i++ { wg.Add(1) go func(i int) { defer wg.Done() processQuery(db, i, logger) }(i) } wg.Wait() fmt.Println("所有goroutine已完成") defer db.Close() } func processQuery(db *sql.DB, id int, logger *log.Logger) { fmt.Printf("goroutine %d 开始\n", id) //db.Query("select 1 from dual;") rows, err := db.Query("select * from gotab3;") if err != nil { fmt.Printf("[ERROR] %s\n", err.Error()) logger.Printf("[ERROR] %s\n", err.Error()) return } defer rows.Close() column, err := rows.Columns() if err != nil { fmt.Printf("[ERROR] %s\n", err.Error()) logger.Printf("[ERROR] %s\n", err.Error()) return } rowsValue := make([]interface{}, len(column)) for key := range rowsValue { dest := make([]byte, 100000) rowsValue[key] = &dest } for rows.Next() { err := rows.Scan(rowsValue...) if err != nil { fmt.Printf("[ERROR] %s\n", err.Error()) logger.Printf("[ERROR] %s\n", err.Error()) return } for _, v := range rowsValue { sss := []byte(*(v.(*[]byte))) v = sss } } //time.Sleep(time.Second * 100) logger.Println("goroutine %d 完成\n", id) fmt.Printf("goroutine %d 完成\n", id) } type userInfo struct { Id int Username string Password string Power sql.NullByte } type LicenseApplication struct { Creator string // 创建人 ApplicationDate string //申请日期 AssociatedProject string // 关联项目 SalesPerson string //销售人员 SalesEmail string // 销售接收邮箱 SupportPerson string //技服人员 SupportEmail string // 技服接收邮箱 TotalNodes string //总节点数 Company string //使用单位 ProductName string // 产品名称 Version string //版本 NodeCount string //节点数 Processor string //处理器 OperatingSystem string //操作系统 MasterMacAddress string // 主MasterMac地址 SecondaryMasterMacAddress string // 副MasterMac地址 } type LicenseInfo struct { ID int `json:"id"` UserID int `json:"user_id"` UpUser string `json:"up_user"` UpTime sql.NullTime `json:"up_time"` DelTime sql.NullTime `json:"del_time"` License1 string License2 string LicenseFlage string UniqueID string LicenseApplication } func main() { db, err := sql.Open("xugusql", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;AUTO_COMMIT=on;CHAR_SET=UTF8") if err != nil { log.Fatal("err ", err) } query := fmt.Sprintf(` SELECT la.*,li.lic1, li.lic2 FROM LicenseApplication la JOIN licenseRecord lr ON la.UniqueID = lr.LicenseUniqueID JOIN LicenseInfo li ON la.UniqueID = li.LicenseApplicationUniqueID WHERE lr.USERS LIKE '%%%s%%' LIMIT ? OFFSET ?`, "test3") rows, err := db.Query(query, 10, 0) if err != nil { fmt.Println("query data: %v", err) //return nil, 0, fmt.Errorf("query error: %v", err) } defer rows.Close() var results []LicenseInfo for rows.Next() { var li LicenseInfo err = rows.Scan( &li.ID, &li.UniqueID, &li.UserID, &li.UpUser, &li.UpTime, &li.DelTime, &li.LicenseApplication.Creator, &li.LicenseApplication.ApplicationDate, &li.LicenseApplication.AssociatedProject, &li.LicenseApplication.SalesPerson, &li.LicenseApplication.SalesEmail, &li.LicenseApplication.SupportPerson, &li.LicenseApplication.SupportEmail, &li.LicenseApplication.TotalNodes, &li.LicenseApplication.Company, &li.LicenseApplication.ProductName, &li.LicenseApplication.Version, &li.LicenseApplication.NodeCount, &li.LicenseApplication.Processor, &li.LicenseApplication.OperatingSystem, &li.LicenseApplication.MasterMacAddress, &li.LicenseApplication.SecondaryMasterMacAddress, &li.License1, &li.License2, ) if err != nil { fmt.Println("scan row: %v", err) // return nil, fmt.Errorf("scan row: %v", err) //return nil, 0, fmt.Errorf("scan row error: %v", err) } results = append(results, li) } if err = rows.Err(); err != nil { //return nil, 0, fmt.Errorf("rows error: %v", err) } fmt.Printf("results123 %#v", results) db.SetConnMaxLifetime(time.Minute * 3) }