32
32
* @author 廖涵 [in355hz@gmail.com]
33
33
*/
34
34
public class SystemInterpreter implements Interpreter {
35
-
35
+
36
36
private ReplacementInterpreter replacementInterpreter = new ReplacementInterpreter ();
37
37
private PreparestatmentInterpreter preparestatmentInterpreter = new PreparestatmentInterpreter ();
38
38
@@ -54,14 +54,24 @@ static class ReplacementInterpreter implements Interpreter {
54
54
55
55
final Pattern PATTERN = Pattern .compile ("\\ {([a-zA-Z0-9_\\ .\\ :]+)\\ }|##\\ ((.+)\\ )" );
56
56
57
+
58
+ final ThreadLocal <StringBuilder > stringBuilderPool = new ThreadLocal <StringBuilder >(){
59
+ @ Override
60
+ public StringBuilder initialValue () {
61
+ return new StringBuilder ();
62
+ };
63
+
64
+ };
65
+
57
66
@ Override
58
67
public void interpret (StatementRuntime runtime ) {// ##(:xxx)
68
+ StringBuilder sqlResult = stringBuilderPool .get ();
69
+ sqlResult .setLength (0 );
59
70
String sql = runtime .getSQL ();
60
- StringBuilder sb = new StringBuilder (sql .length () + 200 );
61
71
Matcher matcher = PATTERN .matcher (sql );
62
72
int start = 0 ;
63
73
while (matcher .find (start )) {
64
- sb .append (sql .substring (start , matcher .start ()));
74
+ sqlResult .append (sql .substring (start , matcher .start ()));
65
75
String group = matcher .group ();
66
76
String key = null ;
67
77
if (group .startsWith ("{" )) {
@@ -95,29 +105,39 @@ public void interpret(StatementRuntime runtime) {// ##(:xxx)
95
105
}
96
106
// replace it
97
107
if (value != null ) {
98
- sb .append (value );
108
+ sqlResult .append (value );
99
109
} else {
100
- sb .append (group );
110
+ sqlResult .append (group );
101
111
}
102
112
start = matcher .end ();
103
113
}
104
- sb .append (sql .substring (start ));
114
+ sqlResult .append (sql .substring (start ));
105
115
106
- runtime .setSQL (sb .toString ());
116
+ runtime .setSQL (sqlResult .toString ());
107
117
108
118
}
109
119
}
110
120
111
121
// 动态参数
112
122
static class PreparestatmentInterpreter implements Interpreter {
113
123
124
+
125
+ static final ThreadLocal <ExqlContextImpl > exqlContextPool = new ThreadLocal <ExqlContextImpl >(){
126
+ @ Override
127
+ public ExqlContextImpl initialValue () {
128
+ return new ExqlContextImpl ();
129
+ };
130
+
131
+ };
132
+
114
133
@ Override
115
134
public void interpret (StatementRuntime runtime ) {
116
135
// 转换语句中的表达式
117
- ExqlPattern pattern = ExqlPatternImpl . compile ( runtime . getSQL () );
118
- ExqlContextImpl context = new ExqlContextImpl ( runtime . getSQL (). length () + 32 );
136
+ ExqlContextImpl context = exqlContextPool . get ( );
137
+ context . clear ( );
119
138
120
139
try {
140
+ ExqlPattern pattern = ExqlPatternImpl .compile (runtime .getSQL ());
121
141
Map <String , Object > constants = runtime .getMetaData ().getDAOMetaData ()
122
142
.getConstants ();
123
143
pattern .execute (context , runtime .getParameters (), constants );
@@ -192,7 +212,7 @@ public static void main0(String[] args) throws Exception {
192
212
+ "(`id`,`uid`,`favable_id`,`addtime`,`ranking`) " //
193
213
+ "values (:1,:2,now(),0)" ;
194
214
ExqlPattern pattern = ExqlPatternImpl .compile (sql );
195
- ExqlContextImpl context = new ExqlContextImpl (sql . length () + 32 );
215
+ ExqlContextImpl context = new ExqlContextImpl ();
196
216
197
217
Map <String , Object > parametersAsMap = new HashMap <String , Object >();
198
218
parametersAsMap .put (":1" , "p1" );
0 commit comments