Metadata
Metadata

Reputation: 2083

How to return connection from a JDBC connection class using Scala's exception handling?

I am trying to create a Scala JDBC program where a connection to Hive is being made. To do this, I wrote the below code.

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("[email protected]", "/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/[email protected]", "username","password")
        else HIVECON
    } catch {
        case s:SQLException => s.printStackTrace()
        case e:Exception    => e.printStackTrace()
    }
}

But the code gives a compilation error at these lines: enter image description here

With the way I wrote, the catch statements are returning UNIT where my method is trying to return CONNECTION. Is there any way to handle the exception better ?

Upvotes: 1

Views: 303

Answers (1)

pme
pme

Reputation: 14803

I would handle the Exception in a functional way.

If you do not care about specific Exception use 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/[email protected]", "username","password"))
         HIVECON // return Some(Connection)
    } catch {
        case s:Exception => 
           s.printStackTrace()
           None
    }

If you care for the Exception use 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/[email protected]", "username","password")
         HIVECON // return Success(Connection)
    }

In case of a Failure it returns Failure(Exception).

See here the Docs: https://docs.scala-lang.org/overviews/scala-book/functional-error-handling.html

Upvotes: 4

Related Questions