blob: 1500643e72adf4dd468004dd68147d7cf8b071fc [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc.client.impl;
import java.util.LinkedHashMap;
import java.util.Map;
import org.mariadb.jdbc.ServerPreparedStatement;
import org.mariadb.jdbc.export.Prepare;
import org.mariadb.jdbc.message.server.CachedPrepareResultPacket;
import org.mariadb.jdbc.message.server.PrepareResultPacket;
/** LRU prepare cache */
public final class PrepareCache extends LinkedHashMap<String, CachedPrepareResultPacket>
implements org.mariadb.jdbc.client.PrepareCache {
private static final long serialVersionUID = -8922905563713952695L;
/** cache maximum size */
private final int maxSize;
/** client */
private final StandardClient con;
/**
* LRU prepare cache constructor
*
* @param size cache size
* @param con client
*/
public PrepareCache(int size, StandardClient con) {
super(size, .75f, true);
this.maxSize = size;
this.con = con;
}
@Override
public boolean removeEldestEntry(Map.Entry<String, CachedPrepareResultPacket> eldest) {
if (this.size() > maxSize) {
eldest.getValue().unCache(con);
return true;
}
return false;
}
public synchronized Prepare get(String key, ServerPreparedStatement preparedStatement) {
CachedPrepareResultPacket prepare = super.get(key);
if (prepare != null && preparedStatement != null) {
prepare.incrementUse(preparedStatement);
}
return prepare;
}
public synchronized Prepare put(
String key, Prepare result, ServerPreparedStatement preparedStatement) {
CachedPrepareResultPacket cached = super.get(key);
// if there is already some cached data, return existing cached data
if (cached != null) {
cached.incrementUse(preparedStatement);
((CachedPrepareResultPacket) result).unCache(con);
return cached;
}
if (((CachedPrepareResultPacket) result).cache()) {
((CachedPrepareResultPacket) result).incrementUse(preparedStatement);
super.put(key, (CachedPrepareResultPacket) result);
}
return null;
}
public CachedPrepareResultPacket get(Object key) {
throw new IllegalStateException("not available method");
}
/**
* NOT USED
*
* @param key key
* @param result results
* @return will throw an exception
*/
@SuppressWarnings("unused")
public CachedPrepareResultPacket put(String key, PrepareResultPacket result) {
throw new IllegalStateException("not available method");
}
public void reset() {
for (CachedPrepareResultPacket prep : values()) {
prep.reset();
}
this.clear();
}
}