Skip to content

Commit

Permalink
优化架构性能
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxiujia committed Feb 16, 2019
1 parent 8ebaeef commit e05a5df
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 38 deletions.
2 changes: 2 additions & 0 deletions DataSourceRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ type DataSourceRouter interface {
Router(mapperName string) (Session, error)
//设置sql.DB,该方法会被GoMybatis框架内调用
SetDB(url string, db *sql.DB)

Name() string
}
55 changes: 55 additions & 0 deletions ExpressionEngineExpr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,61 @@ func TestExpressionEngineExpr_Nil_Null(t *testing.T) {
fmt.Println(result)
}

func BenchmarkExpressionEngineExprNil_Null(b *testing.B) {
b.StopTimer()
var engine = ExpressionEngineExpr{}
var evaluateParameters = make(map[string]interface{})
//var p=1
evaluateParameters["startTime"] = nil
var nmap = makeArgInterfaceMap(evaluateParameters)
evalExpression, err := engine.Lexer("startTime == nil")
if err != nil {
b.Fatal(err)
}
b.StartTimer()
for i:=0;i<b.N ;i++ {
_, err := engine.Eval(evalExpression, nmap, 0)
if err != nil {
b.Fatal(err)
}
}
}

func BenchmarkExpressionEngineExprNilTakeValue(b *testing.B) {
b.StopTimer()
var engine = ExpressionEngineExpr{}
var evaluateParameters = make(map[string]interface{})
var startTime * string
var startTimeV * string

var s="12345"
startTimeV=&s
evaluateParameters["startTime"] = startTime
evaluateParameters["startTimeValue"] = startTimeV
var nmap = makeArgInterfaceMap(evaluateParameters)
evalExpression, err := engine.Lexer("startTime == nil")
if err != nil {
b.Fatal(err)
}
takeValueExpression, err := engine.Lexer("startTimeValue")
if err != nil {
b.Fatal(err)
}
b.StartTimer()
for i:=0;i<b.N ;i++ {
for k:=0;k<8;k++{
_, err := engine.Eval(evalExpression, nmap, 0)
if err != nil {
b.Fatal(err)
}
_, err=engine.Eval(takeValueExpression,nmap,0)
if err != nil {
b.Fatal(err)
}
}
}
}

func makeArgInterfaceMap(args map[string]interface{}) map[string]interface{} {
var m = make(map[string]interface{})
if args != nil {
Expand Down
1 change: 1 addition & 0 deletions ExpressionEngineLexerCache.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ package GoMybatis
type ExpressionEngineLexerCache interface {
Set(expression string, lexer interface{}) error
Get(expression string) (interface{}, error)
Name() string
}
3 changes: 3 additions & 0 deletions ExpressionEngineLexerMapCache.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,6 @@ func (it *ExpressionEngineLexerMapCache) Get(expression string) (interface{}, er
result = it.mapCache[expression]
return result, nil
}
func (it *ExpressionEngineLexerMapCache) Name() string {
return "ExpressionEngineLexerMapCache"
}
23 changes: 15 additions & 8 deletions ExpressionEngineProxy.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package GoMybatis

import "github.com/zhuxiujia/GoMybatis/utils"
import (
"github.com/zhuxiujia/GoMybatis/utils"
)

type ExpressionEngineProxy struct {
expressionEngineLexerCache ExpressionEngineLexerCache //lexer缓存接口,默认使用ExpressionEngineLexerMapCache
Expand All @@ -10,10 +12,15 @@ type ExpressionEngineProxy struct {

//engine :表达式引擎,useLexerCache:是否缓存Lexer表达式编译结果
func (ExpressionEngineProxy) New(engine ExpressionEngine, useLexerCache bool) ExpressionEngineProxy {
return ExpressionEngineProxy{
var it = ExpressionEngineProxy{
expressionEngine: engine,
lexerCacheable: useLexerCache,
}
if it.expressionEngineLexerCache == nil {
var cache = ExpressionEngineLexerMapCache{}.New()
it.SetLexerCache(&cache)
}
return it
}

//引擎名称
Expand All @@ -31,7 +38,11 @@ func (it *ExpressionEngineProxy) Lexer(expression string) (interface{}, error) {
if it.expressionEngine == nil {
return nil, utils.NewError("ExpressionEngineProxy", "ExpressionEngineProxy not init for ExpressionEngineProxy{}.New(...)")
}
if it.LexerCache() != nil && it.lexerCacheable {

if it.lexerCacheable {
if it.LexerCache() == nil {
panic(utils.NewError("ExpressionEngineProxy", "lexerCacheable =true! lexerCache can not be nil! you must set the cache!"))
}
//如果 提供缓存,则使用缓存
cacheResult, cacheErr := it.LexerCache().Get(expression)
if cacheErr != nil {
Expand All @@ -42,7 +53,7 @@ func (it *ExpressionEngineProxy) Lexer(expression string) (interface{}, error) {
}
}
var result, err = it.expressionEngine.Lexer(expression)
if it.LexerCache() != nil && it.lexerCacheable {
if it.lexerCacheable && err == nil {
//如果 提供缓存,则使用缓存
it.LexerCache().Set(expression, result)
}
Expand All @@ -60,10 +71,6 @@ func (it *ExpressionEngineProxy) Eval(lexerResult interface{}, arg interface{},
}

func (it *ExpressionEngineProxy) LexerCache() ExpressionEngineLexerCache {
if it.expressionEngineLexerCache == nil {
var cache = ExpressionEngineLexerMapCache{}.New()
it.expressionEngineLexerCache = &cache
}
return it.expressionEngineLexerCache
}

Expand Down
4 changes: 4 additions & 0 deletions GoMybatisDataSourceRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,7 @@ func (it *GoMybatisDataSourceRouter) Router(mapperName string) (Session, error)
})
return session, nil
}

func (it *GoMybatisDataSourceRouter) Name() string {
return "GoMybatisDataSourceRouter"
}
58 changes: 31 additions & 27 deletions GoMybatisEngine.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,37 @@ func (it GoMybatisEngine) New() GoMybatisEngine {
it.dbMap = make(map[string]*sql.DB)
it.logEnable = true
it.isInit = true

if it.dataSourceRouter == nil {
var newRouter = GoMybatisDataSourceRouter{}.New(nil)
it.SetDataSourceRouter(&newRouter)
}

if it.logEnable == true && it.log == nil {
it.log = &LogStandard{}
}
if it.sqlArgTypeConvert == nil {
it.sqlArgTypeConvert = GoMybatisSqlArgTypeConvert{}
}
if it.expressionEngine == nil {
it.expressionEngine = &ExpressionEngineExpr{}
}
if it.sqlResultDecoder == nil {
it.sqlResultDecoder = GoMybatisSqlResultDecoder{}
}
if it.templeteDecoder == nil {
it.SetTempleteDecoder(&GoMybatisTempleteDecoder{})
}

if it.sqlBuilder == nil {
var expressionEngineProxy = ExpressionEngineProxy{}.New(it.ExpressionEngine(), true)
it.sqlBuilder = GoMybatisSqlBuilder{}.New(it.SqlArgTypeConvert(), expressionEngineProxy, it.Log(), it.LogEnable())
}

if it.sessionFactory == nil {
var factory = SessionFactory{}.New(&it)
it.sessionFactory = &factory
}
return it
}

Expand All @@ -49,10 +80,6 @@ func (it *GoMybatisEngine) Name() string {

func (it *GoMybatisEngine) DataSourceRouter() DataSourceRouter {
it.initCheck()
if it.dataSourceRouter == nil {
var newRouter = GoMybatisDataSourceRouter{}.New(nil)
it.SetDataSourceRouter(&newRouter)
}
return it.dataSourceRouter
}
func (it *GoMybatisEngine) SetDataSourceRouter(router DataSourceRouter) {
Expand Down Expand Up @@ -89,9 +116,6 @@ func (it *GoMybatisEngine) SetLogEnable(enable bool) {
//获取日志实现类
func (it *GoMybatisEngine) Log() Log {
it.initCheck()
if it.logEnable == true && it.log == nil {
it.log = &LogStandard{}
}
return it.log
}

Expand All @@ -104,10 +128,6 @@ func (it *GoMybatisEngine) SetLog(log Log) {
//session工厂
func (it *GoMybatisEngine) SessionFactory() *SessionFactory {
it.initCheck()
if it.sessionFactory == nil {
var factory = SessionFactory{}.New(it)
it.sessionFactory = &factory
}
return it.sessionFactory
}

Expand All @@ -120,9 +140,6 @@ func (it *GoMybatisEngine) SetSessionFactory(factory *SessionFactory) {
//sql类型转换器
func (it *GoMybatisEngine) SqlArgTypeConvert() SqlArgTypeConvert {
it.initCheck()
if it.sqlArgTypeConvert == nil {
it.sqlArgTypeConvert = GoMybatisSqlArgTypeConvert{}
}
return it.sqlArgTypeConvert
}

Expand All @@ -135,9 +152,6 @@ func (it *GoMybatisEngine) SetSqlArgTypeConvert(convert SqlArgTypeConvert) {
//表达式执行引擎
func (it *GoMybatisEngine) ExpressionEngine() ExpressionEngine {
it.initCheck()
if it.expressionEngine == nil {
it.expressionEngine = &ExpressionEngineExpr{}
}
return it.expressionEngine
}

Expand All @@ -150,10 +164,6 @@ func (it *GoMybatisEngine) SetExpressionEngine(engine ExpressionEngine) {
//sql构建器
func (it *GoMybatisEngine) SqlBuilder() SqlBuilder {
it.initCheck()
if it.sqlBuilder == nil {
var expressionEngineProxy = ExpressionEngineProxy{}.New(it.ExpressionEngine(), true)
it.sqlBuilder = GoMybatisSqlBuilder{}.New(it.SqlArgTypeConvert(), expressionEngineProxy, it.Log(), it.LogEnable())
}
return it.sqlBuilder
}

Expand All @@ -166,9 +176,6 @@ func (it *GoMybatisEngine) SetSqlBuilder(builder SqlBuilder) {
//sql查询结果解析器
func (it *GoMybatisEngine) SqlResultDecoder() SqlResultDecoder {
it.initCheck()
if it.sqlResultDecoder == nil {
it.sqlResultDecoder = GoMybatisSqlResultDecoder{}
}
return it.sqlResultDecoder
}

Expand All @@ -192,9 +199,6 @@ func (it *GoMybatisEngine) Open(driverName, dataSourceName string) error {

//模板解析器
func (it *GoMybatisEngine) TempleteDecoder() TempleteDecoder {
if it.templeteDecoder == nil {
it.SetTempleteDecoder(&GoMybatisTempleteDecoder{})
}
return it.templeteDecoder
}

Expand Down
2 changes: 0 additions & 2 deletions GoMybatisEngine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,6 @@ func Test_Transcation(t *testing.T) {
//初始化mapper文件
var exampleActivityMapperImpl = InitMapperByLocalSession()
//使用mapper

//开始TPS测试
var results, err = exampleActivityMapperImpl.SelectByCondition(&session, nil, nil,nil,nil,nil)
if err != nil {
t.Fatal(err)
Expand Down
2 changes: 1 addition & 1 deletion GoMybatisTempleteDecoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func init() {
if err != nil {
panic(err)
}
engine.SetLogEnable(true)
engine.SetLogEnable(false)
engine.WriteMapperPtr(&exampleActivityMapper, bytes)
}

Expand Down

0 comments on commit e05a5df

Please sign in to comment.