8
8
import java .util .HashMap ;
9
9
import java .util .Map ;
10
10
import java .util .Map .Entry ;
11
+ import java .util .concurrent .atomic .AtomicReference ;
11
12
12
13
/**
13
14
* Converts a String map entity property to a byte array database value using FlexBuffers.
14
15
*/
15
16
public class StringMapConverter implements PropertyConverter <Map <String , String >, byte []> {
17
+
18
+ private static final AtomicReference <FlexBuffersBuilder > cachedBuilder = new AtomicReference <>();
19
+
16
20
@ Override
17
21
public byte [] convertToDatabaseValue (Map <String , String > map ) {
18
22
if (map == null ) return null ;
19
23
20
- FlexBuffersBuilder builder = new FlexBuffersBuilder (
21
- new ArrayReadWriteBuf (512 ),
22
- FlexBuffersBuilder .BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
23
- );
24
+ FlexBuffersBuilder builder = cachedBuilder .getAndSet (null );
25
+ if (builder == null ) {
26
+ builder = new FlexBuffersBuilder (
27
+ new ArrayReadWriteBuf (512 ),
28
+ FlexBuffersBuilder .BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
29
+ );
30
+ }
24
31
int mapStart = builder .startMap ();
25
32
26
33
for (Entry <String , String > entry : map .entrySet ()) {
@@ -35,6 +42,13 @@ public byte[] convertToDatabaseValue(Map<String, String> map) {
35
42
36
43
byte [] out = new byte [buffer .limit ()];
37
44
buffer .get (out );
45
+
46
+ // Cache if builder does not consume too much memory
47
+ if (buffer .limit () <= 256 * 1024 ) {
48
+ builder .clear ();
49
+ cachedBuilder .getAndSet (builder );
50
+ }
51
+
38
52
return out ;
39
53
}
40
54
0 commit comments