I’m trying to do the connection pooling and caching tutorial under Ktor doc:
connection pooling and caching tutorial
I keep getting this error:
Exception in thread "main" io.ktor.server.config.ApplicationConfigurationException: Property storage.driverClassName not found.
at io.ktor.server.config.HoconApplicationConfig.property(HoconApplicationConfig.kt:47)
at io.ktor.server.config.MergedApplicationConfig.property(MergedApplicationConfig.kt:47)
at io.ktor.server.config.MergedApplicationConfig.property(MergedApplicationConfig.kt:47)
at com.samordonez.dao.DatabaseSingleton.init(DatabaseSingleton.kt:14)
at com.samordonez.ApplicationKt.module(Application.kt:11)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97)
at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Static.call(CallerImpl.kt:106)
at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:188)
at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:111)
at io.ktor.server.engine.internal.CallableUtilsKt.callFunctionWithInjection(CallableUtils.kt:119)
at io.ktor.server.engine.internal.CallableUtilsKt.executeModuleFunction(CallableUtils.kt:36)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$launchModuleByName$1.invoke(ApplicationEngineEnvironmentReloading.kt:332)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$launchModuleByName$1.invoke(ApplicationEngineEnvironmentReloading.kt:331)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.avoidingDoubleStartupFor(ApplicationEngineEnvironmentReloading.kt:356)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.launchModuleByName(ApplicationEngineEnvironmentReloading.kt:331)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.access$launchModuleByName(ApplicationEngineEnvironmentReloading.kt:32)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$instantiateAndConfigureApplication$1.invoke(ApplicationEngineEnvironmentReloading.kt:312)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$instantiateAndConfigureApplication$1.invoke(ApplicationEngineEnvironmentReloading.kt:310)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.avoidingDoubleStartup(ApplicationEngineEnvironmentReloading.kt:338)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.instantiateAndConfigureApplication(ApplicationEngineEnvironmentReloading.kt:310)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.createApplication(ApplicationEngineEnvironmentReloading.kt:150)
at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.start(ApplicationEngineEnvironmentReloading.kt:277)
at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:216)
at io.ktor.server.netty.EngineMain.main(EngineMain.kt:23)
at com.samordonez.ApplicationKt.main(Application.kt:8)
Here’s my DatabaseSingleton.kt
package com.samordonez.dao
import com.samordonez.models.*
import com.zaxxer.hikari.*
import io.ktor.server.config.*
import kotlinx.coroutines.*
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.*
import org.jetbrains.exposed.sql.transactions.experimental.*
import java.io.*
object DatabaseSingleton {
fun init(config: ApplicationConfig) {
val driverClassName = config.property("storage.driverClassName").getString()
val jdbcURL = config.property("storage.jdbcURL").getString() +
(config.propertyOrNull("storage.dbFilePath")?.getString()?.let {
File(it).canonicalFile.absolutePath
} ?: "")
val database = Database.connect(createHikariDataSource(url = jdbcURL, driver = driverClassName))
transaction(database) {
SchemaUtils.create(Articles)
}
}
private fun createHikariDataSource(
url: String,
driver: String
) = HikariDataSource(HikariConfig().apply {
driverClassName = driver
jdbcUrl = url
maximumPoolSize = 3
isAutoCommit = false
transactionIsolation = "TRANSACTION_REPEATABLE_READ"
validate()
})
suspend fun <T> dbQuery(block: suspend () -> T): T =
newSuspendedTransaction(Dispatchers.IO) { block() }
}
And here’s my application.conf file
ktor {
deployment {
port = 8080
port = ${?PORT}
}
application {
modules = [ com.samordonez.ApplicationKt.module ]
}
storage {
driverClassName = "org.h2.Driver"
jdbcURL = "jdbc:h2:file:"
dbFilePath = build/db
ehcacheFilePath = build/ehcache
}
}
-
What am I missing here?
-
It’s saying driverClassName is missing but, I think, it was already handled under my application.conf