File tree Expand file tree Collapse file tree 1 file changed +17
-4
lines changed
objectbox-java/src/main/java/io/objectbox/converter Expand file tree Collapse file tree 1 file changed +17
-4
lines changed Original file line number Diff line number Diff line change 11
11
import java .util .List ;
12
12
import java .util .Map ;
13
13
import java .util .Map .Entry ;
14
+ import java .util .concurrent .atomic .AtomicReference ;
14
15
15
16
/**
16
17
* Converts between {@link Map} properties and byte arrays using FlexBuffers.
23
24
*/
24
25
public abstract class FlexMapConverter implements PropertyConverter <Map <Object , Object >, byte []> {
25
26
27
+ private static final AtomicReference <FlexBuffersBuilder > cachedBuilder = new AtomicReference <>();
28
+
26
29
@ Override
27
30
public byte [] convertToDatabaseValue (Map <Object , Object > map ) {
28
31
if (map == null ) return null ;
29
32
30
- FlexBuffersBuilder builder = new FlexBuffersBuilder (
31
- new ArrayReadWriteBuf (512 ),
32
- FlexBuffersBuilder .BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
33
- );
33
+ FlexBuffersBuilder builder = cachedBuilder .getAndSet (null );
34
+ if (builder == null ) {
35
+ builder = new FlexBuffersBuilder (
36
+ new ArrayReadWriteBuf (512 ),
37
+ FlexBuffersBuilder .BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
38
+ );
39
+ }
34
40
35
41
addMap (builder , null , map );
36
42
37
43
ByteBuffer buffer = builder .finish ();
38
44
39
45
byte [] out = new byte [buffer .limit ()];
40
46
buffer .get (out );
47
+
48
+ // Cache if builder does not consume too much memory
49
+ if (buffer .limit () <= 256 * 1024 ) {
50
+ builder .clear ();
51
+ cachedBuilder .getAndSet (builder );
52
+ }
53
+
41
54
return out ;
42
55
}
43
56
You can’t perform that action at this time.
0 commit comments