flowable/flowable-engine · critical · FlowableException
Flowable database problem: ${errorMessage}
Error message
Flowable database problem: ${errorMessage} What it means
After a successful version check, schemaCheckVersion verifies that the engine's tables are present; if not, it throws 'Flowable database problem: <missing component>'. The connected database lacks the required Flowable tables.
Source
Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/db/EngineSqlScriptBasedDbSchemaManager.java:61
protected abstract String getDbVersionForChangelogVersion(String changeLogVersion);
@Override
public void schemaCheckVersion() {
try {
String dbVersion = getDbVersion();
String currentVersion = getEngineVersion();
if (!currentVersion.equals(dbVersion)) {
throw new FlowableWrongDbException(currentVersion, dbVersion);
}
String errorMessage = null;
if (!isEngineTablePresent()) {
errorMessage = addMissingComponent(errorMessage, context);
}
if (errorMessage != null) {
throw new FlowableException("Flowable database problem: " + errorMessage);
}
} catch (Exception e) {
if (isMissingTablesException(e)) {
throw new FlowableException(
"No flowable tables in DB. Set property \"databaseSchemaUpdate\" \"true\" or value=\"create-drop\" (use create-drop for testing only!) for automatic schema creation",
e);
} else {
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
} else {
throw new FlowableException("couldn't get " + context + " db schema version", e);
}
}
}
logger.debug("flowable {} db schema check successful", context);
}View on GitHub (pinned to d6d39ce1c6)
Solutions
- Set databaseSchemaUpdate=true (or "create-drop" in tests) to create missing tables automatically.
- Run the DDL create scripts (org/flowable/db/create/*) manually for your database.
- Verify the JDBC URL points to the intended database/schema where tables exist.
- Check the DB user has SELECT on the metadata/tables and the tables aren't in another schema.
Example fix
// before <property name="databaseSchemaUpdate" value="false" /> // empty DB // after <property name="databaseSchemaUpdate" value="true" />
Defensive patterns
Strategy: validation
Validate before calling
try (Connection c = dataSource.getConnection(); ResultSet rs = c.getMetaData().getTables(null, null, "ACT_GE_PROPERTY", new String[]{"TABLE"})) {
if (!rs.next()) throw new IllegalStateException("Flowable tables missing; run schema creation first");
} Try / catch
try { engineConfiguration.buildProcessEngine(); }
catch (FlowableException e) {
if (e.getMessage().startsWith("Flowable database problem") || e.getMessage().contains("No flowable tables in DB")) { /* create schema or fix JDBC URL */ }
throw e;
} Prevention
- Use databaseSchemaUpdate=true (or create-drop in tests) for fresh environments.
- Confirm the JDBC URL/schema points where the tables actually live.
- Run DDL scripts manually in environments where auto-update is disabled.
- Verify DB grants allow reading system tables for the existence check.
When it happens
Trigger: Starting an engine against an empty or wrong database with databaseSchemaUpdate=false; tables were dropped; wrong schema/catalog selected so the table-existence check fails.
Common situations: Fresh environment where schema creation was never run; user connected to a different database/schema than intended; partial schema creation left the DB without engine tables.
Related errors
- Could not set database schema on connection
- No flowable tables in DB. Set property "databaseSchemaUpdate
- Schema version property is not set
- Flowable database problem: ${errorMessage}
- no flowable tables in db. set <property name="databaseSchema
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/e745813956648ea4.
Report an issue: GitHub.