2013-04-10 3 views
2

JDBC ввел метод, называемый closeOnAutoCompletion, в котором говорится, что он закрывает инструкцию, когда все зависимые результирующие наборы близки.MySQL JDBC closeOnCompletion не влияет на PreparedStatement

У меня есть метод, чтобы создать подготовленные заявления

public final PreparedStatement statement(Connection connection) throws SQLException { 
    PreparedStatement stmt = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, 
      ResultSet.CONCUR_READ_ONLY); 
    stmt.closeOnCompletion(); 
    return stmt; 
} 

Нет, я звоню этот метод следующим образом

@Test 
public void testCloseOnCompletionSemiManually() throws SQLException { 
    PreparedStatement stmt = shards.statement(db); 
    assertTrue("Statement must be closeOnAutoCompletion", stmt.isCloseOnCompletion()); 

    try (ResultSet rs = stmt.executeQuery()) { 
     while (rs.next()) { 
      //System.out.println("Shard id: " + rs.getInt("SHARD_ID")); 
     } 
    } 
    assertTrue("Statement must be closed after all results sets have been processed", stmt.isClosed()); 
} 

Последняя проверка не удалась, поскольку заявление не закрывается.

Это проблема из-за реализации mysql? Или я не понимаю, что такое JavaDoc.

Update: Я использую версию 5.1.24

спасибо, MUKI

+0

Возможно, закрытие асинхронно? Попробуйте спать некоторое время после выхода из условия try. Если это не поможет вам найти ошибку :) –

+0

Это вполне возможно, что драйвер MySQL еще не реализовал это. –

+0

Это правда, что реализация очень новая. Однако я хочу проверить, что я делаю что-то не так, прежде чем открывать ошибку – Muki

ответ

2

Водитель еще не поддерживает, тем не менее, этот тест не из тех. Обратите внимание, что в документах API для оператора указано, что closeOnCompletion() закрывает оператор, когда все зависимые результирующие наборы закрыты, но не прокручиваются за конец, поэтому я не уверен, какое поведение, как предполагается, происходит в вашем случае.

+0

Он использует try-with-resources. Java автоматически вызовет метод 'ResultSet.close()' в конце блока try. –

+0

BTW: Откуда вы знаете, что это не поддерживает, сообщение о выпуске [5.1.21] (http://forums.mysql.com/read.php?3,559877,559877), кажется, указывает, что оно поддерживается –

+0

Я посмотрел на реализацию (5.1.24), и реализация кажется скорее заполнитель. Флаг плюс API-методы. Моя IDE не смогла найти какие-либо способы использования методов/флагов внутри драйвера mysql. Относительно испытания. Результирующий набор закрыт. Я также проверил, есть ли другие открытые наборы результатов. Неа. Поэтому это должно работать, поскольку это самый простой вариант использования. – Muki

-1

Согласно this announcement, версия 5.1.21 из MySQL Connector/J (официальное название драйвера JDBC для MySQL) должен поддерживать closeOnAutoCompletion. Вы можете проверить, используете ли вы эту версию?

+0

Он использует новую функцию java 7 - http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html –

+2

«ResultSet» закрывается блоком try-with-resources; если 'closeOnCompletion' правильно реализовано, это должно привести к закрытию' Statement'. –

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