Before the version 1.2.2, sqllin-dsl can't ensure the concurrency safety. If
you want to share a Database instance between different threads, that would lead to
unpredictable consequences. So, the best way is when you want to operate your
database, create a Database instance, and when you finish your operating, close it immediately.
But, that's very inconvenient, we always have to create a database connection and
close it frequently, this is a waste of resources. For example, if we are developing
an Android app, and in a single page (Activity/Fragment), we hope we can keep a
Database instance, when we want to operate the database in background threads (or
coroutines), just use it, and, close it in certain lifecycle
functions (onDestroy, onStop, etc.).
At that time, we should make sure the concurrency safety that we share the Database
instance between different threads (or coroutines). So, start with the version 1.2.2, we can
use the new API Database#suspendedScope to replace the usage of database {}. For
example, if we have some old code:
fun sample() {
database {
PersonTable { table ->
table INSERT Person(age = 4, name = "Tom")
table INSERT listOf(
Person(age = 10, name = "Nick"),
Person(age = 3, name = "Jerry"),
Person(age = 8, name = "Jack"),
)
}
}
}We use the new API Database#suspendedScope to replace the database {}, it will be like that:
fun sample() {
database suspendScope {
PersonTable { table ->
table INSERT Person(age = 4, name = "Tom")
table INSERT listOf(
Person(age = 10, name = "Nick"),
Person(age = 3, name = "Jerry"),
Person(age = 8, name = "Jack"),
)
}
}
}The suspendedScope is a suspend function. Inside the suspendedScope, the all operations are
atomic. That means: If you share the same Database instance between two coroutines, it can ensure the
suspendedScope executing later will wait for the one executing earlier to finish.