diff --git a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java index 41a77d7a..79335e11 100644 --- a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java +++ b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java @@ -4,6 +4,8 @@ import java.io.Serializable; import java.nio.charset.Charset; import java.sql.Timestamp; import java.sql.Types; +import java.time.ZoneId; +import java.time.zone.ZoneRules; import java.util.BitSet; import org.apache.commons.logging.Log; @@ -24,7 +26,11 @@ import com.taobao.tddl.dbsync.binlog.LogEvent; */ public final class RowsLogBuffer { - protected static final Log logger = LogFactory.getLog(RowsLogBuffer.class); + protected static final Log logger = LogFactory.getLog(RowsLogBuffer.class); + public static final Long[] longCache = new Long[1024 * 128]; + public static final int longCacheLimit = longCache.length + 127; + public static final Integer[] integerCache = new Integer[1024 * 128]; + public static final int integerCacheLimit = longCache.length + 127; public static final long DATETIMEF_INT_OFS = 0x8000000000L; public static final long TIMEF_INT_OFS = 0x800000L; @@ -310,7 +316,7 @@ public final class RowsLogBuffer { // XXX: How to check signed / unsigned? // value = unsigned ? Long.valueOf(buffer.getUint32()) : // Integer.valueOf(buffer.getInt32()); - value = Integer.valueOf(buffer.getInt32()); + value = valueOf(buffer.getInt32()); javaType = Types.INTEGER; length = 4; break; @@ -319,7 +325,7 @@ public final class RowsLogBuffer { // XXX: How to check signed / unsigned? // value = Integer.valueOf(unsigned ? buffer.getUint8() : // buffer.getInt8()); - value = Integer.valueOf(buffer.getInt8()); + value = valueOf(buffer.getInt8()); javaType = Types.TINYINT; // java.sql.Types.INTEGER; length = 1; break; @@ -328,7 +334,7 @@ public final class RowsLogBuffer { // XXX: How to check signed / unsigned? // value = Integer.valueOf(unsigned ? buffer.getUint16() : // buffer.getInt16()); - value = Integer.valueOf((short) buffer.getInt16()); + value = valueOf((short) buffer.getInt16()); javaType = Types.SMALLINT; // java.sql.Types.INTEGER; length = 2; break; @@ -337,7 +343,7 @@ public final class RowsLogBuffer { // XXX: How to check signed / unsigned? // value = Integer.valueOf(unsigned ? buffer.getUint24() : // buffer.getInt24()); - value = Integer.valueOf(buffer.getInt24()); + value = valueOf(buffer.getInt24()); javaType = Types.INTEGER; length = 3; break; @@ -346,7 +352,7 @@ public final class RowsLogBuffer { // XXX: How to check signed / unsigned? // value = unsigned ? buffer.getUlong64()) : // Long.valueOf(buffer.getLong64()); - value = Long.valueOf(buffer.getLong64()); + value = valueOf(buffer.getLong64()); javaType = Types.BIGINT; // Types.INTEGER; length = 8; break; @@ -871,7 +877,7 @@ public final class RowsLogBuffer { } // logger.warn("MYSQL_TYPE_ENUM : This enumeration value is " // + "only used internally and cannot exist in a binlog!"); - value = Integer.valueOf(int32); + value = valueOf(int32); javaType = Types.INTEGER; length = len; break; @@ -1212,4 +1218,38 @@ public final class RowsLogBuffer { builder.append('0').append(digits[d]); } } + + public static Long valueOf(long value) { + if (value >= -128 & value <= 127) { + // if (l >= -128 && l <= 127) { + return Long.valueOf(value); + } + if (value > 127 && value < longCacheLimit) { + int cacheIndex = (int) value - 127; + Long cacheValue = longCache[cacheIndex]; + if (cacheValue == null) { + cacheValue = new Long(value); + longCache[cacheIndex] = cacheValue; + } + return cacheValue; + } + return new Long(value); + } + + public static Integer valueOf(int value) { + if (value >= -128 & value <= 127) { + // if (l >= -128 && l <= 127) { + return Integer.valueOf(value); + } + if (value > 127 && value < integerCacheLimit) { + int cacheIndex = (int) value - 127; + Integer cacheValue = integerCache[cacheIndex]; + if (cacheValue == null) { + cacheValue = new Integer(value); + integerCache[cacheIndex] = cacheValue; + } + return cacheValue; + } + return new Integer(value); + } }