Table of Contents
Connecting TransSECS to Databricks
This page explains how to connect TransSECS to a Databricks SQL Warehouse using the Databricks JDBC driver.
The connection can be used with TransSECS database and historical components to store SECS/GEM event and report data in Databricks.
A complete SECS/GEM-to-Databricks workflow was verified using:
- TransSECS build 11026
- Java 11.0.31
- Databricks JDBC 3.4.2
- HSMS port 5010
- SECS Device ID 1
- Triggered Historical
- Databricks table workspace.default.secs_poc
Overview
The verified workflow is:
GEM Tool / Equipment
|
| HSMS / SECS-GEM
v
TransSECS Host
|
| S6F11 Event / Report Data
v
Triggered Historical
|
v
DatabaseConnection
|
| Databricks JDBC
v
Databricks SQL Warehouse
|
v
Databricks Table
In the verified example, the GEM Tool sends a STARTED event using CEID 7501.
That event contains Report 101, which includes:
| Variable | VID |
|---|---|
| LOTID | `1514` |
| PPID | `1516` |
| SetPoint | `2000` |
| WaferCount | `1510` |
TransSECS receives the S6F11 event, acknowledges it with S6F12, and writes the event values to Databricks.
The workflow was verified both with TransSECS Builder in LIVE mode and with the packaged GEMHostDeployment runtime running independently of Builder.
Step 1: Get the Databricks Connection Details
Sign in to the Databricks workspace.
Open the SQL Warehouse that TransSECS should use.
In Databricks:
- Open SQL Warehouses.
- Select the SQL Warehouse.
- Open Connection Details.
- Locate the Server Hostname.
- Locate the Port.
- Locate the HTTP Path.
Typical connection information includes:
| Setting | Example |
|---|---|
| Server Hostname | `YOUR-SERVER-HOSTNAME` |
| Port | `443` |
| HTTP Path | `/sql/1.0/warehouses/YOUR-WAREHOUSE-ID` |
Do not copy another user's hostname, warehouse ID, or credentials from an example configuration.
Step 2: Download the Databricks JDBC Driver
Download the Databricks JDBC Driver from Maven Central:
Databricks JDBC Driver on Maven Central
The Maven artifact is:
com.databricks:databricks-jdbc
The driver JAR follows this naming pattern:
databricks-jdbc-<version>.jar
The version verified with TransSECS build 11026 and Java 11.0.31 was:
databricks-jdbc-3.4.2.jar
The JDBC driver class is:
com.databricks.client.jdbc.Driver
Step 3: Add the JDBC Driver to TransSECS Builder
TransSECS Builder loads additional libraries from its Builder classpath.
Place the Databricks JDBC JAR in:
MIStudioSuite\TransSECS\Builder\resources
For example, the verified build 11026 installation used:
C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\MIStudioSuite\TransSECS\Builder\resources\databricks-jdbc-3.4.2.jar
If the resources directory does not exist, create it.
The TransSECS Builder launch script includes:
./resources/*
on its Java classpath.
An example PowerShell setup for the verified driver is:
$resources = "C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\MIStudioSuite\TransSECS\Builder\resources" New-Item -ItemType Directory -Path $resources -Force | Out-Null $dst = Join-Path $resources "databricks-jdbc-3.4.2.jar" Invoke-WebRequest ` -Uri "https://repo1.maven.org/maven2/com/databricks/databricks-jdbc/3.4.2/databricks-jdbc-3.4.2.jar" ` -OutFile $dst Get-Item $dst | Select-Object FullName, Length
Optional: verify that the JAR contains the expected Databricks JDBC driver class:
Add-Type -AssemblyName System.IO.Compression.FileSystem $zip = [System.IO.Compression.ZipFile]::OpenRead($dst) $zip.Entries | Where-Object { $_.FullName -eq "com/databricks/client/jdbc/Driver.class" } | Select-Object FullName $zip.Dispose()
Expected result:
com/databricks/client/jdbc/Driver.class
Fully close and restart TransSECS Builder after adding or replacing the JDBC JAR.
If Builder was not restarted, TransSECS may report:
java.lang.ClassNotFoundException: com.databricks.client.jdbc.Driver
or:
Cannot Connect to Database. No Driver Exists for "com.databricks.client.jdbc.Driver".
Step 4: Configure the Databricks DatabaseConnection
For the verified TransSECS build 11026 configuration, a standard DatabaseConnection was used.
The connection was named:
DatabricksConnection
Configure the DatabaseConnection with:
| Property | Value |
|---|---|
| Name | `DatabricksConnection` |
| Database User Name | `token` |
| Database Password | Databricks Personal Access Token |
| Database Driver Class Name | `com.databricks.client.jdbc.Driver` |
A PAT-authenticated JDBC URL can use the following structure:
jdbc:databricks://YOUR-SERVER-HOSTNAME:443/default;httpPath=/sql/1.0/warehouses/YOUR-WAREHOUSE-ID;AuthMech=3;transportMode=http;ssl=1;ConnCatalog=workspace;ConnSchema=default
The verified connection properties included:
AuthMech=3 transportMode=http ssl=1 ConnCatalog=workspace ConnSchema=default
For PAT authentication:
| Setting | Value |
|---|---|
| User Name | `token` |
| Password | Current Databricks Personal Access Token |
| AuthMech | `3` |
Treat the PAT as a password.
If a token is exposed, revoke it and generate a replacement.
Step 5: Configure Triggered Historical
Add or configure a Triggered Historical device beneath the Databricks DatabaseConnection.
The verified device was named:
Historical
The known-good configuration was:
| Property | Value |
|---|---|
| Name | `Historical` |
| Timestamp Column | `ts` |
| Table Name | `secs_poc` |
| Create Table | `False` |
| Cache Size | `0` |
The historical device writes to the configured Databricks catalog and schema.
The verified destination was:
workspace.default.secs_poc
Step 6: Create or Verify the Databricks Table
Because Create Table is disabled in the verified Historical configuration, the Databricks table must already exist with all columns that TransSECS will write.
The verified table schema is:
CREATE TABLE workspace.default.secs_poc ( ts TIMESTAMP, LOTID STRING, PPID STRING, SetPoint BIGINT, WaferCount BIGINT, CEID BIGINT, EventName STRING );
If the table already exists, do not recreate it.
The original POC added the event metadata columns using:
ALTER TABLE workspace.default.secs_poc ADD COLUMNS (CEID BIGINT);
ALTER TABLE workspace.default.secs_poc ADD COLUMNS (EventName STRING);
The expected columns are:
ts LOTID PPID SetPoint WaferCount CEID EventName
Step 7: Configure the SECS/GEM Report and Event
The verified STARTED event uses:
CEID 7501
STARTED is linked to Report:
101
Report 101 contains:
| Variable | VID |
|---|---|
| LOTID | `1514` |
| PPID | `1516` |
| SetPoint | `2000` |
| WaferCount | `1510` |
On LIVE startup, TransSECS configures the tool using SECS messages including:
- S2F33 to create reports
- S2F35 to link reports to collection events
- S2F37 to enable collection events
A successful setup should receive normal acknowledgements including:
- S2F34
- S2F36
- S2F38
Step 8: Start the GEM Tool Simulator
The Java 11 TransSECS build includes a StandAloneGEMTool that can be used to simulate equipment.
The verified simulator source was:
C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\StandAloneGEMTool
The verified Java runtime was:
C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\MIStudioSuite\jre\bin\java.exe
The simulator can be run from a temporary copy so the original source remains unchanged:
$src = 'C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\StandAloneGEMTool' $jre = 'C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\MIStudioSuite\jre\bin\java.exe' $run = Join-Path $env:TEMP ("GEMTool11026_" + (Get-Date -Format 'yyyyMMdd_HHmmss')) Copy-Item $src $run -Recurse Set-Location $run & $jre ` "-Dlog4j.configuration=log4j.console.xml" ` -cp ".;*" ` com.ergotech.mix.client.ContainerApplet
Expected result:
- The yellow GEM Tool window opens.
- The tool listens on port 5010.
- Device ID is 1.
Some older-tool warnings may appear during simulator startup, including persistence or SQLite warnings. These did not prevent the verified HSMS event test.
Step 9: Verify the GEM Tool Is Listening
Use PowerShell:
Get-NetTCPConnection -LocalPort 5010 -ErrorAction SilentlyContinue | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
Before the host connects, the expected state is:
Listen
If nothing is returned, the simulator is not currently listening on port 5010.
Step 10: Start TransSECS Builder
Start Builder from its Builder directory.
For the verified build 11026 installation:
Set-Location "C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\MIStudioSuite\TransSECS\Builder" .\scripts\run_trans.bat
The verified startup reported:
TransSECS build id: 11026 JVM Version: 11.0.31
The Windows batch file may print an error for a line beginning with:
#
This was non-blocking in the verified build 11026 test.
The following startup warning was also non-blocking in the verified test:
"mistudio.hs" is not available.
Step 11: Open the Host Project
The Java 11 POC project used during verification was:
C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\Projects\GEMHost_Databricks_POC_Java11\GEMHost.tsx
The verified Tool Attributes were:
| Property | Value |
|---|---|
| Type | Host |
| Host | `localhost` |
| Device ID | `1` |
| Port | `5010` |
| Uses GEM | Enabled |
The Devices tree contained:
DatabricksConnection
|
+-- Historical
Step 12: Switch TransSECS to LIVE
The verified end-to-end test used TransSECS Builder in:
LIVE
mode.
When the Databricks JDBC connection opens successfully, TransSECS should report a line similar to:
Connection: "SparkSQL" Version: 3.3.3 Driver: "DatabricksJDBC"
A Java warning similar to the following may appear immediately before the successful connection:
Illegal reflective access by com.databricks.internal.apache.arrow.memory.util.MemoryUtil
This warning was non-blocking in the verified Java 11 test.
Step 13: Verify the HSMS Connection
Run:
Get-NetTCPConnection -LocalPort 5010 -ErrorAction SilentlyContinue | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
After the TransSECS host connects, the port should show both:
Listen Established
A successful HSMS connection should also include:
HSMS_SS_VALID_SELECT_RESPONSE -- Successful Select
followed by the normal GEM communications handshake:
S1F13 S1F14
Step 14: Send a STARTED Event
In the yellow GEM Tool, enter:
| Field | Value |
|---|---|
| PPID | `Recipe_A` |
| Lot ID | `LOT_001` |
| Set Point | `50` |
| Wafer Count | `1` |
| Event | `STARTED` |
During verification, the first test visually showed LOT_001 in the UI, but the actual S6F11 contained an empty LOTID.
After the field value was committed, the next event correctly contained LOT_001.
Click:
Send Selected Event
The expected SECS message is an S6F11 containing CEID 7501 and Report 101:
S6F11 W
CEID 7501
Report 101
LOTID LOT_001
PPID Recipe_A
SetPoint 50
WaferCount 1
TransSECS should acknowledge the event with:
S6F12 <B 0x0>
Step 15: Verify the Row in Databricks
Run:
SELECT ts, LOTID, PPID, SetPoint, WaferCount, CEID, EventName FROM workspace.default.secs_poc ORDER BY ts DESC LIMIT 10;
The verified successful row contained:
| Column | Value |
|---|---|
| LOTID | `LOT_001` |
| PPID | `Recipe_A` |
| SetPoint | `50` |
| WaferCount | `1` |
| CEID | `7501` |
| EventName | `STARTED` |
The clean Builder LIVE verification produced:
2026-09-28T09:31:56.291+00:00 LOT_001 Recipe_A 50 1 7501 STARTED
The packaged GEMHostDeployment runtime was later verified independently and produced:
2026-09-28T11:02:28.000+00:00 LOT_001 Recipe_A 50 1 7501 STARTED
During the standalone deployment verification, the SECS event was acknowledged immediately, while the Historical write completed roughly 25-30 seconds later. Wait about 30 seconds and query the table again before treating a missing row as a failure.
This confirms the complete path:
GEM Tool
|
| S6F11
v
TransSECS 11026 / Java 11
|
| Triggered Historical
v
Databricks JDBC 3.4.2
|
v
workspace.default.secs_poc
Building a Deployable Runtime
After changing the project, use:
Tools → Build
The verified build 11026 build completed successfully.
The deployment output was:
GEMHostDeployment
Verify that the Databricks JDBC JAR was copied into the deployment:
$deploy = "C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\Projects\GEMHost_Databricks_POC_Java11\GEMHostDeployment" Get-ChildItem $deploy -Filter "databricks-jdbc*.jar" -File | Select-Object Name, Length, FullName
The verified deployment contained:
databricks-jdbc-3.4.2.jar
The verified JAR size was:
41,301,251 bytes
Run the Packaged Deployment
Do not leave TransSECS Builder in LIVE mode while validating the standalone deployment. Builder LIVE and GEMHostDeployment are both hosts and should not compete for the same equipment connection on port 5010.
With the GEM Tool simulator running, switch Builder out of LIVE mode or close Builder.
Then start the packaged runtime:
Set-Location "C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\Projects\GEMHost_Databricks_POC_Java11\GEMHostDeployment" .\run.bat
The verified startup used Java 11.0.31 and reported:
Simulation mode: LIVE Started GEMHost connecting to localhost on port 5010 with device id 1
The Java 11 Arrow reflective-access warning may still appear. It is non-blocking if the Databricks JDBC connection opens successfully.
Verify the equipment side is listening:
Get-NetTCPConnection -LocalPort 5010 -ErrorAction SilentlyContinue | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
Verify the standalone host is connected to the equipment:
Get-NetTCPConnection -RemotePort 5010 -ErrorAction SilentlyContinue | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
The verified standalone runtime showed an Established client connection to `127.0.0.1:5010`.
The deployment log also reported:
Connection: "SparkSQL" Version: 3.3.3 Driver: "DatabricksJDBC"
Send the same STARTED event described above and verify the resulting Databricks row.
The packaged runtime was verified end to end on 2026-09-28 with this row:
2026-09-28T11:02:28.000+00:00 LOT_001 Recipe_A 50 1 7501 STARTED
This proves the deployed path independently of Builder:
GEM Tool
|
| HSMS / SECS-GEM
v
GEMHostDeployment
|
| Java 11 / Triggered Historical
v
Databricks JDBC 3.4.2
|
v
workspace.default.secs_poc
Troubleshooting
No Port 5010 Listener
If this command returns nothing:
Get-NetTCPConnection -LocalPort 5010 -ErrorAction SilentlyContinue
the GEM Tool simulator is not listening.
Start the simulator and test the port again.
Port Shows Listen but Not Established
If port 5010 shows:
Listen
but not:
Established
the simulator is waiting, but the TransSECS host has not connected.
Check:
- TransSECS is in LIVE mode.
- Host is configured for localhost.
- Port is 5010.
- Device ID is 1.
- GEM Tool is still running.
JDBC Driver ClassNotFoundException
If TransSECS reports:
java.lang.ClassNotFoundException: com.databricks.client.jdbc.Driver
confirm:
- `databricks-jdbc-3.4.2.jar` exists in `Builder\resources`.
- The JAR contains `com/databricks/client/jdbc/Driver.class`.
- TransSECS Builder was fully closed after the JAR was added.
- Builder was restarted after adding the JAR.
- Driver Class Name is `com.databricks.client.jdbc.Driver`.
Invalid Access Token
If Databricks returns:
403 Forbidden Invalid access token
the JDBC driver successfully reached Databricks, but authentication failed.
Check:
- The Personal Access Token is current.
- The token has not expired or been revoked.
- User Name is:
token
- Password contains the current PAT.
- `AuthMech=3` is present.
Do not change the hostname or warehouse URL first if Databricks is explicitly returning an invalid-token response.
Illegal Reflective Access Warning
Java 11 may report a warning involving:
com.databricks.internal.apache.arrow.memory.util.MemoryUtil
If the next messages show a successful:
Driver: "DatabricksJDBC"
connection, the warning can be treated as non-blocking for this verified configuration.
S6F11/S6F12 Works but No Databricks Row Appears
If the SECS event is received and acknowledged but no row appears:
- Wait about 30 seconds and query the table again. Triggered Historical may write after the immediate S6F11/S6F12 exchange.
- Confirm Historical points to the intended DatabaseConnection.
- Confirm the Databricks JDBC connection opened successfully.
- Confirm the Databricks table contains every required non-optional column.
- Query the table ordered by `ts DESC`.
- Check the deployment or Builder `SECSMessages.log`.
- Check the Databricks SQL Warehouse Query History if a SQL failure is suspected.
For the packaged runtime, the verified log file is:
C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\Projects\GEMHost_Databricks_POC_Java11\GEMHostDeployment\SECSMessages.log
A useful PowerShell filter is:
$log = "C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\Projects\GEMHost_Databricks_POC_Java11\GEMHostDeployment\SECSMessages.log" Get-Content $log -Tail 500 | Select-String -Pattern "column|secs_poc|Historical|INSERT|UPDATE|not written|failed|error" -Context 8,15
Increase Historical Debug Logging
If the Historical log says to set Debug Level to 10, edit:
GEMHostDeployment\ErgoTechConfiguration.properties
The relevant property is:
historical.debuglevel=0
Change it temporarily to:
historical.debuglevel=10
The `sessionmanager.debuglevel` property controls SECS/HSMS session logging and does not need to be changed just to troubleshoot Historical database writes.
Example PowerShell:
$config = "C:\Users\Public\ErgoTech\TransSECSDevicesTrial_11026\Projects\GEMHost_Databricks_POC_Java11\GEMHostDeployment\ErgoTechConfiguration.properties" Copy-Item $config "$config.bak" -Force (Get-Content $config) ` -replace '^historical\.debuglevel=0$', 'historical.debuglevel=10' | Set-Content $config
Restart `GEMHostDeployment\run.bat` after changing the property, reproduce one event, and inspect `SECSMessages.log`.
When troubleshooting is complete, return the setting to:
historical.debuglevel=0
and restart the deployment the next time it is run.
"2 of 8 MAP columns not written"
With Historical debug level 10, the verified deployment reported:
2 of 8 MAP columns [RPTID, ReportName] are not written to the "secs_poc" table because this data is optional and the table does not contain these columns. The rest of the row is written normally.
For the verified `secs_poc` schema, this is informational rather than a failed historian write.
`RPTID` and `ReportName` are optional MAP metadata columns. The verified seven-column table does not require them:
ts LOTID PPID SetPoint WaferCount CEID EventName
If those optional values are desired, add text columns for them to the Databricks table or use a configuration that allows Historical to create the table/columns.
If they are not needed for the demo, the warning can be left as-is because the normal event row is still written.
Blank LOTID Appears in Databricks
Inspect the actual S6F11 payload.
If it contains:
<A ''>
for LOTID, Databricks is storing the value TransSECS actually received.
Re-enter LOT_001 in the GEM Tool and commit the field by clicking away or pressing Tab before sending another event.
The correct S6F11 should contain:
<A 'LOT_001'>
UNRESOLVED_COLUMN
If Databricks reports an unresolved column, the Historical component is attempting to write a column that is not present in the Databricks table.
Compare the table schema with:
ts LOTID PPID SetPoint WaferCount CEID EventName
Add the missing column using the correct Databricks type, then resend one event.
Verified Baseline
The following configuration was verified end to end on September 28, 2026:
| Component | Verified Value |
|---|---|
| TransSECS Build | `11026` |
| Java | `11.0.31` |
| Databricks JDBC | `3.4.2` |
| JDBC Driver Class | `com.databricks.client.jdbc.Driver` |
| DatabaseConnection | `DatabricksConnection` |
| Historical | `Historical` |
| Databricks Catalog | `workspace` |
| Databricks Schema | `default` |
| Databricks Table | `secs_poc` |
| Timestamp Column | `ts` |
| HSMS Port | `5010` |
| SECS Device ID | `1` |
| Report | `101` |
| Event | `STARTED` |
| CEID | `7501` |
| Verified Host Modes | `Builder LIVE` and `GEMHostDeployment` |
The successful tests confirmed:
- Java 11 startup
- Databricks JDBC driver loading
- Databricks authentication
- HSMS connection establishment
- S1F13/S1F14 communication
- Report 101 configuration
- STARTED event 7501 configuration
- S6F11 event reception
- S6F12 acknowledgement
- Triggered Historical processing
- Successful Databricks row insertion from Builder LIVE
- Successful Databricks row insertion from the packaged GEMHostDeployment runtime
- Optional MAP columns `RPTID` and `ReportName` may be omitted without preventing the normal row write
The Builder LIVE known-good row was:
2026-09-28T09:31:56.291+00:00 LOT_001 Recipe_A 50 1 7501 STARTED
The standalone GEMHostDeployment known-good row was:
2026-09-28T11:02:28.000+00:00 LOT_001 Recipe_A 50 1 7501 STARTED
The known-good deployed path is:
STARTED 7501
->
Report 101
->
GEMHostDeployment / TransSECS 11026 / Java 11
->
Triggered Historical
->
Databricks JDBC 3.4.2
->
workspace.default.secs_poc
When Testing Is Complete
When finished:
- Switch TransSECS Builder out of LIVE mode or close the project.
- Stop `GEMHostDeployment\run.bat` if the packaged runtime is running.
- If Historical debug logging was raised for troubleshooting, restore `historical.debuglevel=0`.
- Close the StandAloneGEMTool simulator.
- Temporary `GEMTool11026_…` folders under `%TEMP%` can be removed.
- Preserve the working Java 11 project and deployment.
- Preserve `Builder\resources\databricks-jdbc-3.4.2.jar`.
- Keep older Java 8-era TransSECS installations available as fallback/reference until they are no longer needed.
