使用这些JPA属性
props.put( "hibernate.cache.use_query_cache", "true" );
props.put( "hibernate.cache.use_second_level_cache", "true" );
props.put("hibernate.temp.use_jdbc_metadata_defaults", "false");
props.put( "hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory" );
props.put( "javax.persistence.sharedCache.mode", SharedCacheMode.ALL );
Ehcache对于同一查询效率不高,
问题与QueryCache类的namedParameters.hashCode()函数有关,它为同一查询生成了不同的HashCode!
private int generateHashCode() {
int result = 13;
result = 37 * result + ( firstRow==null ? 0 : firstRow.hashCode() );
result = 37 * result + ( maxRows==null ? 0 : maxRows.hashCode() );
for ( int i=0; i< positionalParameterValues.length; i++ ) {
result = 37 * result + ( positionalParameterValues[i]==null ? 0 : positionalParameterTypes[i].getHashCode( positionalParameterValues[i] ) );
}
result = 37 * result + ( namedParameters==null ? 0 : namedParameters.hashCode() );
result = 37 * result + ( filterKeys ==null ? 0 : filterKeys.hashCode() );
result = 37 * result + ( customTransformer==null ? 0 : customTransformer.hashCode() );
result = 37 * result + ( tenantIdentifier==null ? 0 : tenantIdentifier.hashCode() );
result = 37 * result + sqlQueryString.hashCode();
return result;
}
与班级有关
org.hibernate.type.AbstractType
public int getHashCode(Object x) {
return x.hashCode();
}
它将为同一Array对象[01,1]生成一个不同的(新)hachCode!
对于数组,此hashCode方法应该是递归的
递归版本完全正常
类org.hibernate.type.AbstractType
public int getHashCode(Object x) {
if (x instanceof Object[]){
int result = 1;
for (Object element : (Object[]) x)
result = 31 * result + (element == null ? 0 : getHashCode(element));
return result;
}
return x.hashCode();
}
和
public static boolean arraysEquals(Object[] a, Object[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++) {
Object o1 = a[i];
Object o2 = a2[i];
if (o1==null){
if (o2!=null)
return false;
}else{
if (o2==null)
return false;
if (o1 instanceof Object[]){
if (!(o2 instanceof Object[]))
return false;
else
if (!arraysEquals( (Object[]) o1, (Object[]) o2))
return false;
}else
if (!o1.equals(o2))
return false;
}
}
return true;
}
public static boolean equals(final Object x, final Object y) {
if (x!=null && x instanceof Object[] && y!=null && y instanceof Object[] )
return arraysEquals((Object[])x, (Object[])y);
return x == y || ( x != null && y != null && x.equals( y ) );
}
使用thoses和JPA属性 Ehcache对于相同的查询不是有效的, 问题与QueryCache类的函数namedParameters.hashCode()有关,它为同一个查询生成不同的HashCode! 这与类有关 它为同一个数组对象[01,1]生成一个不同的(新的)hachCode! 此hashCode方法对于数组应该是递归的
今天我决定测试一下,结果我惊讶地发现(至少在C#正则表达式引擎中)似乎比其他两个没有太大区别的代码效率要低。下面是我测试输出的10000个由1000个随机字符组成的字符串,其中5077个实际包含一个数字: 这对我来说是一个惊喜,有两个原因,如果有人能给我一些启示,我会很感兴趣: 我本以为范围的实现会比集合的实现效率高得多。 我不能理解为什么比差。除了的简写之外,还有其他内容吗? 下面是测试代码:
问题内容: 我目前遇到一些问题,以了解为什么在某些情况下Java中的并行化似乎效率低下。在下面的代码中,我构建了4个使用ThreadPool执行的相同任务。 在我的Core i5(2核,4线程)上,如果将工作程序数设置为1,则计算机需要大约5700毫秒,并使用25%的处理器。如果将工作程序数量设置为4,则可以观察到100%的CPU使用率,但是…计算时间是相同的:5700ms,而我希望它可以减少4倍
我使用的是ehcache 1.2.3。由于缓存大小是根据“元素”指定的,缓存占用的内存可能会有很大差异(ehcache与hibernate一起使用,并且还保存标准查询缓存,其中查询返回大小可能会有所不同的结果集)。我的问题是:如果JVM内存不足会发生什么。阅读ehcache的变更日志给我的印象是,最初它使用的是软引用,但由于java 1.4正在大力清理它们,软引用最终被删除了。因此,如果缓存太大,
问题内容: 我突然在我的java-app(使用NetBeans作为IDE)中创建记录器时,突然看到一条警告:“记录器中字符串连接使用效率不高”。 我的原始代码是 但是NetBeans建议将此代码转换为模板(“模板”在这里意味着什么?),并提供以下代码: 这两种串联方式有什么不同,尽管我从未使用过后者。 干杯。 问题答案: 我会忽略该警告(如果可能,请将其关闭)。串联的效率不是那么低,因为现代编译器
不可变对象是无法更改状态的对象。它们更容易测试和调试,在并发编程中非常有用。然而,与可变集合的亲属相比,当前的不可变集合实现的性能较差。例如,将关联数组实现为不可变的红黑树时,平均有O(log(n))个Insert/Delete,而哈希表平均有O(1)个Insert/Delete。 总的来说,不可变集合是否比它们的可变表亲效率低,或者有一天我们会找到同样快的不可变实现?