Skip to content

Commit 737cd6f

Browse files
committed
性能优化:解析器StringBuilder复用
1 parent 97b7454 commit 737cd6f

File tree

6 files changed

+47
-20
lines changed

6 files changed

+47
-20
lines changed

paoding-rose-jade/src/main/java/net/paoding/rose/jade/statement/SystemInterpreter.java

+30-10
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
* @author 廖涵 [in355hz@gmail.com]
3333
*/
3434
public class SystemInterpreter implements Interpreter {
35-
35+
3636
private ReplacementInterpreter replacementInterpreter = new ReplacementInterpreter();
3737
private PreparestatmentInterpreter preparestatmentInterpreter = new PreparestatmentInterpreter();
3838

@@ -54,14 +54,24 @@ static class ReplacementInterpreter implements Interpreter {
5454

5555
final Pattern PATTERN = Pattern.compile("\\{([a-zA-Z0-9_\\.\\:]+)\\}|##\\((.+)\\)");
5656

57+
58+
final ThreadLocal<StringBuilder> stringBuilderPool = new ThreadLocal<StringBuilder>(){
59+
@Override
60+
public StringBuilder initialValue() {
61+
return new StringBuilder();
62+
};
63+
64+
};
65+
5766
@Override
5867
public void interpret(StatementRuntime runtime) {// ##(:xxx)
68+
StringBuilder sqlResult = stringBuilderPool.get();
69+
sqlResult.setLength(0);
5970
String sql = runtime.getSQL();
60-
StringBuilder sb = new StringBuilder(sql.length() + 200);
6171
Matcher matcher = PATTERN.matcher(sql);
6272
int start = 0;
6373
while (matcher.find(start)) {
64-
sb.append(sql.substring(start, matcher.start()));
74+
sqlResult.append(sql.substring(start, matcher.start()));
6575
String group = matcher.group();
6676
String key = null;
6777
if (group.startsWith("{")) {
@@ -95,29 +105,39 @@ public void interpret(StatementRuntime runtime) {// ##(:xxx)
95105
}
96106
// replace it
97107
if (value != null) {
98-
sb.append(value);
108+
sqlResult.append(value);
99109
} else {
100-
sb.append(group);
110+
sqlResult.append(group);
101111
}
102112
start = matcher.end();
103113
}
104-
sb.append(sql.substring(start));
114+
sqlResult.append(sql.substring(start));
105115

106-
runtime.setSQL(sb.toString());
116+
runtime.setSQL(sqlResult.toString());
107117

108118
}
109119
}
110120

111121
// 动态参数
112122
static class PreparestatmentInterpreter implements Interpreter {
113123

124+
125+
static final ThreadLocal<ExqlContextImpl> exqlContextPool = new ThreadLocal<ExqlContextImpl>(){
126+
@Override
127+
public ExqlContextImpl initialValue() {
128+
return new ExqlContextImpl();
129+
};
130+
131+
};
132+
114133
@Override
115134
public void interpret(StatementRuntime runtime) {
116135
// 转换语句中的表达式
117-
ExqlPattern pattern = ExqlPatternImpl.compile(runtime.getSQL());
118-
ExqlContextImpl context = new ExqlContextImpl(runtime.getSQL().length() + 32);
136+
ExqlContextImpl context = exqlContextPool.get();
137+
context.clear();
119138

120139
try {
140+
ExqlPattern pattern = ExqlPatternImpl.compile(runtime.getSQL());
121141
Map<String, Object> constants = runtime.getMetaData().getDAOMetaData()
122142
.getConstants();
123143
pattern.execute(context, runtime.getParameters(), constants);
@@ -192,7 +212,7 @@ public static void main0(String[] args) throws Exception {
192212
+ "(`id`,`uid`,`favable_id`,`addtime`,`ranking`) "//
193213
+ "values (:1,:2,now(),0)";
194214
ExqlPattern pattern = ExqlPatternImpl.compile(sql);
195-
ExqlContextImpl context = new ExqlContextImpl(sql.length() + 32);
215+
ExqlContextImpl context = new ExqlContextImpl();
196216

197217
Map<String, Object> parametersAsMap = new HashMap<String, Object>();
198218
parametersAsMap.put(":1", "p1");

paoding-rose-jade/src/main/java/net/paoding/rose/jade/statement/expression/impl/ExqlCompiler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ public static void main(String... args) throws Exception {
481481
// 编译下列语句
482482
ExqlPattern pattern = new ExqlCompiler(string).compile();
483483

484-
ExqlContext context = new ExqlContextImpl(string.length());
484+
ExqlContext context = new ExqlContextImpl();
485485

486486
HashMap<String, Object> map = new HashMap<String, Object>();
487487

paoding-rose-jade/src/main/java/net/paoding/rose/jade/statement/expression/impl/ExqlContextImpl.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,22 @@ public class ExqlContextImpl implements ExqlContext {
2626
protected final ArrayList<Object> args = new ArrayList<Object>();
2727

2828
// 输出缓冲区
29-
protected final StringBuilder builder;
29+
protected final StringBuilder builder = new StringBuilder(256);
3030

3131
/**
3232
* 构造上下文对象。
3333
*
3434
* @param capacity - 缓存的容量
3535
*/
36-
public ExqlContextImpl(int capacity) {
37-
builder = new StringBuilder(capacity);
36+
public ExqlContextImpl() {
37+
}
38+
39+
/**
40+
* 清理以便下次使用
41+
*/
42+
public void clear() {
43+
this.args.clear();
44+
this.builder.setLength(0);
3845
}
3946

4047
@Override
@@ -144,7 +151,7 @@ private void fillCollection(Collection<?> collection) {
144151
// 进行简单测试
145152
public static void main(String... args) throws Exception {
146153

147-
ExqlContext context = new ExqlContextImpl(1024);
154+
ExqlContext context = new ExqlContextImpl();
148155

149156
context.fillText("WHERE uid = ");
150157
context.fillValue(102);

paoding-rose-jade/src/main/java/net/paoding/rose/jade/statement/expression/impl/ExqlPatternImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public static void main(String... args) throws Exception {
114114
+ "#for(variant in :expr5.bytes) { AND c = :variant}" // NL
115115
+ " GROUP BY #!(:expr1) ASC {expr3}");
116116

117-
ExqlContext context = new ExqlContextImpl(1024);
117+
ExqlContext context = new ExqlContextImpl();
118118

119119
HashMap<String, Object> map = new HashMap<String, Object>();
120120

paoding-rose-jade/src/test/java/net/paoding/rose/jade/exql/ExqlContextTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public void testExqlContext() {
1313

1414
Date current = new Date();
1515

16-
ExqlContext context = new ExqlContextImpl(1024);
16+
ExqlContext context = new ExqlContextImpl();
1717

1818
context.fillText("WHERE uid = ");
1919
context.fillValue(102);

paoding-rose-jade/src/test/java/net/paoding/rose/jade/exql/ExqlPatternTests.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void testPattern() throws Exception {
3939
expr5.getBytes()[4], expr1 };
4040

4141

42-
ExqlContext context = new ExqlContextImpl(1024);
42+
ExqlContext context = new ExqlContextImpl();
4343

4444
HashMap<String, Object> map = new HashMap<String, Object>();
4545

@@ -77,7 +77,7 @@ public void testConstant() throws Exception {
7777
+ "#for(variant in $expr5.bytes) { AND c = :variant}" // NL
7878
+ " GROUP BY $expr1 ASC");
7979

80-
ExqlContext context = new ExqlContextImpl(1024);
80+
ExqlContext context = new ExqlContextImpl();
8181

8282
HashMap<String, Object> map = new HashMap<String, Object>();
8383

@@ -118,7 +118,7 @@ public void testComplex() throws Exception {
118118
+ "#for(variant in $expr5.bytes) { AND c = :variant}" // NL
119119
+ " GROUP BY $expr1 ASC");
120120

121-
ExqlContext context = new ExqlContextImpl(1024);
121+
ExqlContext context = new ExqlContextImpl();
122122

123123
HashMap<String, Object> map = new HashMap<String, Object>();
124124

0 commit comments

Comments
 (0)