Java 编辑从数据库读取的数百条协议缓冲区序列化消息

Java 编辑从数据库读取的数百条协议缓冲区序列化消息,java,database,performance,protocol-buffers,Java,Database,Performance,Protocol Buffers,对于应用程序上的操作,我需要从数据库读取,然后编辑数百条协议缓冲区序列化消息。在每个PB消息中,实际上有4个int字段和一个boolean字段,而在新消息中,只需要更改boolean字段 我怀疑什么是实现这一目标的最佳方式,并因此寻求您的帮助和专家意见 我想通过创建builder对象来再次构建整个消息会非常昂贵。我建议您进行基准测试,看看需要多长时间。您可以在1毫秒内完成此操作,这意味着您执行的任何IO都可能比处理数据的方式更昂贵。我建议您重新设计数据库,以便要修改的协议缓冲区消息中的字段位于单

对于应用程序上的操作,我需要从数据库读取,然后编辑数百条协议缓冲区序列化消息。在每个PB消息中,实际上有4个
int
字段和一个
boolean
字段,而在新消息中,只需要更改boolean字段

我怀疑什么是实现这一目标的最佳方式,并因此寻求您的帮助和专家意见


我想通过创建
builder
对象来再次构建整个消息会非常昂贵。

我建议您进行基准测试,看看需要多长时间。您可以在1毫秒内完成此操作,这意味着您执行的任何IO都可能比处理数据的方式更昂贵。

我建议您重新设计数据库,以便要修改的协议缓冲区消息中的字段位于单独的数据库列中。因此,您不必将整个协议缓冲区消息序列化到一列中(我假定您现在在数据库中拥有这一列),而是可以用其他方式表示它。然后您可以只使用一个简单的SQL
UPDATE
命令

我的意思是,使用为关系数据存储而设计的数据库来存储需要更新的序列化数据没有什么意义。它阻碍了SQL的有效使用

或者,我不知道是否有专门用于处理协议缓冲区的数据库,但肯定有专门用于处理XML文档的XML数据库,因此您可以尝试将数据转换为XML并使用其中的一个。不过,对于这一个问题来说,这可能太过分了!但是如果你有很多像这样的小任务要做,这可能是值得的


但是,如果没有更多关于应用程序和/或数据库用途的详细信息,很难说什么是最好的。

构建器方法应该足够便宜,特别是如果您可以在服务器附近执行以最小化延迟。但是,如果位字段具有第一个/最后一个字段编号,则第二个或最后一个字节中都应该是单字节更新,因此,如果您愿意,在SQL中也可以这样做。事实上,只要你想跳过Its(也就是说,你不需要知道它们是什么或者改变它们),即使在中间挑选出BoL也会相当容易。


但首先尝试使用现有客户端的路由;这可能比你想象的要快。

我不确定我是否理解你的问题。看起来您正在从数据库读取一些数据(“协议缓冲区序列化消息”);此类数据由5个字段组成,最终需要更新一个字段的值(布尔值)。您不能使用SQL
更新吗?@MarcoS由于消息是序列化的,它们可能都在一个SQL列中。(对于这个问题来说,这可能是糟糕的数据库设计。)@罗宾·格林:谢谢你的解释:我没有考虑过。所以,如果消息的序列化程度比我认为的要高,那么您必须
选择要更新的消息,然后处理它们中的每一个:反序列化、更新布尔字段、再次序列化以及更新数据库上的记录。。。或者更改数据库设计,每个字段都有一个列。我使用Cassandra DB,它本身不提供“更新”功能,因此无论如何我需要读取一个新列,然后将其写回DB。因此,延迟保持不变。但我问的是,创建一条新消息&从解析的PB消息中输入值是否是正确的方法,或者我是否可以编辑从读取字节解析回来的消息,然后发送回DB?非常感谢@Marcos-一旦您通过网络传输了数据,任何本地处理时间都不会太明显,而且是风险最小的方法。当然,使用生成器。如果你绝对需要最好的性能,也可以使用阅读器,但是你需要非常清楚协议的内部结构。哦,还有“几百条”——对于你描述的小消息来说,这应该是非常快的;i、 远低于一秒