flowable / flowable/flowable-engine
Multi-Tenancy with MultiSchemaSharedEngine with Flowable and Postgres DB
- 主要言語
- Java
- スター
- 9.5k
- フォーク
- 2.9k
- 平均マージ
- 7時間 8分
- マージ済み PR(30日)
- 2
説明
Hi,
We are trying to implement multi-tenancy with flowable (Multitenant with singleengine/multischema) using Postgres DB.
But when we try to register different tenants we get the below error :
lowable.common.engine.impl.db.CommonDbSchemaManager - SQL: drop table if exists ACT_GE_BYTEARRAY cascade
14:17:00.488 [main] DEBUG org.flowable.common.engine.impl.db.CommonDbSchemaManager - SQL: drop table if exists ACT_GE_PROPERTY cascade
14:17:00.490 [main] DEBUG org.flowable.common.engine.impl.db.CommonDbSchemaManager - flowable db schema drop for component common successful
14:17:00.517 [main] INFO org.flowable.common.engine.impl.db.CommonDbSchemaManager - performing create on common with resource org/flowable/common/db/create/flowable.postgres.create.common.sql
14:17:00.517 [main] DEBUG org.flowable.common.engine.impl.db.CommonDbSchemaManager - SQL: create table ACT_GE_PROPERTY (
NAME_ varchar(64),
VALUE_ varchar(300),
REV_ integer,
primary key (NAME_)
)
14:17:00.524 [main] ERROR org.flowable.common.engine.impl.db.CommonDbSchemaManager - problem during schema create, statement create table ACT_GE_PROPERTY (
NAME_ varchar(64),
VALUE_ varchar(300),
REV_ integer,
primary key (NAME_)
)
org.postgresql.util.PSQLException: ERROR: no schema has been selected to create in
Position: 14
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:329)
at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:315)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:291)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:286)
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.executeSchemaResource(AbstractSqlScriptBasedDbSchemaManager.java:314)
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.executeSchemaResource(AbstractSqlScriptBasedDbSchemaManager.java:227)
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.executeMandatorySchemaResource(AbstractSqlScriptBasedDbSchemaManager.java:215)
at org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager.internalDbSchemaCreate(ServiceSqlScriptBasedDbSchemaManager.java:49)
at org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager.schemaCreate(ServiceSqlScriptBasedDbSchemaManager.java:44)
at org.flowable.engine.impl.db.ProcessDbSchemaManager.schemaCreate(ProcessDbSchemaManager.java:91)
at org.flowable.engine.impl.cfg.multitenant.ExecuteSchemaOperationCommand.execute(ExecuteSchemaOperationCommand.java:51)
at org.flowable.engine.impl.cfg.multitenant.ExecuteSchemaOperationCommand.execute(ExecuteSchemaOperationCommand.java:28)
at org.flowable.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:67)
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:140)
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:114)
at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:72)
at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:26)
at org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:53)
at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:98)
at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:35)
at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56)
at org.flowable.engine.impl.cfg.multitenant.MultiSchemaMultiTenantProcessEngineConfiguration.createTenantSchema(MultiSchemaMultiTenantProcessEngineConfiguration.java:149)
at org.flowable.engine.impl.cfg.multitenant.MultiSchemaMultiTenantProcessEngineConfiguration.buildProcessEngine(MultiSchemaMultiTenantProcessEngineConfiguration.java:134)
at com.example.demo.MultiTenantProcessEngineConfiguration.buildProcessEngine(MultiTenantProcessEngineConfiguration.java:66)
at com.example.demo.MultiTenantProcessEngineConfiguration.(MultiTenantProcessEngineConfiguration.java:17)
at com.example.demo.TestFlowable.main(TestFlowable.java:6)
**Our sample code**
public ProcessEngine buildProcessEngine() {
MultiSchemaMultiTenantProcessEngineConfiguration config = new MultiSchemaMultiTenantProcessEngineConfiguration(tenantInfoHolder);
config.setDatabaseType(MultiSchemaMultiTenantProcessEngineConfiguration.DATABASE_TYPE_POSTGRES);
config.setDatabaseSchemaUpdate(MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_DROP_CREATE);
config.setAsyncExecutorActivate(true);
config.setDisableIdmEngine(true);
config.setDisableEventRegistry(true);
/* config.registerTenant("flowable", createDataSource("jdbc:h2:mem:flowable-flowable;DB_CLOSE_DELAY=1000", "sa", ""));
config.registerTenant("acme", createDataSource("jdbc:h2:mem:flowable-acme;DB_CLOSE_DELAY=1000", "sa", ""));
config.registerTenant("starkindustries", createDataSource("jdbc:h2:mem:flowable-stark;DB_CLOSE_DELAY=1000", "sa", ""));
return config.buildProcessEngine();
}
private DataSource createDataSource(String jdbcUrl, String jdbcUsername, String jdbcPassword) {
JdbcDataSource ds = new JdbcDataSource();
ds.setURL(jdbcUrl);
ds.setUser(jdbcUsername);
ds.setPassword(jdbcPassword);
return ds;
}
*/
config.registerTenant("flowable", createDataSource("flowable", "postgres", "postgrespassword"));
config.registerTenant("acme", createDataSource("acme", "postgres", "postgres"));
config.registerTenant("starkindustries", createDataSource("starkindustries", "postgres", "postgres"));
return config.buildProcessEngine();
}
private DataSource createDataSource(String jdbcUrl, String jdbcUsername,
String jdbcPassword) {
int port = 5444;
PGSimpleDataSource ds = new PGSimpleDataSource();
ds.setServerNames(new String[]{"localhost"});
ds.setPortNumbers(new int[]{port});
ds.setUser("postgres");
ds.setPassword("postgrespassword");
ds.setDatabaseName("postgres");
ds.setCurrentSchema(jdbcUrl);
// ResultSet resultSet = ds.getConnection().createStatement().executeQuery("SELECT * FROM product");
// resultSet.next();
return ds; }
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
調査の方向性
Start with MultiSchemaMultiTenantProcessEngineConfiguration.createTenantSchema and ExecuteSchemaOperationCommand, then review the PGSimpleDataSource setup in the sample. Reproduce tenant registration with the shown PostgreSQL configuration and trace schema creation. Done means all registered tenant schemas can be created without the reported “no schema has been selected” error.
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- java, postgresql
- 領域
- backend, databases
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100