My Question is with DB connection Boundry vs Transaction Boundry
I am not asking, where to put @transactional annotation. I need to know even code the executed @transactional method, After that also Is it using db connection/lock or not?
Story
I have faced problem with one of my project is consuming lot of DB connections. And those are not releasing when web-traffic is high.
So I need to know the best practice of transactional annotation usage.
Also, I need Detail Explanation Lock/DB connection with @Transactional |
what is DB connection? What is lock ? are both equal? I am asking about lock acquiring.when the lock is acquiring and when the lock is releasing.
I have 2 approaches to return data from the transactional method.
save and return entity
save and return DTO
which is the better approach by considering DB connection/lock perspective.
controller layer
@Controller
public class QuoteController {
@RequestMapping(value ="", method = RequestMethod.POST)
public String saveAllGetSampleClass4(QuoteDTO quoteDTO, RedirectAttributes redirectAttributes) {
quoteService.saveAllGetSampleClass4(quoteDTO.quoteId, quoteDTO.userId);
}
@RequestMapping(value ="", method = RequestMethod.POST)
public String saveAllGetSampleClass4DTO(QuoteDTO quoteDTO, RedirectAttributes redirectAttributes) {
quoteService.saveAllGetSampleClass4DTO(quoteDTO.quoteId, quoteDTO.userId);
}
}
service layer
========================
@Service
public class QuoteService {
@Transactional
public SampleClass4 saveAllGetSampleClass4(Long quoteId, Long userId) {
SampleClass1 sampleClass1 = new SampleClass1();
sampleClass1.setQuoteId(quoteId);
sampleRepository1.saveAndFlush(sampleClass1);
SampleClass2 sampleClass2 = new SampleClass2();
sampleClass2.setQuoteId(quoteId);
sampleRepository2.saveAndFlush(sampleClass2);
SampleClass3 sampleClass3 = new SampleClass3();
sampleClass3.setQuoteId(quoteId);
sampleRepository3.saveAndFlush(sampleClass3);
SampleClass4 sampleClass4 = new SampleClass4();
sampleClass4.setQuoteId(quoteId);
sampleClass4=sampleRepository4.saveAndFlush(sampleClass4);
}
@Transactional
public SampleClass4DTO saveAllGetSampleClass4DTO(Long quoteId, Long userId) {
SampleClass1 sampleClass1 = new SampleClass1();
sampleClass1.setQuoteId(quoteId);
sampleRepository1.saveAndFlush(sampleClass1);
SampleClass2 sampleClass2 = new SampleClass2();
sampleClass2.setQuoteId(quoteId);
sampleRepository2.saveAndFlush(sampleClass2);
SampleClass3 sampleClass3 = new SampleClass3();
sampleClass3.setQuoteId(quoteId);
sampleRepository3.saveAndFlush(sampleClass3);
SampleClass4 sampleClass4 = new SampleClass4();
sampleClass4.setQuoteId(quoteId);
sampleClass4=sampleRepository4.saveAndFlush(sampleClass4);
SampleClass4DTO dto=SampleClass4DTO.valueOf(sampleClass4);
return dto;
}
}