我在我的JavaEE項目上使用Spring + Hibernate。使用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數據?將所有數據加載到內存中,然後立即進行驗證。您可能需要先解決內存泄漏問題。 – wdoering