2015-06-19 3 views
3

Как я понимаю, я хочу следовать наилучшей практике для освобождения ресурсов в конце, чтобы предотвратить утечку соединения. Вот мой код в HelperClass.блок try-catch-finally в java

public static DynamoDB getDynamoDBConnection() 
{ 
    try 
    { 
     dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider())); 
    } 
    catch(AmazonServiceException ase) 
    { 
     //ase.printStackTrace(); 
     slf4jLogger.error(ase.getMessage()); 
     slf4jLogger.error(ase.getStackTrace()); 
     slf4jLogger.error(ase); 
    } 
    catch (Exception e) 
    { 
     slf4jLogger.error(e); 
     slf4jLogger.error(e.getStackTrace()); 
     slf4jLogger.error(e.getMessage()); 
    } 
    finally 
    { 
     dynamoDB.shutdown(); 
    } 
    return dynamoDB; 
} 

Мои сомнения, так как наконец блок будет выполняться независимо от того, что, будет ли dynamoDB возвращает пустое соединение, так как оно будет закрыто в наконец блока, а затем выполнить обратный заявление? ТИА.

+2

Что происходит, когда вы пытаетесь? –

+3

Лучше сделать нулевую проверку на dynamoDB перед вызовом dynamoDB.shutdown(); – paramupk

+0

dynamoDB выключается независимо от того, происходит ли исключение или нет. Вы только завершаете работу после его использования. Если вы хотите только подключение, почему вам даже нужно отключить его, поскольку у вас не будет соединения, если что-то пойдет не так и выбрасывает нуль исключение указателя, и если вы получаете соединение, почему вы хотите завершить работу? – geddamsatish

ответ

8

Ваше понимание верности. dynamoBD.shutdown() всегда будет выполняться до return dynamoDB.

Я не знаком со структурой вы работаете, но я бы, вероятно, организовать код следующим образом:

public static DynamoDB getDynamoDBConnection() 
     throws ApplicationSpecificException { 
    try { 
     return new DynamoDB(new AmazonDynamoDBClient(
            new ProfileCredentialsProvider())); 
    } catch(AmazonServiceException ase) { 
     slf4jLogger.error(ase.getMessage()); 
     slf4jLogger.error(ase.getStackTrace()); 
     slf4jLogger.error(ase); 
     throw new ApplicationSpecificException("some good message", ase); 
    } 
} 

и использовать его в качестве

DynamoDB con = null; 
try { 
    con = getDynamoDBConnection(); 
    // Do whatever you need to do with con 
} catch (ApplicationSpecificException e) { 
    // deal with it gracefully 
} finally { 
    if (con != null) 
     con.shutdown(); 
} 

Вы можете также создать AutoCloseable обертка для подключения dynamoDB (что вызывает shutdown внутри close) и сделать

try (DynamoDB con = getDynamoDBConnection()) { 
    // Do whatever you need to do with con 
} catch (ApplicationSpecificException e) { 
    // deal with it gracefully 
} 
+0

Большое вам спасибо. Я должен изучить здесь, что мне не нужно беспокоиться о том, чтобы освободить соединение в том месте, где я его получаю. (т. е. здесь, в моем случае это из вызова вспомогательного класса, public static DynamoDB getDynamoDBConnection(). Но я должен беспокоиться о закрытии соединения в том месте, где я его фактически использую. Большое спасибо. – Chandz

1

Да, dynamoDB вернет пустое соединение, так как dynamoBD.shutdow() будет выполнен перед оператором return, Always.

+0

Большое спасибо – Chandz

0

Как насчет того, чтобы мы «подражали» ошибке и видели, что происходит? Это то, что я имею в виду:

___Case 1___

try{ 
    // dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider())); 
    throw new AmazonServiceException("Whatever parameters required to instantiate this exception"); 
} catch(AmazonServiceException ase) 
    { 
     //ase.printStackTrace(); 
     slf4jLogger.error(ase.getMessage()); 
     slf4jLogger.error(ase.getStackTrace()); 
     slf4jLogger.error(ase); 

    } 
    catch (Exception e) 
    { 
     slf4jLogger.error(e); 
     slf4jLogger.error(e.getStackTrace()); 
     slf4jLogger.error(e.getMessage()); 
    } 
    finally 
    { 
     //dynamoDB.shutdown(); 
     slf4jLogger.info("Database gracefully shutdowned"); 
    } 

___Case 2___

try{ 
    // dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider())); 
    throw new Exception("Whatever parameters required to instantiate this exception"); 
} catch(AmazonServiceException ase) 
    { 
     //ase.printStackTrace(); 
     slf4jLogger.error(ase.getMessage()); 
     slf4jLogger.error(ase.getStackTrace()); 
     slf4jLogger.error(ase); 

    } 
    catch (Exception e) 
    { 
     slf4jLogger.error(e); 
     slf4jLogger.error(e.getStackTrace()); 
     slf4jLogger.error(e.getMessage()); 
    } 
    finally 
    { 
     //dynamoDB.shutdown(); 
     slf4jLogger.info("Database gracefully shutdowned"); 
    } 

Это упражнение может быть идеальным местом для использования модульных тестов и более конкретно mock tests. Я предлагаю вам внимательно ознакомиться с JMockit, что поможет вам легче написать такие тесты.

1

Хотя я не отвечаю на ваш вопрос о том, что окончательный блок выполняется всегда (есть несколько ответов на этот вопрос), я хотел бы поделиться некоторой информацией о том, как будут использоваться клиенты DynamoDB.

Клиент DynamoDB является потокобезопасным объектом и предназначен для совместного использования несколькими потоками - вы можете создать глобальный для своего приложения и повторно использовать объект, когда он вам понадобится. Как правило, создание клиента управляется каким-то контейнером IoC (например, контейнер Spring IoC), а затем предоставляется контейнером в любой код, который нуждается в нем через инъекцию зависимостей.

Под капотом клиент DynamoDB поддерживает пул соединений HTTP для связи конечной точки DynamoDB и использует соединения из этого пула. Различные параметры пула можно настроить, передав экземпляр объекта ClientConfiguration при построении клиента. Например, одним из параметров является максимальное допустимое количество открытых HTTP-соединений.

С учетом вышеизложенного я бы сказал, что, поскольку клиент DynamoDB управляет жизненным циклом HTTP-соединений, утечки ресурсов не должны действительно быть причиной кода, использующего клиента DynamoDB.

Смежные вопросы