bug 11354: query cache option is being enabled at DAO level. To use the cache sql paramter query_cache_type should be set to 2 and query_cache_size should be set to a value greated than 40kb. These can be set in my.ini. There are more tuning paramters which can be fine tuned and they are mentioned here http://dev.mysql.com/doc/refman/5.5/en/query-cache-configuration.html

This commit is contained in:
Abhinandan Prateek 2011-10-20 13:23:14 +05:30
parent 1ea9b5d703
commit bd774ab7a7
3 changed files with 60 additions and 5 deletions

View File

@ -152,8 +152,23 @@ public interface GenericDao<T, ID extends Serializable> {
*/
List<T> search(SearchCriteria<T> sc, Filter filter);
/**
* Search for the entity beans using the sql SQL_CACHE option
* @param sc
* @param filter
* @param enable_query_cache
* @return list of entity beans.
*/
List<T> search(SearchCriteria<T> sc, Filter filter, final boolean enable_query_cache);
List<T> searchIncludingRemoved(SearchCriteria<T> sc, final Filter filter, final Boolean lock, final boolean cache);
List<T> searchIncludingRemoved(SearchCriteria<T> sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enable_query_cache);
/**
* Customized search with SearchCritiria
* @param sc

View File

@ -126,6 +126,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
// This is private on purpose. Everyone should use createPartialSelectSql()
private final Pair<StringBuilder, Attribute[]> _partialSelectSql;
private final Pair<StringBuilder, Attribute[]> _partialQueryCacheSelectSql;
protected StringBuilder _discriminatorClause;
protected Map<String, Object> _discriminatorValues;
protected String _selectByIdSql;
@ -176,7 +177,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
public final Map<String, Attribute> getAllAttributes() {
return _allAttributes;
}
@SuppressWarnings("unchecked")
protected GenericDaoBase() {
Type t = getClass().getGenericSuperclass();
@ -199,7 +200,8 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
_table = DbUtil.getTableName(_entityBeanType);
final SqlGenerator generator = new SqlGenerator(_entityBeanType);
_partialSelectSql = generator.buildSelectSql();
_partialSelectSql = generator.buildSelectSql(false);
_partialQueryCacheSelectSql = generator.buildSelectSql(true);
_embeddedFields = generator.getEmbeddedFields();
_insertSqls = generator.buildInsertSqls();
final Pair<StringBuilder, Map<String, Object>> dc = generator.buildDiscriminatorClause();
@ -324,14 +326,30 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
return searchIncludingRemoved(sc, filter, lock, cache);
}
@DB(txn=false)
protected List<T> search(SearchCriteria<T> sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enable_query_cache) {
if (_removed != null) {
if (sc == null) {
sc = createSearchCriteria();
}
sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
}
return searchIncludingRemoved(sc, filter, lock, cache, enable_query_cache);
}
@Override
public List<T> searchIncludingRemoved(SearchCriteria<T> sc, final Filter filter, final Boolean lock, final boolean cache) {
return searchIncludingRemoved(sc, filter, lock, cache, false) ;
}
public List<T> searchIncludingRemoved(SearchCriteria<T> sc, final Filter filter, final Boolean lock,
final boolean cache, final boolean enable_query_cache) {
String clause = sc != null ? sc.getWhereClause() : null;
if (clause != null && clause.length() == 0) {
clause = null;
}
final StringBuilder str = createPartialSelectSql(sc, clause != null);
final StringBuilder str = createPartialSelectSql(sc, clause != null, enable_query_cache);
if (clause != null) {
str.append(clause);
}
@ -354,7 +372,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
}
final String sql = str.toString();
PreparedStatement pstmt = null;
final List<T> result = new ArrayList<T>();
try {
@ -1104,6 +1122,21 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
}
}
@DB(txn=false)
protected StringBuilder createPartialSelectSql(SearchCriteria<?> sc, final boolean whereClause, final boolean enable_query_cache) {
StringBuilder sql = new StringBuilder(enable_query_cache ? _partialQueryCacheSelectSql.first() : _partialSelectSql.first());
if (sc != null && !sc.isSelectAll()) {
sql.delete(7, sql.indexOf(" FROM"));
sc.getSelect(sql, 7);
}
if (!whereClause) {
sql.delete(sql.length() - (_discriminatorClause == null ? 6 : 4), sql.length());
}
return sql;
}
@DB(txn=false)
protected StringBuilder createPartialSelectSql(SearchCriteria<?> sc, final boolean whereClause) {
StringBuilder sql = new StringBuilder(_partialSelectSql.first());
@ -1158,6 +1191,11 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
return search(sc, filter, null, false);
}
@Override @DB(txn=false)
public List<T> search(final SearchCriteria<T> sc, final Filter filter, final boolean enable_query_cache) {
return search(sc, filter, null, false, enable_query_cache);
}
@Override @DB(txn=false)
public boolean update(ID id, T entity) {
assert Enhancer.isEnhanced(entity.getClass()) : "Entity is not generated by this dao";

View File

@ -565,8 +565,10 @@ public class SqlGenerator {
return sql.toString();
}
public Pair<StringBuilder, Attribute[]> buildSelectSql() {
public Pair<StringBuilder, Attribute[]> buildSelectSql(boolean enable_query_cache) {
StringBuilder sql = new StringBuilder("SELECT ");
sql.append(enable_query_cache ? "SQL_CACHE ": "");
ArrayList<Attribute> attrs = new ArrayList<Attribute>();