
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.


                        Apache Commons JCS
                        Version 2.1
                        Release Notes


INTRODUCTION:

This document contains the release notes for the 2.1 version of Apache Commons JCS.
Commons JCS is a distributed caching system written in Java. It is intend to speed up 
applications by providing a means to manage cached data of various dynamic natures.

JCS 2.0 and onwards now targets Java 6.0, making use of features that arrived with Java 5.0 
such as generics and concurrency.

For the advice on upgrading from 1.x to 2.x, see the following page: 

    http://commons.apache.org/proper/commons-jcs/UpgradingFrom13.html

Apache Commons JCS is a distributed, versatile caching system.

This is mainly a bugfix release.

Changes in this version include:


Fixed Bugs:
o           SoftReference cache did not work because of strong references being 
            stored in payload of DoubleLinkedListNode
o JCS-172:  ElementAttributes.clone() not updating createTime causes cache elements
            to expire immediately Thanks to Tom Schroeder.
o JCS-171:  Multiple CacheEventQueue.QProcessor spawned for the same cache region Thanks to Wiktor Niesiobedzki.
o JCS-170:  Replace at least commas for jmx registration



Historical list of changes: http://commons.apache.org/proper/commons-jcs/changes-report.html

For complete information on Apache Commons JCS, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons JCS website:

http://commons.apache.org/proper/commons-jcs/