Как вернуть соединение из класса соединений JDB C, используя обработку исключений Scala? - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь создать программу Scala JDB C, в которой выполняется соединение с Hive. Чтобы сделать это, я написал следующий код:

var HIVECON: Connection = null
def hiveConnection(): Connection = {
    val conf = new Configuration()
    conf.set("hadoop.security.authentication", "Kerberos")

    // DEV System Properties
    System.setProperty("java.security.krb5.kdc", "ip-address.ec2.internal");
    System.setProperty("java.security.krb5.realm", "DEV.COM");
    // DEV System Properties

    // DEV loginUserFromKeytab
    UserGroupInformation.loginUserFromKeytab("username@DEV.COM", "/home/username/username.keytab");
    // DEV loginUserFromKeytab

    try {
        Class.forName("org.apache.hive.jdbc.HiveDriver")
        if(HIVECON == null || HIVECON.isClosed)
            HIVECON = DriverManager.getConnection("jdbc:hive2://ip-address.ec2.internal:10500/dbname;principal=hive/ip-address.ec2.internal@DEV.COM", "username","password")
        else HIVECON
    } catch {
        case s:SQLException => s.printStackTrace()
        case e:Exception    => e.printStackTrace()
    }
}

Но код выдает ошибку компиляции в этих строках: enter image description here

С тем, как я написал операторы catch возвращают UNIT, где мой метод пытается вернуть CONNECTION. Есть ли способ лучше обработать исключение?

Ответы [ 2 ]

4 голосов
/ 20 января 2020

Я бы обработал Исключение функциональным образом.

Если вас не интересует конкретизация c Использование исключения Option:

var HIVECON: Option[Connection] = None
def hiveConnection(): Option[Connection] = {
    ...
    try {
        Class.forName("org.apache.hive.jdbc.HiveDriver")

        if(HIVECON == None || HIVECON.get.isClosed)
            HIVECON = Some(DriverManager.getConnection("jdbc:hive2://ip-address.ec2.internal:10500/dbname;principal=hive/ip-address.ec2.internal@DEV.COM", "username","password"))
         HIVECON // return Some(Connection)
    } catch {
        case s:Exception => 
           s.printStackTrace()
           None
    }

Если вы заботитесь об Исключении используйте Try:

var HIVECON: Connection = null
def hiveConnection(): Try[Connection] = {
    ...
    Try {
        Class.forName("org.apache.hive.jdbc.HiveDriver")

        if(HIVECON == null || HIVECON.isClosed)
            HIVECON = DriverManager.getConnection("jdbc:hive2://ip-address.ec2.internal:10500/dbname;principal=hive/ip-address.ec2.internal@DEV.COM", "username","password")
         HIVECON // return Success(Connection)
    }

В случае сбоя возвращается Failure(Exception).

См. здесь документы: https://docs.scala-lang.org/overviews/scala-book/functional-error-handling.html

0 голосов
/ 20 января 2020

Рассмотрим scala.util.Using, который «из коробки» оборачивает управление ресурсами в Try

lazy val hiveConn = {
  Class.forName("org.apache.hive.jdbc.HiveDriver")
  DriverManager.getConnection("jdbc:hive2://ip-address.ec2.internal:10500/dbname;principal=hive/ip-address.ec2.internal@DEV.COM", "username","password")
}

Using(hiveConn) { conn =>
  // do stuff with conn
  42
} match {
  case Success(v) => ???
  case Failure(error) => ???
}
...