【发布时间】:2015-12-31 02:30:26
【问题描述】:
我在我的 JavaEE 项目中使用 Spring + Hibernate。
在这个项目中,用户可以上传一个 XLS 文件,我应该将它导入到我的数据库中。在导入之前,我必须验证此文件与我数据库中其他实体的完整性。所以我或多或少有以下几点:
// The importer
@Component("importer")
public class Importer {
@Autowired
FirstDAO firstDao;
@Autowired
SecondDAO secondDao;
// Read the file and open it (65.000 lines for example)
public void validate() {
foreach line in the file {
firstDAO.has(line[col1]);
secondDao.has(line[col2]);
}
// It stores the valid objects in a List and persist them at the end
}
}
// The DAO
@Repository
public class FirstDao {
@PersistenceContext
protected EntityManager entityManager;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public boolean has(String name) {
List<Object> result = entityManager.createQuery( from FIRST_TABLE where name = :name)
.setParameter("name", name)
.getResultList();
if (result.size > 0) return true;
else return false;
}
}
// The PersistenceContext/Hibernate configuration
<!-- Data Source -->
<jee:jndi-lookup id="myDS" jndi-name="jdbc/my-DS" cache="true" proxy-interface="javax.sql.DataSource" />
<!-- Entity Manager -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property value="classpath:META-INF/my_persistence.xml" name="persistenceXmlLocation"/>
<property name="dataSource" ref="myDS"/>
<property name="persistenceUnitName" value="myPersistenceUnit" />
<!--
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="ORACLE" />
<property name="showSql" value="false" />
</bean>
</property>
</bean>
登录应用程序后我注意到:
- 对于每个查询(在我的 DAO 上具有方法),都会打开和关闭与我的数据库的连接。
- 服务器上的内存被淹没(可能是内存泄漏)。
- 在多次打开和关闭连接后,我从数据库重置了连接。不知道为什么。如果我仍然继续请求连接,则数据源将被暂停。
我已经阅读了一些关于entityManager 的内容,但我仍然不知道我是否做得对,所以:
- 以这种方式在 for 循环中执行验证是否正确? (每个项目一个连接,这意味着在 65000 行文件中打开和关闭 130.000 个连接)
- 我已经阅读了关于 entityManager 的
Stateless Persistence Context。我怀疑可能存在内存泄漏。也许 Hibernate 在 PersistenceContext 中保留了很多对象。如何告诉 Entity Manager 在验证时不要缓存这些人?
提前致谢。
【问题讨论】:
-
您的问题听起来像是问题列表。但是关于为文件的每一行连接到数据库,这会大大降低系统的性能。您不能遍历整个文件,将其加载到内存中,然后运行单个 select 语句来检索您需要与加载的文件进行比较的 db 数据吗?将所有数据加载到内存中,然后一次全部验证。您可能需要先解决内存泄漏问题。
标签: java hibernate spring-mvc jpa entitymanager