Im currently using the standard jparepository method repository.deleteAll() to clean my table before adding new info. The table consists of 8300 rows with 5 columns each. It's currently taking about 80 sec to get them all removed, while it takes 1-3 sec to put them in using the standard repository.saveAll(list). Is there a more effecient way to do this? Deleting the data manually in sql with DELETE FROM table takes 0,1 sec. Using MySQL database. log from putting in data log from deletion.
Example, in your service interface:
public interface MyTableInterface {
//...
void truncateMyTable();
}
In your service implementation (with @Autowired
myTableRepository):
public class MyTableImpl implements MyTableService {
// other methods, @Autowiring, etc
@Override
@Transactional
public void truncateMyTable() {
myTableRepository.truncateMyTable();
}
}
In your repository;
public interface MyTableRepository extends JpaRepository<MyTable, Long> {
//....
@Modifying
@Query(
value = "truncate table myTable",
nativeQuery = true
)
void truncateMyTable();
}
EDIT: Also notice the @Transactional
on service implemntation layer, instead of placing it on DAO/Repository layer
The reason that deleteAll
is not fast, is because it fetches all entities and then removes them one by one (normally sending one SQL to the database per row):
// Code from SimpleJpaRepository
@Transactional
public void deleteAll() {
for (T element : findAll()) {
delete(element);
}
}
I would suggest that you create your own delete method in the repo like:
@Modifying
@Transactional
@Query("delete from MyEntity m")
void deleteAllWithQuery();
This will create only one SQL DELETE statement.
Below Annotations over the class file of Dao Layer
@Repository
@Transactional
Below line in the method delete all records from table
int headFoot = entityManager.createQuery("DELETE FROM HeaderFooterUpload HeadFoot").executeUpdate();
Of course, about performance, create query and execute through entity manager (truncate table query or delete from table query) seems a good alternative of repository.deleteAll()
method. Particulary truncate table seems the best way.
But if you don't want to use query for this problem you can use repository.deleteAllInBatch()
. This method is provided by JpaRepository and in background execute delete from EntityName x
query basically. this post can help you to have more details about difference between deleteAll() and deleteAllInBatch() methods.
On another hand, truncate query have a limit. You can use it just by creating native query. and your current DBMS might not have this command, or you might later move to a DBMS that does not have this command available. Good link for more information about truncate command with jpa
© 2022 - 2024 — McMap. All rights reserved.
DELETE FROM t
andTRUNCATE t
: the autoincrement numbering. – Angora