mirror of https://github.com/apache/openjpa.git
OPENJPA-359 Improve Timestamp resolution for use by versioning.
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@631028 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c3e2f01204
commit
c4af04617e
|
@ -49,6 +49,7 @@ import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedBlobFieldStrategy;
|
||||||
import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedByteArrayFieldStrategy;
|
import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedByteArrayFieldStrategy;
|
||||||
import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedCharArrayFieldStrategy;
|
import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedCharArrayFieldStrategy;
|
||||||
import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedClobFieldStrategy;
|
import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedClobFieldStrategy;
|
||||||
|
import org.apache.openjpa.jdbc.meta.strats.NanoPrecisionTimestampVersionStrategy;
|
||||||
import org.apache.openjpa.jdbc.meta.strats.NoneClassStrategy;
|
import org.apache.openjpa.jdbc.meta.strats.NoneClassStrategy;
|
||||||
import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
|
import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
|
||||||
import org.apache.openjpa.jdbc.meta.strats.NoneFieldStrategy;
|
import org.apache.openjpa.jdbc.meta.strats.NoneFieldStrategy;
|
||||||
|
@ -80,6 +81,7 @@ import org.apache.openjpa.jdbc.sql.JoinSyntaxes;
|
||||||
import org.apache.openjpa.lib.conf.Configurable;
|
import org.apache.openjpa.lib.conf.Configurable;
|
||||||
import org.apache.openjpa.lib.conf.Configurations;
|
import org.apache.openjpa.lib.conf.Configurations;
|
||||||
import org.apache.openjpa.lib.util.J2DoPrivHelper;
|
import org.apache.openjpa.lib.util.J2DoPrivHelper;
|
||||||
|
import org.apache.openjpa.lib.util.JavaVersions;
|
||||||
import org.apache.openjpa.lib.util.Localizer;
|
import org.apache.openjpa.lib.util.Localizer;
|
||||||
import org.apache.openjpa.meta.ClassMetaData;
|
import org.apache.openjpa.meta.ClassMetaData;
|
||||||
import org.apache.openjpa.meta.FieldMetaData;
|
import org.apache.openjpa.meta.FieldMetaData;
|
||||||
|
@ -618,6 +620,8 @@ public class MappingRepository
|
||||||
strat = NumberVersionStrategy.class;
|
strat = NumberVersionStrategy.class;
|
||||||
else if (TimestampVersionStrategy.ALIAS.equals(name))
|
else if (TimestampVersionStrategy.ALIAS.equals(name))
|
||||||
strat = TimestampVersionStrategy.class;
|
strat = TimestampVersionStrategy.class;
|
||||||
|
else if (NanoPrecisionTimestampVersionStrategy.ALIAS.equals(name))
|
||||||
|
strat = NanoPrecisionTimestampVersionStrategy.class;
|
||||||
else if (StateComparisonVersionStrategy.ALIAS.equals(name))
|
else if (StateComparisonVersionStrategy.ALIAS.equals(name))
|
||||||
strat = StateComparisonVersionStrategy.class;
|
strat = StateComparisonVersionStrategy.class;
|
||||||
|
|
||||||
|
@ -1221,7 +1225,9 @@ public class MappingRepository
|
||||||
switch (vfield.getTypeCode()) {
|
switch (vfield.getTypeCode()) {
|
||||||
case JavaTypes.DATE:
|
case JavaTypes.DATE:
|
||||||
case JavaTypes.CALENDAR:
|
case JavaTypes.CALENDAR:
|
||||||
return new TimestampVersionStrategy();
|
return (JavaVersions.VERSION >= 5)
|
||||||
|
? new NanoPrecisionTimestampVersionStrategy()
|
||||||
|
: new TimestampVersionStrategy();
|
||||||
case JavaTypes.BYTE:
|
case JavaTypes.BYTE:
|
||||||
case JavaTypes.INT:
|
case JavaTypes.INT:
|
||||||
case JavaTypes.LONG:
|
case JavaTypes.LONG:
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.jdbc.meta.strats;
|
||||||
|
|
||||||
|
import org.apache.openjpa.lib.util.TimestampHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses a timestamp for optimistic versioning with nanosecond
|
||||||
|
* precision.
|
||||||
|
*
|
||||||
|
* @author Albert Lee
|
||||||
|
*/
|
||||||
|
public class NanoPrecisionTimestampVersionStrategy
|
||||||
|
extends TimestampVersionStrategy {
|
||||||
|
|
||||||
|
public static final String ALIAS = "nano-timestamp";
|
||||||
|
|
||||||
|
public String getAlias() {
|
||||||
|
return ALIAS;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object nextVersion(Object version) {
|
||||||
|
return TimestampHelper.getNanoPrecisionTimestamp();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.lib.util;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to create java.sql.Timestamp object with nanosecond precision.
|
||||||
|
* This is only available since JDB 5.
|
||||||
|
*
|
||||||
|
* @author Albert Lee
|
||||||
|
*/
|
||||||
|
public final class Timestamp5Helper extends TimestampHelper{
|
||||||
|
|
||||||
|
// number of seconds passed 1970/1/1 00:00:00 GMT.
|
||||||
|
private static long sec0;
|
||||||
|
// fraction of seconds passed 1970/1/1 00:00:00 GMT, offset by
|
||||||
|
// the base System.nanoTime (nano0), in nanosecond unit.
|
||||||
|
private static long nano0;
|
||||||
|
|
||||||
|
static {
|
||||||
|
// initialize base time in second and fraction of second (ns).
|
||||||
|
long curTime = System.currentTimeMillis();
|
||||||
|
sec0 = curTime / MilliMuliplier;
|
||||||
|
nano0 = (curTime % MilliMuliplier) * MicroMuliplier - System.nanoTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This class implements a nanosecond precision Timestamp.
|
||||||
|
*/
|
||||||
|
protected Timestamp getTimestamp() {
|
||||||
|
long nano_delta = nano0 + System.nanoTime();
|
||||||
|
long sec1 = sec0 + (nano_delta / NanoMuliplier);
|
||||||
|
long nano1 = nano_delta % NanoMuliplier;
|
||||||
|
|
||||||
|
Timestamp rtnTs = new Timestamp(sec1 * MilliMuliplier);
|
||||||
|
rtnTs.setNanos((int) nano1);
|
||||||
|
return rtnTs;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.lib.util;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper base class attempts to return java.sql.Timestamp object with
|
||||||
|
* nanosecond precision. This base class is created to allow JDK 1.4 maven build
|
||||||
|
* and only implements millisecond precision.
|
||||||
|
*
|
||||||
|
* @author Albert Lee
|
||||||
|
*/
|
||||||
|
public class TimestampHelper {
|
||||||
|
|
||||||
|
// number of millisecond, mircoseconds and nanoseconds in one second.
|
||||||
|
protected static final long MilliMuliplier = 1000L;
|
||||||
|
protected static final long MicroMuliplier = MilliMuliplier * 1000L;
|
||||||
|
protected static final long NanoMuliplier = MicroMuliplier * 1000L;
|
||||||
|
|
||||||
|
private static TimestampHelper instance = null;
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (JavaVersions.VERSION >= 5) {
|
||||||
|
try {
|
||||||
|
Class timestamp5HelperClass = Class
|
||||||
|
.forName("org.apache.openjpa.lib.util.Timestamp5Helper");
|
||||||
|
instance = (TimestampHelper) timestamp5HelperClass
|
||||||
|
.newInstance();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
instance = new TimestampHelper();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
instance = new TimestampHelper();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a java.sql.Timestamp object of current time.
|
||||||
|
*/
|
||||||
|
public static Timestamp getNanoPrecisionTimestamp() {
|
||||||
|
return instance.getTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This class implements a millisecond precision Timestamp.
|
||||||
|
*/
|
||||||
|
protected Timestamp getTimestamp() {
|
||||||
|
return new Timestamp(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue