java - Corda - 在 Corda 保险库中存储字符串数据是否有任何限制?
问题描述
我想存储一个大小为 194 个字符及以上的字符串数据。当我试图存储这样的字符串时,它正在执行流并且正在创建状态对象,但是在服务器端它抛出了一个异常,如下所示:
Caused by: net.corda.core.CordaRuntimeException:
com.esotericsoftware.kryo.KryoException:
java.lang.UnsupportedOperationException:
net.corda.nodeapi.internal.persistence.CordaPersistence, which is a
closeable resource, has been detected during flow checkpointing.
Restoring such resources across node restarts is not supported. Make
sure code accessing it is confined to a private method or the
reference is nulled out.
我能够毫无例外地存储精确的 194 个字符的字符串。但如果超过 200 个字符,则会发生异常。
我使用的是 cords 4.3 版本和默认的 H2 DB。我要存储的字符串是:
"3C03582C57E94C493CEE2B3FFCBAB9757F265DB03EDFB418739D77ECE1C5B66A,EE5B0454A8993279AB1D409872D5B364CD38FCB8C3B6740FB4DEF3B5E55AFEF7,CC96E3E8348ADAC42FFBEA3C7C1A88EDFC7A391421DB6F97FB80C53F52E11F41,69D77466FEACE0F702CBF2244F2A55526DFBC5F1180AB69EA561E15542155AB1"
解决方案
- 该错误与字符串大小无关。在您的流程中,您正在使用 Corda 在流程检查点/恢复期间无法序列化/反序列化的一些对象。
您是否有任何对象,例如 HTTP 客户端或数据库连接/结果集?如果这样做,根据错误消息;null
一旦你完成使用它 ,你必须将该对象引用设置为。 - 为了回答您关于字符串大小的问题,事务作为数据块存储在
NODE_TRANSACTIONS
表中的TRANSACTION_VALUE
列中(请参见此处);而且我很确定 Blob 列的大小非常大(您可以使用您最喜欢的 SQL 编辑器检查它的大小);但是您必须记住,控制大小限制的实际上maxTransactionSize
是在网络级别设置的网络参数之一(即,属于该网络的所有节点都必须遵守这些参数);因此,如果您maxTransactionSize
设置为 500 MB,那么即使NODE_TRANSACTIONS
表可以处理,您也不能发送大小超过 500 MB 的事务(请参见此处)。
网络参数缓存在network-parameters
节点目录中的文件。您还可以使用节点资源管理器查看该文件的值。
推荐阅读
- android - 使用 ViewPager2 和 FragmentStateAdapter 的片段生命周期行为
- typescript - 包装一个返回值为 Promise 的函数
| undefined 始终返回 Promise 并保持输入 - asp.net - 将 ASP.net 应用程序从 windows 2008r2 迁移到 windows 2012r2 时的 DateFormat 问题
- html - 更改悬停时的 SVG 填充
- autodesk-forge - autodesk-model-derivative 401 无效的授权标头
- c# - Newtonsoft.Json 跳过无效对象,继续反序列化
- javascript - msSaveBlob 不返回完整图像
- amazon-web-services - Gitlab CI 管道每次构建都需要很长时间
- android - 在android的imageview中拖放水印的功能?
- android - 如何在 Android 中创建一个表,其中一个单元格引用了我数据库中的另一个表?