Драйвер CachedRowSet и SQLite JDBC

Я пытаюсь использовать CachedRowSet с драйвером SQLite и Xerial https://bitbucket.org/xerial/sqlite-jdbc .

Если я вызову метод execute() следующим образом:

  Connection connection = DriverManager.getConnection("jdbc:sqlite:sample.db");
  CachedRowSet crs = new CachedRowSetImpl();
  crs.setCommand("select * from person");
  crs.execute(connection);

Я получаю SQLException "не реализовано драйвером SQLite JDBC":

    at com.sun.rowset.internal.CachedRowSetReader.readData(Unknown Source)
    at com.sun.rowset.CachedRowSetImpl.execute(Unknown Source)
    at com.sun.rowset.CachedRowSetImpl.execute(Unknown Source)
    at com.oracle.tutorial.jdbc.CachedRowSetSample.testPaging(CachedRowSetSample.java:100)
    at com.oracle.tutorial.jdbc.CachedRowSetSample.main(CachedRowSetSample.java:273)

с другой стороны, ResultSet и populate() вместо excecute() работают нормально:

  Connection connection = DriverManager.getConnection("jdbc:sqlite:sample.db");
  statement = connection.createStatement();
  ResultSet rs = statement.executeQuery("select * from person");
  CachedRowSet crs = new CachedRowSetImpl();
  crs.populate(rs);

Кто-нибудь знает, что не так с execute()?


person Annie W.    schedule 13.05.2017    source источник
comment
Пожалуйста, опубликуйте полную трассировку стека исключений. Также: почему вы хотите использовать CachedRowSet, на мой взгляд, это довольно глючно и редко полезно.   -  person Mark Rotteveel    schedule 14.05.2017
comment
приведенное выше исключение взято из примера оракула, я сократил кодировку, и здесь полное исключение, но, на мой взгляд, новой информации нет: Exception in thread "main" java.sql.SQLException: not implemented by SQLite JDBC driver at com.sun.rowset.internal.CachedRowSetReader.readData(Unknown Source) at com.sun.rowset.CachedRowSetImpl.execute(Unknown Source) at First.rowSet1(First.java:33) at First.main(First.java:79)   -  person Annie W.    schedule 14.05.2017
comment
Я ожидал бы, что причина исключения, которая включает в себя, какой метод вызывается в драйвере SQLite, который фактически выдает то, что не реализовано драйвером JDBC SQLite, но глядя на фактический код в CachedRowSetReader, он выдает новое исключение с сообщением об исходном исключении без установки причина исключения... Как я уже сказал: на мой взгляд, это довольно глючно и редко полезно.   -  person Mark Rotteveel    schedule 14.05.2017
comment
Большое спасибо за ваш ответ, какую нативную реализацию отключенного RowSet вы рекомендуете?   -  person Annie W.    schedule 14.05.2017
comment
Я думаю, что эта проблема может быть специфичной для SQLite, учебник по оракулу нормально работает с MySql. Возможно, какие-то параметры важны при установлении соединения с SQLite?   -  person Annie W.    schedule 14.05.2017


Ответы (1)


К сожалению, есть несколько функций JDBC, для которых вам придется реализовать обходные пути при использовании SQLite. Это оказывается одним из них. Вероятно, лучшее альтернативное решение — поместить весь набор результатов в List‹> и работать с ним:

// Variables. 
final int TIMEOUT_DEFAULT=30;
String query = "select * from person";
ResultSet rs;
Statement statement;
List<String[]> people;

...

// Create query and execute. (Connection established, database open.)
try {                
    statement = connection.createStatement();
    statement.setQueryTimeout(TIMEOUT_DEFAULT);
    connection.setAutoCommit(true);
    rs = statement.executeQuery(query);  
} catch (SQLException e) {
    // If error, close connection & ignore close errors.
    try { connection.close(); } 
        catch (SQLException e2) { /* Ignore */ }
    // Throw new error.
    throw new SQLException("Query failed",e);
}

// Retrieve results.
try {
    people = new ArrayList<>();
    while (rs.next()) {
        people.add(new String[]{
            rs.getString(1), rs.getString(2), rs.getString(3)
        });
    }
} catch (SQLException e) {
    // If error, close connection & ignore close errors.
    try { connection.close(); } 
        catch (SQLException e2) { /* Ignore */ }
    // Throw new error.
    throw new SQLException("Error retrieving data",e);
}

// Close connection, ignore error.
try { 
    connection.close(); 
} catch (SQLException e) { /* Ignore */ }

// Print output.
for (String[] p : people) {
    System.out.println(Arrays.deepToString(p));
}

Ответ в этом сообщении содержит комментарий о моделировании функции, если она не поддерживается вашим драйвером.

person J. Hanney    schedule 15.05.2017