cache system improved

This commit is contained in:
Lunny Xiao 2013-09-21 00:06:41 +08:00
parent 365812143b
commit 768b5bacdb
1 changed files with 31 additions and 32 deletions

View File

@ -422,29 +422,32 @@ func (session *Session) cacheGet(bean interface{}, sql string, args ...interface
fmt.Printf("-----Cached SQL: %v.\n", newsql) fmt.Printf("-----Cached SQL: %v.\n", newsql)
} }
structValue := reflect.Indirect(reflect.ValueOf(bean))
//fmt.Println("xxxxxxx", ids) //fmt.Println("xxxxxxx", ids)
if len(ids) > 0 { if len(ids) > 0 {
//structValue := reflect.Indirect(reflect.ValueOf(bean))
structValue := reflect.Indirect(reflect.ValueOf(bean))
id := ids[0] id := ids[0]
tableName := session.Statement.TableName() tableName := session.Statement.TableName()
bean = GetCacheId(cacher, tableName, id) cacheBean := GetCacheId(cacher, tableName, id)
if bean == nil { if cacheBean == nil {
fmt.Printf("----Object Id %v no cached.\n", id) fmt.Printf("----Object Id %v no cached.\n", id)
newSession := session.Engine.NewSession() newSession := session.Engine.NewSession()
defer newSession.Close() defer newSession.Close()
bean = reflect.New(structValue.Type()).Interface() cacheBean = reflect.New(structValue.Type()).Interface()
has, err = newSession.Id(id).NoCache().Get(bean) has, err = newSession.Id(id).NoCache().Get(cacheBean)
if err != nil { if err != nil {
return has, err return has, err
} }
//fmt.Println(bean) //fmt.Println(bean)
PutCacheId(cacher, tableName, id, bean) PutCacheId(cacher, tableName, id, cacheBean)
} else { } else {
fmt.Printf("-----Cached Object: %v\n", bean) fmt.Printf("-----Cached Object: %v\n", cacheBean)
has = true has = true
} }
//fmt.Println(cacheBean, reflect.ValueOf(cacheBean))
//fmt.Println(structValue.Addr())
structValue.Set(reflect.Indirect(reflect.ValueOf(cacheBean)))
structValue.Set(reflect.ValueOf(bean).Elem())
return has, nil return has, nil
} }
return false, nil return false, nil
@ -474,7 +477,7 @@ func (session *Session) cacheFind(t reflect.Type, sql string, rowsSlicePtr inter
return err return err
} }
// 查询数目太大,采用缓存将不是一个很好的方式。 // 查询数目太大,采用缓存将不是一个很好的方式。
if len(resultsSlice) > 20 { if len(resultsSlice) > 100 {
return ErrCacheFailed return ErrCacheFailed
} }
ids = make([]int64, 0) ids = make([]int64, 0)
@ -506,30 +509,20 @@ func (session *Session) cacheFind(t reflect.Type, sql string, rowsSlicePtr inter
var idxes []int = make([]int, 0) var idxes []int = make([]int, 0)
var ides []interface{} = make([]interface{}, 0) var ides []interface{} = make([]interface{}, 0)
var temps []interface{} = make([]interface{}, len(ids)) var temps []interface{} = make([]interface{}, len(ids))
for idx, id := range ids {
tableName := session.Statement.TableName() tableName := session.Statement.TableName()
for idx, id := range ids {
bean := GetCacheId(cacher, tableName, id) bean := GetCacheId(cacher, tableName, id)
if bean == nil { if bean == nil {
fmt.Printf("----Object Id %v no cached.\n", id) fmt.Printf("----Object Id %v no cached.\n", id)
idxes = append(idxes, idx) idxes = append(idxes, idx)
ides = append(ides, id) ides = append(ides, id)
/*newSession := session.Engine.NewSession()
defer newSession.Close()
bean = reflect.New(t).Interface()
_, err = newSession.Id(id).In(, ...).NoCache().Get(bean)
if err != nil {
return err
}
PutCacheId(cacher, tableName, id, bean)*/
} else { } else {
fmt.Printf("-----Cached Object: %v\n", bean) fmt.Printf("-----Cached Object: %v\n", bean)
temps[idx] = bean temps[idx] = bean
} }
//sliceValue.Set(reflect.Append(sliceValue, reflect.ValueOf(bean).Elem()))
} }
if len(ides) > 0 {
newSession := session.Engine.NewSession() newSession := session.Engine.NewSession()
defer newSession.Close() defer newSession.Close()
@ -541,10 +534,16 @@ func (session *Session) cacheFind(t reflect.Type, sql string, rowsSlicePtr inter
vs := reflect.Indirect(reflect.ValueOf(beans)) vs := reflect.Indirect(reflect.ValueOf(beans))
for i := 0; i < vs.Len(); i++ { for i := 0; i < vs.Len(); i++ {
temps[idxes[i]] = vs.Index(i).Interface() bean := vs.Index(i).Addr().Interface()
temps[idxes[i]] = bean
PutCacheId(cacher, tableName, ides[i].(int64), bean)
}
} }
//sliceValue.SetPointer(x) for j := 0; j < len(temps); j++ {
bean := temps[j]
sliceValue.Set(reflect.Append(sliceValue, reflect.Indirect(reflect.ValueOf(bean))))
}
return nil return nil
} }