Skip to content

Commit 6018934

Browse files
authored
fix: [#840] DB cache is not reset when fresh orm (#1322)
1 parent 428315b commit 6018934

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

database/driver/gorm.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ import (
1717
)
1818

1919
var (
20-
connectionToDB = make(map[string]*gorm.DB)
21-
connectionToDBLock = sync.Mutex{}
20+
connectionToDB sync.Map
21+
connectionToDBLock sync.Mutex
2222
pingWarning sync.Once
2323
)
2424

2525
func BuildGorm(config config.Config, logger logger.Interface, pool database.Pool, connection string) (*gorm.DB, error) {
26-
if db, ok := connectionToDB[connection]; ok {
27-
return db, nil
26+
if db, ok := connectionToDB.Load(connection); ok {
27+
return db.(*gorm.DB), nil
2828
}
2929

3030
if len(pool.Writers) == 0 {
@@ -34,8 +34,8 @@ func BuildGorm(config config.Config, logger logger.Interface, pool database.Pool
3434
connectionToDBLock.Lock()
3535
defer connectionToDBLock.Unlock()
3636

37-
if db, ok := connectionToDB[connection]; ok {
38-
return db, nil
37+
if db, ok := connectionToDB.Load(connection); ok {
38+
return db.(*gorm.DB), nil
3939
}
4040

4141
gormConfig := &gorm.Config{
@@ -82,7 +82,7 @@ func BuildGorm(config config.Config, logger logger.Interface, pool database.Pool
8282
db.SetConnMaxIdleTime(connMaxIdleTime * time.Second)
8383
db.SetConnMaxLifetime(connMaxLifetime * time.Second)
8484

85-
connectionToDB[connection] = instance
85+
connectionToDB.Store(connection, instance)
8686

8787
return instance, nil
8888
}
@@ -112,7 +112,17 @@ func BuildGorm(config config.Config, logger logger.Interface, pool database.Pool
112112
return nil, err
113113
}
114114

115-
connectionToDB[connection] = instance
115+
connectionToDB.Store(connection, instance)
116116

117117
return instance, nil
118118
}
119+
120+
func ResetConnections() {
121+
connectionToDBLock.Lock()
122+
defer connectionToDBLock.Unlock()
123+
124+
connectionToDB.Range(func(key, value any) bool {
125+
connectionToDB.Delete(key)
126+
return true
127+
})
128+
}

database/orm/orm.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/goravel/framework/contracts/database"
1313
contractsorm "github.com/goravel/framework/contracts/database/orm"
1414
"github.com/goravel/framework/contracts/log"
15+
"github.com/goravel/framework/database/driver"
1516
"github.com/goravel/framework/database/factory"
1617
"github.com/goravel/framework/database/gorm"
1718
)
@@ -140,8 +141,11 @@ func (r *Orm) SetQuery(query contractsorm.Query) {
140141
r.query = query
141142
}
142143

144+
// TODO: The fresh logic needs to be optimized, it's a bit unclear now.
145+
// https://github.com/goravel/goravel/issues/848
143146
func (r *Orm) Fresh() {
144147
r.fresh(binding.Orm)
148+
driver.ResetConnections()
145149
}
146150

147151
func (r *Orm) Transaction(txFunc func(tx contractsorm.Query) error) (err error) {

0 commit comments

Comments
 (0)