When using Database.nonBlocking() and not providing a custom scheduler the ExecutorService created is never shutdown. This will prevent JVM shutdown. The responsibility to close it lies in the library because it is created there. It is also impossible to access it through getters from the outside so closing it by hand is only possible using some weird reflection.
val db = Database.nonBlocking().build()
// use at least one connection
db.close()
// ExecutorService still running and never stopped