对称 DS 文件同步

SymmetricDS File Synchronisation

我正在使用 SymmetricDS(版本 3.12.3)在服务器(我们称之为 omni)和客户端(我们称之为网站)之间设置文件同步。我一直在使用 SymmetricDS 一段时间来在上述客户端和服务器之间进行数据库同步。但是,一旦 FileSyncTrackerJob 运行并检测到文件已 created/modified/deleted 在服务器上的源目录中,SymmetricDS 就会抛出错误。它抛出以下错误:

终端日志输出:

[omni-000] - FileTriggerTracker - Tracked 2 files in 0 seconds.  Found 2 files changed.
[] - DataGapRouteReader - org.jumpmind.db.sql.SqlException: The result set is closed
        at org.jumpmind.db.sql.AbstractSqlTemplate.translate(AbstractSqlTemplate.java:306)
        at org.jumpmind.db.platform.firebird.FirebirdJdbcSqlTemplate.translate(FirebirdJdbcSqlTemplate.java:62)
        at org.jumpmind.db.sql.AbstractSqlTemplate.translate(AbstractSqlTemplate.java:295)
        at org.jumpmind.db.sql.JdbcSqlReadCursor.next(JdbcSqlReadCursor.java:146)
        at org.jumpmind.symmetric.route.DataGapRouteReader.fillPeekAheadQueue(DataGapRouteReader.java:478)
        at org.jumpmind.symmetric.route.DataGapRouteReader.executeNonTransactional(DataGapRouteReader.java:250)
        at org.jumpmind.symmetric.route.DataGapRouteReader.execute(DataGapRouteReader.java:155)
        at org.jumpmind.symmetric.route.DataGapRouteReader.run(DataGapRouteReader.java:130)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
        at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.sql.SQLException: The result set is closed
        at org.firebirdsql.jdbc.AbstractResultSet.checkOpen(AbstractResultSet.java:297)
        at org.firebirdsql.jdbc.AbstractResultSet.checkCursorMove(AbstractResultSet.java:285)
        at org.firebirdsql.jdbc.AbstractResultSet.next(AbstractResultSet.java:360)
        at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
        at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
        at org.jumpmind.db.sql.JdbcSqlReadCursor.next(JdbcSqlReadCursor.java:132)
        ... 7 more

日志文件输出有点冗长:

2020-09-02 18:25:01,427 DEBUG [] [JdbcSqlTemplate] [omni-000-router-reader-2] (20ms.) select d.data_id, d.table_name, d.event_type, cast(d.row_data as varchar(20000)) as row_data, cast(d.pk_data as varchar(1000)) as pk_data, cast(d.old_data as varchar(20000)) as old_data, d.create_time, d.trigger_hist_id, d.channel_id, d.transaction_id, d.source_node_id, d.external_data, d.node_list, d.is_prerouted from sym_data d where d.channel_id='filesync'  and ((d.data_id between 15398 and 50015397))   order by d.data_id asc 
2020-09-02 18:25:01,429 ERROR [] [DataGapRouteReader] [omni-000-router-reader-2]  StackTraceKey.init [SqlException:994639622] org.jumpmind.db.sql.SqlException: The result set is closed
    at org.jumpmind.db.sql.AbstractSqlTemplate.translate(AbstractSqlTemplate.java:306)
    at org.jumpmind.db.platform.firebird.FirebirdJdbcSqlTemplate.translate(FirebirdJdbcSqlTemplate.java:62)
    at org.jumpmind.db.sql.AbstractSqlTemplate.translate(AbstractSqlTemplate.java:295)
    at org.jumpmind.db.sql.JdbcSqlReadCursor.next(JdbcSqlReadCursor.java:146)
    at org.jumpmind.symmetric.route.DataGapRouteReader.fillPeekAheadQueue(DataGapRouteReader.java:478)
    at org.jumpmind.symmetric.route.DataGapRouteReader.executeNonTransactional(DataGapRouteReader.java:250)
    at org.jumpmind.symmetric.route.DataGapRouteReader.execute(DataGapRouteReader.java:155)
    at org.jumpmind.symmetric.route.DataGapRouteReader.run(DataGapRouteReader.java:130)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.sql.SQLException: The result set is closed
    at org.firebirdsql.jdbc.AbstractResultSet.checkOpen(AbstractResultSet.java:297)
    at org.firebirdsql.jdbc.AbstractResultSet.checkCursorMove(AbstractResultSet.java:285)
    at org.firebirdsql.jdbc.AbstractResultSet.next(AbstractResultSet.java:360)
    at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
    at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
    at org.jumpmind.db.sql.JdbcSqlReadCursor.next(JdbcSqlReadCursor.java:132)
    ... 7 more

这是我的 sql 用于为文件同步设置适当的符号表:

SYM_FILE_TRIGGER table

INSERT INTO SYM_FILE_TRIGGER 
(   TRIGGER_ID,
    CHANNEL_ID,
    RELOAD_CHANNEL_ID,
    BASE_DIR,
    RECURSE,
    INCLUDES_FILES,
    EXCLUDES_FILES,
    SYNC_ON_CREATE,
    SYNC_ON_MODIFIED,
    SYNC_ON_DELETE,
    SYNC_ON_CTL_FILE,
    DELETE_AFTER_SYNC,
    BEFORE_COPY_SCRIPT,
    AFTER_COPY_SCRIPT,
    CREATE_TIME,
    LAST_UPDATE_BY,
    LAST_UPDATE_TIME,
    DESCRIPTION
)
VALUES 
(   'file_trigger',
    'filesync',
    'filesync_reload',
    'c:\website_images\',
    1,
    '*.jpg',
    NULL,
    1,
    1,
    1,
    0,
    0,
    NULL,
    NULL,
    current_timestamp,
    'Admin',
    current_timestamp,
    'file trigger'
);

sym_router table

insert into sym_router 
(   router_id,
    source_node_group_id,
    target_node_group_id,
    router_type,
    sync_on_update,
    sync_on_insert,
    sync_on_delete,
    create_time,
    last_update_by,
    last_update_time,
    description
)
VALUES
(   'filerouter_omniserver_2_website',
    'omni',
    'website',
    'default',
    1,
    1,
    1,
    current_timestamp,
    'Admin',
    current_timestamp,
    'file router'
);

SYM_FILE_TRIGGER_ROUTER table

INSERT INTO SYM_FILE_TRIGGER_ROUTER 
(   TRIGGER_ID,
    ROUTER_ID,
    ENABLED,
    INITIAL_LOAD_ENABLED,
    TARGET_BASE_DIR,
    CONFLICT_STRATEGY,
    CREATE_TIME,
    LAST_UPDATE_BY,
    LAST_UPDATE_TIME,
    DESCRIPTION
)
VALUES
(   'file_trigger',
    'filerouter_omniserver_2_website',
    1,
    1,
    '\home\filesync',
    'source_wins',
    current_timestamp,
    'Admin',
    current_timestamp,
    'file trigger router'
);

我有 2 个符号节点组,node_group_id 分别为 omniwebsite

omni 服务器是 Windows 机器,而客户端是 Linux (Ubuntu) 机器。仅供参考,数据库同步是在服务器上的 firebird 数据库和客户端上的 mysql 数据库之间进行的。

当使用“非事务”批处理算法时,这看起来像是 Firebird 上 SymmetricDS 可能存在的错误。文件同步通道的批处理算法设置为“非事务性”,而更改数据捕获通道的批处理算法设置为“默认”。尝试将文件同步切换为使用“默认”批处理算法,如下所示:

update sym_channel set batch_algorithm = 'default' where channel_id = 'filesync'