-
Notifications
You must be signed in to change notification settings - Fork 126
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在多协程情况下,gorose.IOrm 对象会存在脏数据,导致sql报错 #122
Comments
是否提供有可以重置该对象的方法 |
使用姿势不对, goroutine或者任何其他情况, 都要避免重复使用db对象. |
重置了也不行,这个是框架的问题 |
@laitianxu |
@laitianxu db绑定了一个Ormapi,里面会存储where,table等参数,并且使用的是*Orm,跨协程复用db,就会对同一个对象修改,一定会脏。如果使用Reset,那也是其他的协程也会受影响,因为全是修改的同一个对象的值。 每个协程,都使用一个新的NewOrm()产生的db,就不会有你说的问题了,不过代价就是,每个协程里的db,都绑定了一个session连接。 换个思路,只需要提供一个Clone方法,大概是: func (dba Orm) Clone() IOrm{
orm:=new(Orm)
orm.SetISession(dba.GetISession)
orm.OrmApi = new(OrmApi)
return orm
} 这样,对跨协程,就不会干扰了,因为使用了新的OrmApi来分析链式参数,并且数据库连接和之前的db share了。 不知道这样可不可行 @fizzday |
var engin *gorose.Engin |
我是这么解决问题,有效避免了你说的问题
|
协程下多个查询也出现同样的问题 |
您的邮件我已收到,我会尽快给您回复。
|
代码如下
`func main() {
wg = sync.WaitGroup{}
for i := 0; i < 100; i++ {
wg.Add(1)
go data(1)
}
wg.Wait()
}
func data(id int) {
db := dbUtil.DB().Table("tablename").Where("id", id)
_, err := db.Get()
if err != nil{
fmt.Println(err)
fmt.Println(db.LastSql())
}
wg.Done()
}`
控制台结果如下:
sql: expected 1 arguments, got 2
SELECT * FROM hp_colony WHERE id = ?, [1 1]
sql: expected 1 arguments, got 0
SELECT * FROM hp_colony WHERE id = ?, []
sql: expected 1 arguments, got 2
SELECT * FROM hp_colony WHERE id = ?, [1 1]
sql: expected 1 arguments, got 2
SELECT * FROM hp_colony WHERE id = ?, [1 1]
sql: expected 1 arguments, got 0
SELECT * FROM hp_colony WHERE id = ?, []
sql: expected 1 arguments, got 2
SELECT * FROM hp_colony WHERE id = ?, [1 1]
分析:多协程情况下导致多个协程从连接池中拿到的 gorose.IOrm 会相互影响,导致sql错乱,具体问题原因待分析源码
The text was updated successfully, but these errors were encountered: