diff --git a/engine.go b/engine.go index 7639310d..af910562 100644 --- a/engine.go +++ b/engine.go @@ -27,7 +27,7 @@ type Engine struct { dialect core.Dialect Tables map[reflect.Type]*core.Table - mutex *sync.Mutex + mutex *sync.RWMutex ShowSQL bool ShowErr bool ShowDebug bool @@ -388,12 +388,14 @@ func (engine *Engine) Having(conditions string) *Session { } func (engine *Engine) autoMapType(t reflect.Type) *core.Table { - engine.mutex.Lock() - defer engine.mutex.Unlock() + engine.mutex.RLock() table, ok := engine.Tables[t] + engine.mutex.RUnlock() if !ok { table = engine.mapType(t) + engine.mutex.Lock() engine.Tables[t] = table + engine.mutex.Unlock() } return table } diff --git a/xorm.go b/xorm.go index a1f6a5d8..40653eea 100644 --- a/xorm.go +++ b/xorm.go @@ -50,12 +50,12 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) { DataSourceName: dataSourceName, dialect: dialect, tableCachers: make(map[reflect.Type]core.Cacher)} - engine.SetMapper(core.SnakeMapper{}) + engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper))) engine.Filters = dialect.Filters() engine.Tables = make(map[reflect.Type]*core.Table) - engine.mutex = &sync.Mutex{} + engine.mutex = &sync.RWMutex{} engine.TagIdentifier = "xorm" engine.Logger = os.Stdout