我打算用mysql数据库创建一个桌面应用程序。我的数据库表经常变化 - 几乎60%的表。所以我认为缓存可能是一个坏主意。任何人都可以建议我:
如何使用远程数据库创建快速桌面应用程序?
我的语言是Java。
答案 0 :(得分:1)
这里有一些解决问题的通用方法。
0)HW:确保你的硬件没有瓶颈,你可以便宜地增加。 (在大多数情况下,添加硬件的速度更快,更便宜)
1)缓存: 也许您可以缓存(本地或在分布式缓存中,如memcache)40%的数据往往是不可变的。您可以在修改数据时使缓存无效。您应该选择正确的实体和粒度级别来构建密钥。
2)复制: 如果第一个是开销很大,你可以创建你的mysql的奴隶并从那里读取。同样,您必须知道什么时候能够负担得起一些陈旧的数据。
3)NoSQL: 向这个方向移动,但增加开发工作量,你可以转移到一些分布式商店(在做出选择之前先看看CAP定理)
希望有所帮助
答案 1 :(得分:1)
大多数以性能为主要关注点的项目存在的最大问题是人们倾向于做出一些奇特的选择,最终使项目变得复杂而没有任何实际好处。除非您以前有过实际的环境实践经验,否则您的工作将开始变得简单。
在开始之前,设置一些关于刷新数据的频率的现实目标。如果您的数据经常变化,例如。每一秒,尝试实时显示变化是否有意义?每秒一次查询会让每个人都感到悲惨。
使用线程来处理查询。你不需要不止一个,因为任何更多只会使数据库中的竞争条件变得更糟。
将数据库层设计为与应用程序的其余部分隔离。还要从头开始计算与数据库相关的操作,以便跟踪优化的影响。
从Hibernate / ORMLite开始。虽然我不能谈论ORMLite,但我在重负载环境中使用(优化)Hibernate没有任何问题。如果您有复杂的对象,您应该尝试一下,它肯定会使用普通的JDBC并自己实现缓存机制。
了解何时需要延迟加载以及什么时候放慢速度(由于选择n + 1问题)。
如果您有性能问题优化。您不必映射每个关系。在单独的方法中使用自定义SQL,以在需要时获取所需的对象。您可以编写一个只返回表ID的查询,然后请求Hibernate加载相应的对象。
优化您的SQL。避免连接,使用subselects,其中id等等。
如果有意义的话,实施(数据库)分页。
如果所有其他方法都失败,请开始使用纯SQL。你'我已经写了最复杂的查询,你就会知道你的瓶颈在哪里。
您可以使用本地SQLite来保存不太易变的数据并与数据库交谈,主要是为了获取ID列表以及您丢失的内容。例如,如果您有用户和订单,则可以假设每分钟/秒的新订单数比每小时用户多。
总而言之,在开始之前设置明确的性能目标,始终使用单独的线程进行数据检索,避免重新发明轮子并尽可能简单。
答案 2 :(得分:0)
取决于您的数据库结构和应用程序。您可以使用对象关系映射库(如ormlite)并使用线程刷新从后台数据库加载的对象。使用ormlite,您还可以使用LazyForeignCollection仅在应用程序中加载所需的数据。
答案 3 :(得分:0)
尽量减少不必要的数据库调用。
如果数据库中的字段发生变化,您可以从关系数据库转移到NoSQL数据库,如MongoDB。
您可以在服务器端执行多线程处理,以便对应用程序服务器进行数据处理和群集。虽然使用多线程有效地使用它,但要注意sychronized
关键字,它会在一定程度上降低性能。
执行编码的最佳实践,不要使用更多的实例变量,尝试使用局部变量,它也会使你的线程安全。
对于大型查询,您也可以将Mybatis用于ORM。
您可以在DAO层,服务层甚至客户端执行缓存,但一定要与数据库同步,您可以使用不同的缓存源。
您可以为第一次回溯进行数据库索引。
不要使用相同的服务进行大数据查询,将其分解为不同的服务,这将有助于您以多线程方式处理。
如果应用程序不是非常硬的实时系统,您也可以使用消息传递解决方案,例如异步处理数据。