синглтон в искровой скале на карте - PullRequest
0 голосов
/ 16 октября 2018

У меня есть сценарий использования, где мне нужно записать в базу данных postgres из spark,

Я прочитал входящий файл в rdd, мой окончательный результат - rdd, который я могу записать в postgres. Внутри rddФункция карты Я пытаюсь создать шаблон jdbc и записать его в postgres. Я хочу, чтобы мой шаблон jdbc был синглтоном, а я сделал jdbctemplate как Object.But, но он по-прежнему не работает и открывает слишком много соединений.

rddToPostgres.map(postgresdata => toPostgresDatabase(r))




toPostgresDatabase(postgresdata:Row) {

var dataToLoad = new MapSqlParameterSource().addValue("Nifi_Param",postgresdata.getAs("Nifi_Param")

var insertStatement = "insert in to postgresschema.nifitab(nifi_param) values(:nifi_param)"

new JdbcTemplate().getJdbcConn().update(insertStatement,dataToLoad)

}

}

Object JdbcTemplate(){


def getJdbcConn() {

new NamedParameterJdbcTemplate(new DriverManagerDataSource().setDriverClassName().setPassword("XXXXX").setUsername("XXXXX"));
}

, хотя JdbcTemplate является синглтоном, поскольку он определен. Объект, который вызывается несколько раз, может кто-нибудь подсказать, как создать синглтон в scala и использовать его внутри rdd.map?

1 Ответ

0 голосов
/ 18 октября 2018

Поскольку getJdbcConn является функцией (def), она оценивается при каждом вызове.Если вы сделаете его val, он будет оцениваться только один раз.

Кроме того, нет необходимости создавать экземпляр объекта с помощью new.

object JdbcTemplate {
  val jdbcConnection = new NamedParameterJdbcTemplate(new DriverManagerDataSource().setDriverClassName().setPassword("....").setUsername("....")
}

rddToPostgres.map { postgresData: Row =>
  val dataToLoad = new MapSqlParameterSource().addValue("Nifi_Param", postgresData.getAs("Nifi_Param"))
  val insertStatement = "insert in to postgresschema.nifitab(nifi_param) values(:nifi_param)"

  JdbcTemplate.jdbcConnection.update(insertStatement, dataToLoad)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...