A new set of powerful transformation features make it easier for the user to map together different tables for synchronization. Two configuration tables (sym_transform_table and sym_transform_column) were added to enable all the possibilities. Here are some of the transforms that can be accomplished:

  • Choose which columns on the source table map to which columns on the target table
  • Add new columns with constant values or variables, like the current timestamp
  • Specify different mappings based on whether the change is insert, update, or delete
  • Map multiple source tables to the same target table
  • Lookup values from another table when a row of data changes
  • Transform one row of data on the source into multiple rows on the target

Another new feature is an option for handling large object (LOB) data. Normally, a trigger captures changes to character (CLOB) and binary (BLOB) data and saves it in sym_data. Now the user can enable the use_stream_lobs option to skip the data capture and stream the LOB from the database instead. On some database systems, this makes it possible to synchronize larger objects that were previously limited by the data capture.

Release Notes - SymmetricDS - Version 2.4.0


  • [SYMMETRICDS-428] - Update trigger getting ORA-01489 error
  • [SYMMETRICDS-446] - sym_largeobject function in Postgresql returns only a part of the binary object
  • [SYMMETRICDS-447] - Tinyint loses sign
  • [SYMMETRICDS-454] - PostgreSQL BLOB handling fails.
  • [SYMMETRICDS-455] - Derby CLOB fails if string contains quotes.
  • [SYMMETRICDS-458] - Table prefix not being replaced for initial load sql for a postgres blob column
  • [SYMMETRICDS-459] - Primary key index being created with unexpected name causes error
  • [SYMMETRICDS-460] - Initial load gets arithmetic exception, numeric overflow, or string truncation
  • [SYMMETRICDS-466] - Tomcat shutdown hangs when SymmetricDS is deployed as a war
  • [SYMMETRICDS-467] - "Skipped" is spelled wrong in the IncomingBatch.Status enumeration
  • [SYMMETRICDS-468] - Allow table names with mixed and upper case
  • [SYMMETRICDS-469] - Data can be skipped when the beginning or end of a batch is filled in.
  • [SYMMETRICDS-471] - Sync of null BLOB causes null pointer exception
  • [SYMMETRICDS-472] - Case sensitive table names
  • [SYMMETRICDS-474] - Table metadata written out during an initial load that does not respect sym_router.target_table_name
  • [SYMMETRICDS-478] - Initial load data should be filterable via the IExtractFilter
  • [SYMMETRICDS-486] - Multiple triggers get created on sym_ tables after an upgrade
  • [SYMMETRICDS-490] - Exception throws on update clob field
  • [SYMMETRICDS-492] - Query that retrieves data to route can slow down on big joins between sym_data and sym_data_gap
  • [SYMMETRICDS-496] - Outgoing batch can be marked as OK if Incoming batch fails to update to OK
  • [SYMMETRICDS-498] - Outgoing batch stats can be overwritten if an error occurs after the stats have been reset for an extract retry
  • [SYMMETRICDS-499] - Only the last temporary file in a sync is being kept around for reuse in case of a network error
  • [SYMMETRICDS-501] - Prefix SymmetricDS indexes so SymmetricDS tables can coexist in the same database
  • [SYMMETRICDS-504] - Datetime value of '0000-00-00 00:00:00' does not sync properly on MySQL


  • [SYMMETRICDS-372] - Don't allow synchronization and log message in the push and pull servlets if the node is sync_enabled=0
  • [SYMMETRICDS-433] - Document the external_select feature better
  • [SYMMETRICDS-453] - Allow JDBC connection properties to be set via a symmetric property
  • [SYMMETRICDS-456] - Move SpringWireableSymmetricEngine to symmetric-core
  • [SYMMETRICDS-470] - Support interval data type
  • [SYMMETRICDS-475] - Upgrade packaged HSQLDB to 2.2.4
  • [SYMMETRICDS-476] - Improve explanation of keystore and cert generation
  • [SYMMETRICDS-477] - Upgrade the packaged MySQL JDBC Driver to the latest version (5.1.17)
  • [SYMMETRICDS-480] - Improve configuration troubleshooting by not allowing triggers to exist with a channel_id that does not exist.
  • [SYMMETRICDS-482] - Update the column match router to accept router_expressions that are concatenated by OR instead of a new line
  • [SYMMETRICDS-484] - Document use of OLD_ in column match expressions
  • [SYMMETRICDS-487] - User's Guide - Router section - missing summary bullets and uses two terms
  • [SYMMETRICDS-488] - User's Guide - verify that the initial load select somewhere identifies the alias of the table being loaded
  • [SYMMETRICDS-495] - Do not extract the same batch for the same node at the same time if a network error occurs
  • [SYMMETRICDS-497] - Default dataloader.max.rows.before.commit to 10000 so tables with millions of rows don't try to commit the entire table all at once
  • [SYMMETRICDS-500] - Set max_batch_to_send to 1 as the default setting for the reload channel.
  • [SYMMETRICDS-503] - Print out query string and remote host and ip address of requests that are not mapped to an existing server

New Feature

  • [SYMMETRICDS-4] - Stream LOB (large object), BLOB, and CLOB columns
  • [SYMMETRICDS-448] - Allow table names using keywords
  • [SYMMETRICDS-462] - Provide the ability to configure arbitrary mappings between tables and columns by way of the data loader.


  • [SYMMETRICDS-387] - Discuss sym_channel settings and how they effect synchronization in the users guide
Eric Long
Author: Eric Long

Eric is a software developer and technology enthusiast with a background in developing custom applications for Information Technology. As a long-time Linux user, he strongly believes in open source. He focuses on product solutions and spreading the word for JumpMind.