mymysql与go-mysql-driver的一个区别

阅读更多

今天要写个工具就想顺便学下go。网上翻了下发现用比较多的是mymysqlgo-mysql-driver

  这两个驱动网上比较的文章也有些了,不过都没有提到一个点,个人觉得是很重要的,记录一下。

  

       先看使用go-mysql-driver的例子。

   db,_:=sql.Open("mysql",connect_string)

   db.Query("set binlog_format=row")

 

   rows,_:=db.Query("select @@binlog_format")

   forrows.Next(){

     varvstring

     rows.Scan(&v)

     fmt.Println(v)  // 输出是MIXED (global)

   }  

   rows.Close()

   db.Close()

 

 从上面的输出可以看到,set语句无效。

原因是在database/sql这个库实现中, 上面的变量db维护的是一个线程池,而不是一个线程,因此前后两次执行db.Query并不保证在同一个session里面。

同样的, set @a=1,这种线程变量也是可能在后续的select中得不到1这个值。

 

 

由于mymysql 不是基于database/sql,以下代码能确保输出19

 

mydb := mysql.New("tcp", "", "ip:port”, user, password, dbname)

    mydb.Connect()

    mydb.Query("set @a=19")

    res, _ := mydb.Start("select @a")

    for {

      row, _ := res.GetRow()

      if row == nil {break}

      fmt.Println(row.Str(0))

    }  

   

    mydb.Close()

你可能感兴趣的:(go,MySQL驱动,线程,线程池,线程变量)