main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "log"
  6. "math/rand"
  7. "sync"
  8. "time"
  9. _ "xugu_driver/xugu"
  10. )
  11. // 创建测试表
  12. const createTableQuery = `
  13. CREATE TABLE IF NOT EXISTS test_table (
  14. id INT AUTO_INCREMENT PRIMARY KEY,
  15. value VARCHAR(255) NOT NULL
  16. );`
  17. // 插入数据的 SQL 语句
  18. const insertQuery = `INSERT INTO test_table (value) VALUES (?)`
  19. // 读取数据的 SQL 语句
  20. const selectQuery = `SELECT value FROM test_table WHERE id = ?`
  21. // 测试的并发度
  22. const concurrency = 10
  23. // 初始化随机种子
  24. func init() {
  25. rand.Seed(time.Now().UnixNano())
  26. }
  27. func main() {
  28. db, err := sql.Open("xugusql", "IP=10.28.20.101;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5190;AUTO_COMMIT=on;CHAR_SET=UTF8")
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32. // 创建测试表
  33. _, err = db.Exec(createTableQuery)
  34. if err != nil {
  35. log.Fatalf("Failed to create test table: %v", err)
  36. }
  37. // 使用 WaitGroup 管理并发操作
  38. var wg sync.WaitGroup
  39. // 记录成功和失败的操作次数
  40. var successCount, failureCount int64
  41. var mu sync.Mutex
  42. // 运行并发操作
  43. for i := 0; i < concurrency; i++ {
  44. wg.Add(1)
  45. go func() {
  46. defer wg.Done()
  47. for {
  48. // 随机选择插入或查询操作
  49. if rand.Intn(2) == 0 {
  50. // 执行写操作 // `INSERT INTO test_table (value) VALUES (?)`
  51. _, err := db.Exec(insertQuery, fmt.Sprintf("value-%d", rand.Int()))
  52. mu.Lock()
  53. if err != nil {
  54. failureCount++
  55. } else {
  56. successCount++
  57. }
  58. mu.Unlock()
  59. } else {
  60. // 执行读操作
  61. id := rand.Intn(1000) + 1
  62. var value string //`SELECT value FROM test_table WHERE id = ?`
  63. err := db.QueryRow(selectQuery, id).Scan(&value)
  64. mu.Lock()
  65. if err != nil {
  66. failureCount++
  67. } else {
  68. successCount++
  69. }
  70. mu.Unlock()
  71. }
  72. // 打印当前成功和失败的操作次数
  73. mu.Lock()
  74. log.Printf("Success: %d, Failure: %d", successCount, failureCount)
  75. mu.Unlock()
  76. // 短暂休眠以防止过度频繁的请求
  77. time.Sleep(100 * time.Millisecond)
  78. }
  79. }()
  80. }
  81. // 等待所有操作完成(实际上这个程序不会停止,因为循环是无限的)
  82. wg.Wait()
  83. defer db.Close()
  84. }