拥有一个拥有520多个表的ERP数据库,EntityPersister的postInstanciate速度非常慢,并且消耗的512M以上(仅对于一个会话Factory而言是很大的),应用程序也变得非常慢。
我无法发布所有更改,但是这里有一些想法:
1_
postInstanciate为所有实体和集合创建许多Entiy加载器(每个实体和每个集合的加载器类型很多),此操作应按需执行,应在需要时创建实体或集合加载器,而不是在会话工厂构建期间,即使您有500个实体,这也意味着用户将从所有实体中加载数据。
private Map LoaderMap = new LoaderMap();//instead Hashmap
class LoaderMap extends HashMap{
@Override
public Object get(Object key) {
Object obj = super.get(key);
if (obj==null){
boolean disableForUpdate = getSubclassTableSpan() > 1 &&
hasSubclasses() &&
!getFactory().getDialect().supportsOuterJoinForUpdate();
switch (key.toString()) {
case "NONE":
obj = createEntityLoader( LockMode.NONE );
break;
case "READ":
obj = createEntityLoader( LockMode.READ );
if (disableForUpdate){
put(LockMode.UPGRADE, obj );
put(LockMode.UPGRADE_NOWAIT, obj );
put(LockMode.UPGRADE_SKIPLOCKED, obj );
put(LockMode.FORCE, obj );
put(LockMode.PESSIMISTIC_READ, obj );
put(LockMode.PESSIMISTIC_WRITE, obj );
put(LockMode.PESSIMISTIC_FORCE_INCREMENT, obj );
}
break;
case "UPGRADE":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.UPGRADE );
case "UPGRADE_NOWAIT":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.UPGRADE_NOWAIT );
case "UPGRADE_SKIPLOCKED":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.UPGRADE_SKIPLOCKED );
case "FORCE":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.FORCE );
case "PESSIMISTIC_READ":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.PESSIMISTIC_READ );
case "PESSIMISTIC_WRITE":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.PESSIMISTIC_WRITE );
case "PESSIMISTIC_FORCE_INCREMENT":
if (disableForUpdate)
obj = get("READ");
else
obj = createEntityLoader( LockMode.PESSIMISTIC_FORCE_INCREMENT );
case "OPTIMISTIC":
obj = createEntityLoader( LockMode.READ );
break;
case "OPTIMISTIC_FORCE_INCREMENT":
obj = createEntityLoader( LockMode.READ );
break;
case "merge":
obj = new CascadeEntityLoader( AbstractEntityPersister.this, CascadingActions.MERGE, getFactory() );
break;
case "refresh":
obj = new CascadeEntityLoader( AbstractEntityPersister.this, CascadingActions.REFRESH, getFactory() );
break;
default:
break;
}
put(key, obj);
}
return obj;
}
}
//Relational based Persisters should be content with this implementation
protected void createLoaders() {
if (true)
return;
....
}
2_
DirectPropertyAccessor为buildGetter方法调用两次getDeclaredField,为buildSetter调用两次,使用map是一个很好的优化。
public static final Map<Double, Field> tmp = new HashMap<Double, Field>();
private static Field getField(Class root, Class clazz, String name) throws PropertyNotFoundException {
if ( clazz==null || clazz==Object.class ) {
throw new PropertyNotFoundException("field [" + name + "] not found on " + root.getName());
}
double hash = name.hashCode() + clazz.hashCode()*1.1;
Field field = tmp.get( hash );
if (field==null)
try {
field = clazz.getDeclaredField(name);
tmp.put( hash, field );
}
catch (NoSuchFieldException nsfe) {
field = getField( root, clazz.getSuperclass(), name );
}
field.html" target="_blank">setAccessible(true);
return field;
}
对Ulrich Scholz的响应
:我向项目添加了一个包含所有固定类的jar,在我的情况下,其Webapp应用程序部署在Tomcat上,您需要使用以下命令修复Jars的加载顺序:
<Context>
<Resources>
<PreResources className="org.apache.catalina.webresources.FileResourceSet"
base="${catalina.base}/webapps/AGIWERP/WEB-INF/lib/AAACLZ-1.0.jar"
webAppMount="/WEB-INF/lib/AAACLZ-1.0.jar" />
</Resources>
</Context>
这意味着您的类应该在原始类之前加载
在Java中分配堆外内存时(例如通过直接缓冲区或JNI本机代码),如果JVM使用-XX: UseLargePages,分配的内存是否会由巨大的页面支持?
问题内容: 我正在使用numpy并尝试创建一个巨大的矩阵。这样做时,我收到内存错误 由于矩阵并不重要,因此我将向您展示如何轻松重现错误的方法。 毫不奇怪,这把我扔了 我想讲两件事: 我真的需要创建和使用一个大矩阵 我认为我有足够的RAM来处理此矩阵(我有24 Gb或RAM) 有没有一种简单的方法可以处理numpy中的大型矩阵? 为了安全起见,我之前阅读过这些帖子(听起来很相似): 使用Python
问题内容: 我正在处理熊猫和Spark数据帧。数据帧始终很大(> 20 GB),而标准的火花功能不足以容纳这些大小。目前,我将我的pandas数据框转换为spark数据框,如下所示: 我进行这种转换是因为通过火花将数据帧写入hdfs非常容易: 但是,对于大于2 GB的数据帧,转换失败。如果将spark数据框转换为熊猫,则可以使用pyarrow: 这是从Spark到Panda的快速对话,它也适用于大
我正在Windows 8.1 64位上开发java swing应用程序,带有4GB内存和JDK版本8u20 64位。 问题是当我使用带有监视器选项的Netbeans profiler启动应用程序时。 加载第一个Jframe时,应用程序Memory Heap约为18mb,JVM进程大小约为50mb(Image1)。 然后,当我启动另一个Jframe时,它包含一个带有webView的JFxPanel,
问题内容: 使用该标志提供一个1 GB的堆,以下功能可以正常工作: 该阵列应代表约600 MB。 但是,以下引发OutOfMemoryError: 尽管该阵列应代表约800 MB,因此很容易装入内存。 丢失的记忆在哪里消失了? 问题答案: 在Java中,堆中通常有多个区域(和子区域)。您拥有一个年轻且历久弥新的地区,拥有最多的收藏家。大阵列会立即添加到租用区域,但是根据您的最大内存大小,将为年轻空
6月初的面经,今天发一下 真得是个巨大的玩笑 巨杉数据库,笔试+三面,结果到offer审批的时候和我说没有通过,既然如此,不知道为什么前面还要费那么大劲去面试,为什么面试的环节中没有一次总监面让大家都干净,还是说总监是从美国IBM回来的,不屑于和我们这些国内韭菜对话? 笔试: 比较基础 一面: 开头自我介绍 1. IO多路复用; 2. 项目中用到的数据库连接池,包括用到的设计模式、实现细节、数据结