|
@@ -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);
|
|
|
+ }
|
|
|
}
|