1

EhCache は、メモリ キャッシングのキーとして使用されるオブジェクトに制限を設けずSerializable、ディスク/分散キャッシングのみに制限を課しているようです。( http://ehcache.org/apidocs/net/sf/ehcache/Element.html )

では、キーが保存されているものと一致するかどうかをチェックするために、キー オブジェクトのどのプロパティが内部的に使用されるのでしょうか? 独自の ID メソッドを提供するためにどのような方法を使用できますか?

4

1 に答える 1

1

そのため、EHCache はキー IDに equals / hashCodeを使用します。

私はいくつかのテストを行いました:

private static final class TestKey implements Serializable {

    boolean equals;
    int hash;

    TestKey( boolean equals, int hash ){
        this.equals = equals;
        this.hash = hash;
    }

    @Override
    public boolean equals( Object other ){ return equals; }

    @Override
    public int hashCode(){ return hash; }
}




public void testIdentity() throws Exception {

    // A simple wrapper around EHCache which does the configuration
    // and provides a map like interface
    CacheEHCache<TestKey,String> cache = CacheEHCache.instance(
            new File( "/tmp/ehcache" ), "testcache", 10 );

    // May contain content from last run
    cache.clear();

    // equals and hash matches
    TestKey k11 = new TestKey( true, 1 );

    cache.put( k11, "Test11" );

    assertEquals( cache.size(), 1 );
    assertTrue( cache.containsKey( k11 ) );

    cache.remove( k11 );
    assertEquals( cache.size(), 0 );

    // doesn't equal but hash matches
    TestKey k21 = new TestKey( false, 1 );

    cache.put( k21, "Test21" );
    assertEquals( cache.size(), 1 );
    assertFalse( cache.containsKey( k21 ) );

    // This is interesting: Clear needs to find the objects to clear
    // So we must patch it.
    k21.equals = true; 
    cache.clear();
    assertEquals( cache.size(), 0 );

    // equals but hash missmatches
    TestKey k31 = new TestKey( true, 1 );
    TestKey k32 = new TestKey( true, 2 );
    cache.put( k31, "Test21" );
    assertEquals( cache.size(), 1 );
    assertTrue( cache.containsKey( k31 ) );
    assertFalse( cache.containsKey( k32 ) );
    cache.clear();
}
于 2014-03-27T07:12:47.780 に答える