[ https://issues.apache.org/jira/browse/IBATISNET-285?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gilles Bayon closed IBATISNET-285. ---------------------------------- Resolution: Fixed Fix Version/s: DataMapper 1.6.2 Assignee: Gilles Bayon in svn > flushInterval ist calculated wrong > ---------------------------------- > > Key: IBATISNET-285 > URL: https://issues.apache.org/jira/browse/IBATISNET-285 > Project: iBatis for .NET > Issue Type: Bug > Components: DataMapper > Affects Versions: DataMapper 1.6.1 > Reporter: Stefan Hoehn > Assignee: Gilles Bayon > Fix For: DataMapper 1.6.2 > > > We noticed that if the flushInterval like in > <cacheModels> > <cacheModel id="NavigationCache" implementation="MEMORY" > readOnly="false" serialize="true"> > <!-- User bekommen Kopien aus dem Cache --> > <flushInterval minutes="1"/> > <property name="Type" value="STRONG"/> > </cacheModel> > </cacheModels> > is provided it results in a completely wrong number. There are two bugs that > lead to a wrong result. The first one is very minor because it decreases the > given interval time by about ten milliseconds. The second one is more severe: > It results in a somewhat twice the time of the cache interval given in the > configuration. > Bug #1: The negative default value is being added > in FlushInterval.cs you find the following code: > private long _interval = CacheModel.NO_FLUSH_INTERVAL; // > equals -99999 > //................ > public void Initialize() > { > if (_milliseconds != 0) > { > _interval += (_milliseconds * > TimeSpan.TicksPerMillisecond) ; > } > if (_seconds != 0) > { > _interval += (_seconds * > TimeSpan.TicksPerSecond) ; > } > if (_minutes != 0) > { > _interval += (_minutes * > TimeSpan.TicksPerMinute) ; > } > if (_hours != 0) > { > _interval += (_hours * TimeSpan.TicksPerHour) ; > } > if (_interval == 0) > { > _interval = CacheModel.NO_FLUSH_INTERVAL; > } > } > The result in our case is -99999+600000000 = 599900001. > Granted that the effect is only about 10 Milliseconds but still, > it is wrong :-) > Bug #2: FlushInterval.initialize() is called twice during initialization > If you follow the Deserialization of the DomSqlMapBuilder in > ConfigureSQLMap() you will find the following code,which calls > CacheModelDeSerializer.Deserialize(): > #region Load CacheModels > if (_configScope.IsCacheModelsEnabled) > { > CacheModel cacheModel; > foreach (XmlNode xmlNode in > _configScope.SqlMapDocument.SelectNodes( > ApplyMappingNamespacePrefix(XML_CACHE_MODEL), > _configScope.XmlNamespaceManager)) > { > cacheModel = > CacheModelDeSerializer.Deserialize(xmlNode, _configScope); > cacheModel.Id = > _configScope.ApplyNamespace(cacheModel.Id); > // Attach ExecuteEventHandler > foreach(XmlNode flushOn in > xmlNode.SelectNodes( ApplyMappingNamespacePrefix(XML_FLUSH_ON_EXECUTE), > _configScope.XmlNamespaceManager )) > { > string statementName = > flushOn.Attributes["statement"].Value; > if > (_configScope.UseStatementNamespaces) > { > statementName = > _configScope.ApplyNamespace(statementName); > } > // delay registering statements > to cache model until all sqlMap files have been processed > IList statementNames = > (IList)_configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id]; > if (statementNames == null) > { > statementNames = new > ArrayList(); > } > > statementNames.Add(statementName); > > _configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id] = > statementNames; > } > // Get Properties > foreach(XmlNode propertie in > xmlNode.SelectNodes( ApplyMappingNamespacePrefix(XML_PROPERTY), > _configScope.XmlNamespaceManager)) > { > string name = > propertie.Attributes["name"].Value; > string value = > propertie.Attributes["value"].Value; > > cacheModel.AddProperty(name, > value); > } > cacheModel.Initialize(); > _configScope.SqlMapper.AddCache( > cacheModel ); > } > } > The issue is that CacheModelDeSerializer.Deserialize(xmlNode, _configScope); > has the following implementation > int count = node.ChildNodes.Count; > for(int i=0;i<count;i++) > { > if > (node.ChildNodes[i].LocalName=="flushInterval") > { > FlushInterval flush = new > FlushInterval(); > NameValueCollection props = > NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); > flush.Hours = > NodeUtils.GetIntAttribute(props, "hours", 0); > flush.Milliseconds = > NodeUtils.GetIntAttribute(props, "milliseconds", 0); > flush.Minutes = > NodeUtils.GetIntAttribute(props, "minutes", 0); > flush.Seconds = > NodeUtils.GetIntAttribute(props, "seconds", 0); > flush.Initialize(); > > model.FlushInterval = flush; > } > } > and therefore calls flush.Initialize() as soon as it find an property > "flushInterval". So far so good as this results in getting the above number: > 599900001 > However, back again in ConfigureSQLMap further down it calls > cacheModel.Initialize(); which in turn calls _flushInterval.Initialize(); > again adding another 600000000 resulting in 1199900001, almost twice of what > we wanted. > The initialization-Method must no be called twice. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.