Tamaki MES Properties
This page consolidates all Spring configuration properties for Tamaki MES services.
Hibernate
| Property | Default | Description |
|---|---|---|
hibernate.jdbc.batch_size | 50 | Number of statements Hibernate will batch per roundtrip to the database. Increase to reduce network roundtrips; ensure your JDBC driver and DB support batching. |
Notes
- Tuning: Start at 50–100. Validate with database metrics and profiling.
- Constraints: Consider triggers/sequences that may affect batching semantics.
Db
Driver-level connection properties that Tamaki MES requires on the Ignition database connection it uses, per database vendor. The properties are added only when the Allow Module to Manage Datasource gateway setting is enabled (it is off by default): the module then checks the datasource's Extra Connection Properties at startup (and when the MES datasource setting changes) and adds any required keys that are missing - exactly as if they were entered in the gateway web UI, including the automatic connection-pool restart. Keys you have set explicitly are never overridden; a differing explicit value is kept and logged as a warning. While the setting is disabled the module never modifies the connection; it only logs a startup warning if required properties are missing.
| Property | Default | Description |
|---|---|---|
db.extra_connection_properties.mssql | sendStringParametersAsUnicode=false | Required properties for Microsoft SQL Server connections (semicolon-separated key=value pairs). |
db.extra_connection_properties.mysql | (empty) | Required properties for MySQL connections. |
db.extra_connection_properties.mariadb | (empty) | Required properties for MariaDB connections. |
db.extra_connection_properties.postgresql | (empty) | Required properties for PostgreSQL connections. |
Notes
- Why
sendStringParametersAsUnicode=falseon SQL Server: the Microsoft JDBC driver sends string parameters asnvarcharby default, while Tamaki MES key columns arevarchar. Under SQL Server collations the resulting implicit conversion prevents index seeks, so every keyed UPDATE scans an entire index under update locks. With many active OEE locations this causes severe lock contention and recurring deadlocks (Transaction ... was deadlocked on lock resources). Setting the property restores index seeks. - The properties are applied to the database connection selected as the MES datasource in the Tamaki MES gateway settings, not to other Ignition database connections.
- The properties change driver behavior for everything using that database connection, not just Tamaki MES - named queries, tag history, scripts, or other modules pointed at the same connection are affected too. In particular, with
sendStringParametersAsUnicode=falsestring parameters are sent in the database collation's code page instead of as Unicode (nvarchar). If non-MES tables on the same connection store non-Latin text (e.g. macrons, CJK) innvarcharcolumns, give Tamaki MES its own database connection, set the property explicitly totrue(the module respects explicit values), or leave Allow Module to Manage Datasource disabled. - On redundant gateways, only the master node applies changes; the configuration synchronizes to the backup automatically.
- If you intentionally need a conflicting driver setting, set it explicitly in the gateway's Extra Connection Properties field - the module will respect it - or simply leave Allow Module to Manage Datasource disabled.
Transaction
| Property | Default | Description |
|---|---|---|
transaction.retry.max_attempts | 3 | Maximum retry attempts for transient transactional failures. |
transaction.retry.backoff_delay_ms | 500 | Backoff delay between retries (milliseconds). |
transaction.retry.backoff_delay_multiplier | 2 | Multiplier applied to the previous delay for exponential backoff. |
Notes
Effective delay sequence is backoff_delay_ms * multiplier^(attempt-1) until max attempts.
Async Executor
Bounds the thread pool that runs @Async work (currently the Perspective tree-update push handlers). Bounding it stops a burst of change events from spawning unlimited threads — and, by extension, unlimited database connections — against the gateway's shared connection pool.
| Property | Default | Description |
|---|---|---|
async.executor.core_pool_size | 6 | Threads kept alive to service async tasks at steady state. |
async.executor.max_pool_size | 12 | Hard ceiling on concurrent async threads; reached only when the queue is full. Caps connection demand from async work. |
async.executor.queue_capacity | 500 | Tasks buffered before the pool grows toward max_pool_size. Absorbs bursts. |
async.executor.keep_alive_seconds | 60 | Idle time before non-core threads are released (seconds). |
Notes
- With a bounded queue, the pool only grows from
core_pool_sizetowardmax_pool_sizeonce the queue is full; until then tasks queue and the core threads drain them. Socore_pool_sizeis the effective steady-state concurrency,queue_capacityis the burst buffer, andmax_pool_sizeis a safety valve. - When both the pool and the queue are saturated, new tasks run on the calling thread (caller-runs backpressure) rather than being dropped — this slows the producer instead of overrunning the pool.
- Keep
max_pool_sizecomfortably below the database connection-pool limit, accounting for the other concurrent consumers (OEE/operation/inventory data collection, REST requests).
Import
| Property | Default | Description |
|---|---|---|
import.batch_size | 1000 | Number of records committed per batch when importing data (materials, equipment, OEE configs, etc.). |
import.batch_flush_delay_ms | 5000 | Delay between batch flushes during import (milliseconds) to throttle database load on large imports. |
import.restore_thread_pool_size | 4 | Maximum threads used to import entity types in parallel during a backup restore. Bounds the database connections a restore can consume. |
Cache
| Property | Default | Description |
|---|---|---|
cache.default_expiry_ms | 600000 | Time to live for cache entries in milliseconds. |
cache.max_heap_entries | 10000 | Maximum number of entries in cache per entity type. |
cache.max_disk_size_mb | 100 | Maximum size of overflow disk cache in megabytes. |
cache.disk_persistence_path | tamakimes/cache | Path to location of disk cache. |
cache.equipment.enabled | true | Enable caching of equipment lookups. Disable any region to read that entity straight from the database. |
cache.equipment_class.enabled | true | Enable caching of equipment class lookups. |
cache.material.enabled | true | Enable caching of material lookups. |
cache.material_class.enabled | true | Enable caching of material class lookups. |
cache.department.enabled | true | Enable caching of department lookups. |
cache.location.enabled | true | Enable caching of location lookups. |
cache.unit_of_measure.enabled | true | Enable caching of unit of measure lookups. |
cache.unit_of_measure_conversion.enabled | true | Enable caching of unit of measure conversion lookups. Disable to always read conversions from the database. |
cache.production_order.enabled | true | Enable caching of production order detail reads. Disable for high-churn workloads where stale reads are unacceptable. |
cache.production_order.expiry_ms | 30000 | Time to live for production order cache entries in milliseconds. Kept short because production orders change frequently; bounds how stale a cached read can be. |
Inventory
| Property | Default | Description |
|---|---|---|
inventory.data_collection.execution_interval_ms | 250 | Interval between inventory data collection executions (milliseconds). |
Notes
- Align with PLC tag update rates to avoid stale reads.
OEE
| Property | Default | Description |
|---|---|---|
oee.data_collection.execution_interval_ms | 250 | Interval between OEE data collection executions (milliseconds). |
oee.data_collection.flush_check_interval_ms | 10000 | Frequency to check whether buffered OEE data should be flushed to the database (milliseconds). |
oee.data_collection.prune_records_cron | 0 0 0 * * ? | Cron expression for pruning old OEE records. Uses Spring Cron Format. The default value is Daily at Midnight. |
oee.data_collection.logs.throttling.threshold | 10 | The maximum number of errors to show within the throttling window before suppressing them. |
oee.data_collection.logs.throttling.window_ms | 5000 | The logs throttling window (milliseconds). Duplicate logs inside this window will be suppressed. |
oee.alarms.alarm_flush_interval_ms | 10000 | Interval between OEE alarm flush operations (milliseconds). |
oee.pruning.batch_size | 1000 | Number of OEE records deleted per pruning batch. |
oee.pruning.batch_delay_ms | 500 | Delay between pruning batches to reduce DB load (milliseconds). |
oee.optimizations.cron | 0 0 0 * * ? | Cron expression for the OEE optimizations job (heal then backfill). Uses Spring Cron Format. The default value is Daily at Midnight. |
oee.optimizations.heal.enabled | true | Enables the heal phase of the optimizations job, which repairs faulted OEE state, mode, and OEE records. |
oee.optimizations.heal.batch_size | 200 | Number of faulted record IDs fetched per location, per record type, per healing batch. |
oee.optimizations.heal.max_per_run | 1000 | Soft cap on the number of records healed per record type (state/mode/OEE) per scheduled run. |
oee.optimizations.heal.parallelism | 4 | Number of locations healed in parallel during a single healing run. |
oee.optimizations.backfill.enabled | true | Enables the backfill phase of the optimizations job, which pre-computes OEE calculation records for configured period types. |
Notes
-
Execution Interval
- Lower → collects data more frequently, more CPU/memory use.
- Higher → collects data less frequently, less CPU/memory use, risk of missing short-lived events.
-
Flush Check Interval
- Lower → more DB writes.
- Higher → fewer DB writes, higher crash-loss risk.
-
Flush Check Interval needs to be larger than Execution Interval
-
Mismatch causes wasted flushes (too frequent) or buffer growth (too slow).
Operation
| Property | Default | Description |
|---|---|---|
operation.data_collection.execution_interval_ms | 250 | Interval between operation data collection executions (milliseconds). |
Shift
| Property | Default | Description |
|---|---|---|
shift.data_collection.expression_schedule_evaluation_interval_ms | 500 | Interval for evaluating expression-based shift schedules (milliseconds). |
shift.data_collection.ignition_schedule_evaluation_interval_ms | 10000 | Interval for evaluating Ignition-bound shift schedules (milliseconds). |
Expression
| Property | Default | Description |
|---|---|---|
expression.health_check.min_batch_size | 5 | Minimum number of expressions evaluated per health check cycle. |
expression.health_check.scan_interval_ms | 3000 | Interval between expression health check scans (milliseconds). |
expression.health_check.max_log_expressions | 10 | Max number of expressions logged when anomalies are detected. |
expression.logs.throttling.window_ms | 5000 | The logs throttling window (milliseconds). Duplicate logs inside this window will be suppressed. |
Tracegraph
| Property | Default | Description |
|---|---|---|
tracegraph.max_nodes | 10000 | Maximum number of nodes visited during a trace to prevent runaway traversal. |
tracegraph.max_depth | 100 | Maximum traversal depth for trace graph operations. |
Additional Logging
| Property | Default | Description |
|---|---|---|
logs.diagnostics | true | Whether or not to enable additional diagnostic logging. |
Tree Search
| Property | Default | Description |
|---|---|---|
tree.search.max_results | 1000 | Maximum number of nodes returned by tree search components (Material, Location, Personnel, Downtime Reason, etc.). |