WEB 开发 u2// ,数据库用得是 ,数据库缓存是构架在 hibernate 之上的,是一个只有 794 行的 java 类, 但这个 java 类却做了数据库对象缓存、列表缓存、 update 缓冲、自动删除列表缓存,还提供了数据库查询、更新、插入的所有操作, 它节省了我一半以上的开发时间。一个获取含有五个查询条件获取列表的方法只用不到 10 行代码就可以了。【增加: 现在我已经把这个数据库操作工具改成分布式了,可以随便增加 java 应用服务器实现负载均衡, 并且各服务器之间可以实现缓存同步, 这样, 即使每日用户达到百万级别, 我的构架也是可以支持的, 我将在下面详细说明我的构架, 仅供参考。许多人要求我开源, 我觉得现在系统还没有经过大规模用户的并发验证, 还不是时候, 以后我会考虑开源的, 我的代码没有太多高深的算法和设计模式, 主要用到了模板模式, 但全是用心写出来的。问题一:做数据库缓存时遇到的问题。 HashMap 在并发遍历时会报 ConcurrentModificationException ,即使使用 把 Map 包起来还是会报这个异常, 这个问题很简单, 解决办法也简单。第一种解决办法是不要用 Map 的 iterator 来遍历,而是用 Set ( 方法)的 toArray 方法来遍历,这种办法虽然会损耗一定的性能和内存,但比在方法前加 synchronized 好得多;第二种解决办法用 以后的 ConcurrentHashMap 来实现。【修正:经过测试和验证,第一种方法不行,也就是并发操作 MAP 而且要求遍历的时候只能用 ConcruuentHashMap ,在此要感谢写 ConcurrentHashMap 的专家们。】【增加: 数据库的缓存有很多种办法, 对于单个对象的缓存比较容易, 直接用 HashMap 都可以, 但是对于列表的缓存就比较复杂了, 网上说到的 memcachedb+memcache_engin e或者 berkeleyd b 应该都是做不到列表自动缓存, 因为增加一条记录后会影响许多列表的排序, 所以什么时候删除列表缓存是个比较头痛的问题, 我的解决办法是列表的缓存的 key 便包含了查询条件信息。如一个表 T 有字段 A,B,C ,对应 有域 A,B,C ,那么查询一个 A=1 and B=2 and C>0 的组合条件的列表的 key 就是 A=1#B=2#C>0 ,这样,如果增加了一个对象 T, 其中 =1 , =3 , =0 , 显然上面列表查询条件包含了条件 B=2 , 而增加的对象 B=3 , 那么无论如何这个新增加的对象 T 都不可能在这个列表中,也就是说不用删除这个列表,只有增加的对象 T满足 =1 、 =2 、 >0 时该列表才需要重新从数据库中获取, 以此可以推出更新、删除一个 T 对象时什么时候需要删除什么列表。】【增加: 至于分布式, 我用到了 memcached 来做远程缓存, 利用 UDP 报文来保持各服务器之间的缓存同步。如获
WEB开发 来自淘豆网m.daumloan.com转载请标明出处.