Posts

Spring application events lifecycle and earlyApplicationEvents

Not long ago I learned the hard way the way spring handles earlyApplication events when we started having problems in one of our projectsBasically we were using a MongoDB database as a cache layer, so when the application would startup we would pull most of the data from our RDBMS do some processing and denormalisation then fill the MongoDB with data The application had been running mostly fine for some time but we saw some memory issues as the data kept growing within the application and I suspected a Memory leak issue So I decided to do a java heap dump to try to see what was happening, and I found the culprit; way down the piping of spring the org.springframework.context.support.AbstractApplicationContext class had a private property earlyApplicationEvents that was keeping references to more than 3 million instances of BasicDBObject that were not Garbage collected even though they were no longer in scope and were already written to the databaseAfter scouring the internet a fellow …

Working with stateless session in hibernate and jpa

When doing heavy read-only operations in with the database it can be a good idea to take advantage of using Hibernate's Stateless SessionAs it name indicates this session does not keep state of the entities that it retrieves from the database and so it bypasses the L1 and L2 cacheThis can have significant performance impact on heavy DBA read operations (since the state of the entities is not bet tracked) @Component @Scope("prototype") public class SomeJpaService { public static final int SCROLL_STEP = 1000; @PersistenceContext private EntityManager entityManager; public void doInStatelessSession(){ LOGGER.info("ABOUT to perform Heavy read operation on DB"); StatelessSession statelessSession = entityManager.unwrap(Session.class).getSessionFactory().openStatelessSession(); try (ScrollableResults r = statelessSession .createQuery("SELECT c FROM Order c") .setReadOnly(true)…

Serving angular2 content from Spring Boot application

Recently I had to ship an Angular2/Angular4 application within a Spring boot WAR packaged application and I was having some issues when dealing with the the urls in the angular routes, since it goes through the DispatcherServlet I was getting 404 all over the place There are a few ways to handle this, below is my preferred solution : @Controller public class Angular2ViewController { @RequestMapping({"/books", "/login", "/admin", "/logout", "/configure"}) public String index() { return "forward:/index.html"; } } There you go, as easy as thatThe inconvenience about this solution is that you have to maintain a set of urls in your controller also

Editable combobox in HTML5 and bootstrap

Creating an editable combobox in HTML5Recently while reading the HTML5 specification I found out a new cool feature called datalist element
Which basically allows you to create an editable select form element by providing a list of possible values to an input whilst also allowing for new values to be provided (think of it as a basic auto-complete field)Below is an example of how to implement this :Select a color : Note that this is also compatible with Bootstrap 4 and 3

Custom converter for Mongodb and Spring Data for BigDecimal type

Recently I found that MongoDB does not support java's java.math.BigDecimal as you can read in the official spring data mongodb documentation As it turns out java.math.BigDecimal will be converted to java.lang.String when saved to the database and parsed back to BigDecimal which in most cases I guess it's alrightHowever as I found out things get broken when trying to perform range queries on this field such as : $gte, $lte you will get inconsistent results since MongoDB sees this as a StringLuckily this can be easily fixed by creating 2 custom converters (one for each side), below is how I've done it :1. Define custom converters by implementing the appropriate interface import org.springframework.core.convert.converter.Converter; import java.math.BigDecimal; public class BigDecimalToDoubleConverter implements Converter<BigDecimal, Double&gt { @Override public Double convert(BigDecimal source) { return source.doubleValue(); } } import org.spr…

Angular2 prevent ngboopstrap dialogs to close when clicking outside

The default behaviour for bootstrap modal dialogs is to close when you click outside the dialog however this is not always the desired behaviourWhen using Bootstrap 4 without the angular wrapper you need to add the data-backdrop='static' and data-keyboard="false" to the button in order to achieve this : If you are using the angular wrapper for bootstrap (and assuming you have your project already configured you can achieve this like so : export class MyComponent implements OnInit { constructor(private modalService: NgbModal) {} showDialog(): void { this.modalService.open(ModalDialog,{size: "lg",backdrop: 'static', keyboard: false}); } } And simply calling the showDialog() method from your template should do the trick

Prevent OSX from idle sleep

There are several ways to prevent an OSX system to sleep when idle such as the caffeine application or changing the parameters in the System preferencesHowever there is an even easier way to accomplish this without installing any extra apps, just open a terminal window and run the following command : pmset noidle You should see the following output : Preventing idle sleep (^C to exit)... Your OSX should now stay awake whilst pmset is running