Skip to content

Commit

Permalink
improve reconnect feature
Browse files Browse the repository at this point in the history
  • Loading branch information
InsanusMokrassar committed Sep 4, 2022
1 parent dfbc7be commit 7637187
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.inmo.plagubot.config

import kotlinx.serialization.Serializable

@Serializable
data class DBConnectOptions(
val attempts: Int = 3,
val delay: Long = 1000L
)
40 changes: 18 additions & 22 deletions bot/src/main/kotlin/dev/inmo/plagubot/config/DatabaseConfig.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package dev.inmo.plagubot.config

import dev.inmo.kslog.common.e
import dev.inmo.kslog.common.logger
import kotlinx.coroutines.delay
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import org.jetbrains.exposed.sql.Database
Expand All @@ -18,29 +21,22 @@ data class DatabaseConfig(
val driver: String = JDBC::class.qualifiedName!!,
val username: String = "",
val password: String = "",
val waitForConnection: Boolean = true
val reconnectOptions: DBConnectOptions? = DBConnectOptions()
) {
@Transient
val database: Database by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
while (true) {
return@lazy try {
Database.connect(
url,
driver,
username,
password
).also {
it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED
}
} catch (e: Throwable) {
if (waitForConnection) {
Thread.sleep(1000L)
continue
} else {
throw e
}
val database: Database = (0 until (reconnectOptions ?.attempts ?: 1)).firstNotNullOfOrNull {
runCatching {
Database.connect(
url,
driver,
username,
password
).also {
it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED
}
}
error("Unable to get database by some reason")
}
}.onFailure {
logger.e(it)
Thread.sleep(reconnectOptions ?.delay ?: return@onFailure)
}.getOrNull()
} ?: error("Unable to create database")
}
5 changes: 4 additions & 1 deletion template.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
"driver": "org.sqlite.JDBC",
"username": "OPTIONAL username",
"password": "OPTIONAL password",
"waitForConnection": true
"reconnectOptions": {
"attempts": 3,
"delay": 1000
}
},
"botToken": "1234567890:ABCDEFGHIJKLMNOP_qrstuvwxyz12345678",
"plugins": [
Expand Down

0 comments on commit 7637187

Please sign in to comment.