Как создать отсутствующее представление базы данных в Derby?

Я хотел бы создать представление в СУБД Derby при запуске моего веб-приложения (ApplicationListener.contextInitialized), если оно еще не существует. На данный момент транзакции нет, поэтому я должен использовать JDBC и SQL. Мои попытки с DatabaseMetaData.getTables() не увенчались успехом. Он всегда возвращает пустой набор результатов, но я вижу на вкладке «Службы» в NetBeans, что он определенно существует (а также запрошенная таблица). Код:

public isDBViewExists( Connection conn_, String catalogName_, String schemaName_, String viewName_ ) throws SQLException
{
  conn_.setAutoCommit( false );
  DatabaseMetaData metadata = conn_.getMetaData();
  ResultSet rs = metadata.getTables( catalogName_, schemaName_, viewName_, new String[] { "VIEW" } );
  return rs.next();
}

Соединение, созданное внедренным ресурсом DataSource в обработчике событий контекста приложения:

@Resource( name="jdbc/x" )
DataSource ds;
...
try
{
  Connection conn = ds.getConnection();
  if ( isDBViewExists( conn, ... ) )
  ...
}
finally
{
  conn.close();
}

Все переданные имена указаны в верхнем регистре (каталог, схема, представление/таблица). conn_ не равно нулю. В чем я виновата?


person The Bitman    schedule 06.03.2016    source источник


Ответы (1)


В этом случае, вероятно, проще просто создать таблицу и игнорировать SQLException, которое возвращается, если таблица уже существует. Пусть БД позаботится о том, чтобы проверить, существует ли уже таблица.

Например:

Connection conn = ds.getConnection()
try {
  conn.createStatement().executeUpdate("CREATE TABLE ....");
} finally {
  conn.close();
} catch(SQLException ignore) {
  // ignore exception, not much can go wrong here except for the table already existing.

  // If you don't mind making vendor specific logic, check the error message for "already exists" or some equivalent
  if(!ignore.getMessage().contains("already exists"))
    throw ignore;
}
person Andy Guibert    schedule 06.03.2016