2

我正在开发一个读取大文件(500 Mo)、反序列化这些文件(protobuf 消息 - Google api)并将其插入到 oracle 11 DB 的 java 独立应用程序。

要说的重要一点是数据库中有一个主表,还有几个小表(可以与字典进行比较)。对于所有词典,我都有一个 Google 缓存(Guava)。主表没有缓存。在主表中只有插入,没有更新,没有删除。

目前,该应用程序运行在单个 JVM 上。(可能,我可以添加多线程。)

我想让它在几个JVM上工作。我的问题是知道该怎么做才能获得更高的性能并使其正常工作。我发现了两个问题:如果集群应用程序允许我同时读取多个文件,如何更快地插入主表,以及如何更新缓存?

有人对此有想法吗?

4

1 回答 1

2

如何更快地插入主表

大奖!您必须确定瓶颈,并且很可能是读取文件或数据库。文件很简单,只需将它们拆分并放在不同的机器上。当然,在同一台机器上运行多个 JVM 无济于事,因为它们都会竞争 I/O。因此,您必须拆分文件并将它们与 JVM 一起分发到多台机器上。

我认为反序列化 protobuf 不是瓶颈,它需要一些 CPU,但不需要那么多。

最后你有一个数据库。单个单线程 JVM 可能可以充分利用数据库,但值得一试。首先让你的应用程序多线程,看看它是否有帮助。

如何更新缓存?

再次中奖。您还必须分发/集群您的缓存。Guava 缓存是不够的,你需要更复杂的东西,比如 RMI 集群 EhCache、Terracotta 或 Hazelcast。基本上,它们提供缓存 API,但会通知集群的其他成员缓存已更改并需要失效。

BTW 500 MiB 真的没有那么多,处理需要多长时间?同样,您必须剖析以找出使您放慢速度的原因。

于 2012-10-19T19:53:38.253 回答