【发布时间】:2021-10-23 18:17:12
【问题描述】:
我用来连接火鸟:
org.apache.commons.dbcp2.BasicDataSource;
但如果我设置:
ds.addConnectionProperty("autoCommit", "true");
ds.addConnectionProperty(FBConnectionProperties.USE_FIREBIRD_AUTOCOMMIT, "true");
或
ds.addConnectionProperty("useFirebirdAutocommit", "true");
自动提交根本不起作用。只有在我不使用 "useFirebirdAutocommit" 属性时才有效。
或者如果我添加 isc_tpb_autocommit 它也可以:
ds.addConnectionProperty("TRANSACTION_READ_COMMITTED", "isc_tpb_read_committed,"+
"isc_tpb_rec_version,isc_tpb_write,isc_tpb_wait,**isc_tpb_autocommit**");
似乎使用了内部服务器自动提交,驱动程序禁用自动提交,但内部服务器自动提交不起作用。
顺便说一句 - 结果,我确信我有自动提交 - 但每次更新都会创建另一个版本的记录,其中未提交的事务无法被清除。数据库文件从 3MB 快速增长到 15GB 几天 24/7(大约每秒 1000 次更新)。
【问题讨论】:
-
请提供minimal reproducible example 并描述您遇到的确切问题。而且,如文档中所述,
useFirebirdAutoCommit选项是实验性的(可能会一直如此)。它有一些严重的缺点,包括固定事务,这确实会阻碍垃圾收集。 -
另外请解释“自动提交不起作用”(如:数据对其他事务不可见吗?)。如果实际问题是您的数据库的增长,那么这正是因为您正在使用
useFirebirdAutocommit和长时间运行的连接。使用useFirebirdAutoCommit实际上不会提交事务句柄,并且由于其内部机制,这意味着垃圾收集被禁止,这对于持续处于自动提交模式的长期连接来说尤其痛苦。
标签: java jdbc firebird autocommit jaybird