#kotlin #ktor
#kotlin #ktor
Вопрос:
Я работаю над некоторым кодом, в котором я создаю HikariDataSource как по отложенному значению. Я применил режим LazyThreadSafetyMode.СИНХРОНИЗИРОВАНО, поэтому я не понимаю, почему инициализация выполняется дважды, когда я запускаю новый поток, который считывает это значение
// in module database
val dataSource: HikariDataSource by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
HikariDataSource(dataSourceConfig(databaseConfig))
}
fun initDatabase() {
dataSource.connect().let { //do stuff}
}
// in main module
fun main() {
initDatabase()
thread {
dataSource.connect().let { // initializes a new data source... }
}
}
Я бы ожидал, что HikariDataSource будет инициализирован один раз, но по какой-то причине он вызывается дважды…
Я думаю, что тот факт, что я предоставляю эту переменную другому проекту gradle, может повлиять на это, но не уверен, почему..
Ответ №1:
Ну, я думаю, я только что ответил на свой вопрос…
Основным модулем, который обращается к объекту источника данных, является сервер ktor, который был настроен для горячей перезагрузки .. Как только я отключил горячую загрузку и повторил попытку, переменная не была инициализирована дважды.
Я предполагаю, что ktor что-то делает с загрузчиком классов для горячей перезагрузки, из-за чего это происходит.
Комментарии:
1. Это спасает жизнь. Такая неприятная проблема.