Fix key handling and streamline code
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/jdbc/JDBCDiskCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/jdbc/JDBCDiskCache.java
index b425a61..4c8ede0 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/jdbc/JDBCDiskCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/jdbc/JDBCDiskCache.java
@@ -37,6 +37,7 @@
import org.apache.commons.jcs3.auxiliary.AuxiliaryCacheAttributes;
import org.apache.commons.jcs3.auxiliary.disk.AbstractDiskCache;
import org.apache.commons.jcs3.auxiliary.disk.jdbc.dsfactory.DataSourceFactory;
+import org.apache.commons.jcs3.engine.behavior.ICache;
import org.apache.commons.jcs3.engine.behavior.ICacheElement;
import org.apache.commons.jcs3.engine.behavior.IElementSerializer;
import org.apache.commons.jcs3.engine.logging.behavior.ICacheEvent;
@@ -99,9 +100,6 @@
/** # of times getMatching was called */
private final AtomicInteger getMatchingCount = new AtomicInteger(0);
- /** if count % interval == 0 then log */
- private static final int LOG_INTERVAL = 100;
-
/** db connection pool */
private final DataSourceFactory dsFactory;
@@ -150,33 +148,20 @@
{
log.debug( "Putting [{0}] on disk.", () -> ce.getKey());
- final byte[] element;
-
try
{
- element = getElementSerializer().serialize( ce );
+ final byte[] element = getElementSerializer().serialize( ce );
+ insertOrUpdate( ce, con, element );
}
catch ( final IOException e )
{
log.error( "Could not serialize element", e );
- return;
}
-
- insertOrUpdate( ce, con, element );
}
catch ( final SQLException e )
{
log.error( "Problem getting connection.", e );
}
-
- if ( log.isInfoEnabled() )
- {
- if ( updateCount.get() % LOG_INTERVAL == 0 )
- {
- // TODO make a log stats method
- log.info( "Update Count [{0}]", updateCount);
- }
- }
}
/**
@@ -222,25 +207,19 @@
private boolean insertRow( final ICacheElement<K, V> ce, final Connection con, final byte[] element )
{
boolean exists = false;
- final String sqlI = "insert into "
- + getJdbcDiskCacheAttributes().getTableName()
- + " (CACHE_KEY, REGION, ELEMENT, MAX_LIFE_SECONDS, IS_ETERNAL, CREATE_TIME, UPDATE_TIME_SECONDS, SYSTEM_EXPIRE_TIME_SECONDS) "
- + " values (?, ?, ?, ?, ?, ?, ?, ?)";
+ final String sqlI = String.format("insert into %s"
+ + " (CACHE_KEY, REGION, ELEMENT, MAX_LIFE_SECONDS, IS_ETERNAL, CREATE_TIME, UPDATE_TIME_SECONDS,"
+ + " SYSTEM_EXPIRE_TIME_SECONDS) "
+ + " values (?, ?, ?, ?, ?, ?, ?, ?)", getJdbcDiskCacheAttributes().getTableName());
try (PreparedStatement psInsert = con.prepareStatement( sqlI ))
{
- psInsert.setString( 1, (String) ce.getKey() );
+ psInsert.setString( 1, ce.getKey().toString() );
psInsert.setString( 2, this.getCacheName() );
psInsert.setBytes( 3, element );
psInsert.setLong( 4, ce.getElementAttributes().getMaxLife() );
- if ( ce.getElementAttributes().getIsEternal() )
- {
- psInsert.setString( 5, "T" );
- }
- else
- {
- psInsert.setString( 5, "F" );
- }
+ psInsert.setString( 5, ce.getElementAttributes().getIsEternal() ? "T" : "F" );
+
final Timestamp createTime = new Timestamp( ce.getElementAttributes().getCreateTime() );
psInsert.setTimestamp( 6, createTime );
@@ -282,9 +261,9 @@
*/
private void updateRow( final ICacheElement<K, V> ce, final Connection con, final byte[] element )
{
- final String sqlU = "update " + getJdbcDiskCacheAttributes().getTableName()
+ final String sqlU = String.format("update %s"
+ " set ELEMENT = ?, CREATE_TIME = ?, UPDATE_TIME_SECONDS = ?, " + " SYSTEM_EXPIRE_TIME_SECONDS = ? "
- + " where CACHE_KEY = ? and REGION = ?";
+ + " where CACHE_KEY = ? and REGION = ?", getJdbcDiskCacheAttributes().getTableName());
try (PreparedStatement psUpdate = con.prepareStatement( sqlU ))
{
@@ -322,8 +301,8 @@
{
boolean exists = false;
// don't select the element, since we want this to be fast.
- final String sqlS = "select CACHE_KEY from " + getJdbcDiskCacheAttributes().getTableName()
- + " where REGION = ? and CACHE_KEY = ?";
+ final String sqlS = String.format("select CACHE_KEY from %s where REGION = ? and CACHE_KEY = ?",
+ getJdbcDiskCacheAttributes().getTableName());
try (PreparedStatement psSelect = con.prepareStatement( sqlS ))
{
@@ -366,37 +345,36 @@
ICacheElement<K, V> obj = null;
- byte[] data = null;
- try
+ // region, key
+ final String selectString = String.format("select ELEMENT from %s where REGION = ? and CACHE_KEY = ?",
+ getJdbcDiskCacheAttributes().getTableName());
+
+ try (Connection con = getDataSource().getConnection())
{
- // region, key
- final String selectString = "select ELEMENT from " + getJdbcDiskCacheAttributes().getTableName()
- + " where REGION = ? and CACHE_KEY = ?";
-
- try (Connection con = getDataSource().getConnection())
+ try (PreparedStatement psSelect = con.prepareStatement( selectString ))
{
- try (PreparedStatement psSelect = con.prepareStatement( selectString ))
- {
- psSelect.setString( 1, this.getCacheName() );
- psSelect.setString( 2, key.toString() );
+ psSelect.setString( 1, this.getCacheName() );
+ psSelect.setString( 2, key.toString() );
- try (ResultSet rs = psSelect.executeQuery())
+ try (ResultSet rs = psSelect.executeQuery())
+ {
+ byte[] data = null;
+
+ if ( rs.next() )
{
- if ( rs.next() )
+ data = rs.getBytes( 1 );
+ }
+
+ if ( data != null )
+ {
+ try
{
- data = rs.getBytes( 1 );
+ // USE THE SERIALIZER
+ obj = getElementSerializer().deSerialize( data, null );
}
- if ( data != null )
+ catch ( final IOException | ClassNotFoundException e )
{
- try
- {
- // USE THE SERIALIZER
- obj = getElementSerializer().deSerialize( data, null );
- }
- catch ( final Exception e )
- {
- log.error( "Problem getting item for key [{0}]", key, e );
- }
+ log.error( "Problem getting item for key [{0}]", key, e );
}
}
}
@@ -408,14 +386,6 @@
key, sqle );
}
- if ( log.isInfoEnabled() )
- {
- if ( getCount.get() % LOG_INTERVAL == 0 )
- {
- // TODO make a log stats method
- log.info( "Get Count [{0}]", getCount );
- }
- }
return obj;
}
@@ -440,37 +410,33 @@
final Map<K, ICacheElement<K, V>> results = new HashMap<>();
- try
+ // region, key
+ final String selectString = String.format("select ELEMENT from %s where REGION = ? and CACHE_KEY like ?",
+ getJdbcDiskCacheAttributes().getTableName());
+
+ try (Connection con = getDataSource().getConnection())
{
- // region, key
- final String selectString = "select CACHE_KEY, ELEMENT from " + getJdbcDiskCacheAttributes().getTableName()
- + " where REGION = ? and CACHE_KEY like ?";
-
- try (Connection con = getDataSource().getConnection())
+ try (PreparedStatement psSelect = con.prepareStatement( selectString ))
{
- try (PreparedStatement psSelect = con.prepareStatement( selectString ))
- {
- psSelect.setString( 1, this.getCacheName() );
- psSelect.setString( 2, constructLikeParameterFromPattern( pattern ) );
+ psSelect.setString( 1, this.getCacheName() );
+ psSelect.setString( 2, constructLikeParameterFromPattern( pattern ) );
- try (ResultSet rs = psSelect.executeQuery())
+ try (ResultSet rs = psSelect.executeQuery())
+ {
+ while ( rs.next() )
{
- while ( rs.next() )
+ final byte[] data = rs.getBytes(1);
+ if ( data != null )
{
- final String key = rs.getString( 1 );
- final byte[] data = rs.getBytes( 2 );
- if ( data != null )
+ try
{
- try
- {
- // USE THE SERIALIZER
- final ICacheElement<K, V> value = getElementSerializer().deSerialize( data, null );
- results.put( (K) key, value );
- }
- catch ( final Exception e )
- {
- log.error( "Problem getting items for pattern [{0}]", pattern, e );
- }
+ // USE THE SERIALIZER
+ final ICacheElement<K, V> value = getElementSerializer().deSerialize( data, null );
+ results.put( value.getKey(), value );
+ }
+ catch ( final IOException | ClassNotFoundException e )
+ {
+ log.error( "Problem getting items for pattern [{0}]", pattern, e );
}
}
}
@@ -483,14 +449,6 @@
pattern, sqle );
}
- if ( log.isInfoEnabled() )
- {
- if ( getMatchingCount.get() % LOG_INTERVAL == 0 )
- {
- // TODO make a log stats method
- log.info( "Get Matching Count [{0}]", getMatchingCount);
- }
- }
return results;
}
@@ -519,21 +477,18 @@
protected boolean processRemove( final K key )
{
// remove single item.
- String sql = "delete from " + getJdbcDiskCacheAttributes().getTableName()
- + " where REGION = ? and CACHE_KEY = ?";
+ final String sqlSingle = String.format("delete from %s where REGION = ? and CACHE_KEY = ?",
+ getJdbcDiskCacheAttributes().getTableName());
+ // remove all keys of the same name group.
+ final String sqlPartial = String.format("delete from %s where REGION = ? and CACHE_KEY like ?",
+ getJdbcDiskCacheAttributes().getTableName());
try (Connection con = getDataSource().getConnection())
{
- boolean partial = false;
- if ( key instanceof String && key.toString().endsWith( NAME_COMPONENT_DELIMITER ) )
- {
- // remove all keys of the same name group.
- sql = "delete from " + getJdbcDiskCacheAttributes().getTableName()
- + " where REGION = ? and CACHE_KEY like ?";
- partial = true;
- }
+ boolean partial = key.toString().endsWith(ICache.NAME_COMPONENT_DELIMITER);
+ String sql = partial ? sqlPartial : sqlSingle;
- try (PreparedStatement psSelect = con.prepareStatement( sql ))
+ try (PreparedStatement psSelect = con.prepareStatement(sql))
{
psSelect.setString( 1, this.getCacheName() );
if ( partial )
@@ -573,10 +528,11 @@
// it should never get here from the abstract disk cache.
if ( this.jdbcDiskCacheAttributes.isAllowRemoveAll() )
{
+ final String sql = String.format("delete from %s where REGION = ?",
+ getJdbcDiskCacheAttributes().getTableName());
+
try (Connection con = getDataSource().getConnection())
{
- final String sql = "delete from " + getJdbcDiskCacheAttributes().getTableName() + " where REGION = ?";
-
try (PreparedStatement psDelete = con.prepareStatement( sql ))
{
psDelete.setString( 1, this.getCacheName() );
@@ -624,8 +580,8 @@
getTableState().setState( TableState.DELETE_RUNNING );
final long now = System.currentTimeMillis() / 1000;
- final String sql = "delete from " + getJdbcDiskCacheAttributes().getTableName()
- + " where IS_ETERNAL = ? and REGION = ? and ? > SYSTEM_EXPIRE_TIME_SECONDS";
+ final String sql = String.format("delete from %s where IS_ETERNAL = ? and REGION = ?"
+ + " and ? > SYSTEM_EXPIRE_TIME_SECONDS", getJdbcDiskCacheAttributes().getTableName());
try (PreparedStatement psDelete = con.prepareStatement( sql ))
{
@@ -679,7 +635,7 @@
@Override
public void processDispose()
{
- final ICacheEvent<K> cacheEvent = createICacheEvent( getCacheName(), (K)"none", ICacheEventLogger.DISPOSE_EVENT );
+ final ICacheEvent<K> cacheEvent = createICacheEvent( getCacheName(), (K)null, ICacheEventLogger.DISPOSE_EVENT );
try
{
@@ -706,8 +662,8 @@
int size = 0;
// region, key
- final String selectString = "select count(*) from " + getJdbcDiskCacheAttributes().getTableName()
- + " where REGION = ?";
+ final String selectString = String.format("select count(*) from %s where REGION = ?",
+ getJdbcDiskCacheAttributes().getTableName());
try (Connection con = getDataSource().getConnection())
{