我正在研究一个项目,我们是批量加载并在Oracle数据库中存储大量数据,这些数据经常通过Hibernate对这个1亿多个记录表进行查询(读取比写入更频繁).为了加快速度,我们使用Lucene进行一些查询(尤其是地理边界框查询)和Hibernate二级缓存,但这仍然不够.我们仍然遇到针对Oracle的Hibernate查询的瓶颈(由于缺少那么多内存,我们不会在Hibernate二级缓存中缓存超过1亿个表实体).
在这种情况下我可以利用哪些额外的NoSQL解决方案(除了Lucene)?
我想到的一些选择是:
使用分布式ehcache(Terracotta)用于Hibernate二级,以跨机器利用更多内存并减少重复缓存(现在每个VM都有自己的缓存).
要在内存中完全使用像H2这样的SQL数据库,但不幸的是,这些解决方案需要将100多万个表加载到单个VM中.
使用Lucene进行查询,使用BigTable(或分布式hashmap)进行实体查找.什么BigTable实现适合这个?我在考虑HBase.
使用MongoDB存储数据以及通过id查询和查找.
什么是可以在Java中使用的最佳开源分布式缓存?
我认为这是EHCache,但显然它只能在使用Terracotta Server Array(商业产品)时在多个节点上进行缩放.
我的目标是以一定的延迟实时构建用于流数据的缓存,并且我实际估计的数据大小为8gb,而生产速率则慢得多,大约为每秒3mb.
由于存在初始延迟,我希望我的缓存也可以被复制,因为当从0开始时,我的缓存将需要一个我非常感兴趣避免的预热期.
我只是不知道.我的意思是,有一些话题让我不再相信这样的话题.
例如,最新的稳定版本(3.0.0-stable),有一个破坏的eclipse插件根本不起作用.此外,尝试在修订版之间进行升级是一个巨大的麻烦,因为所有服务器都与不具有完全相同版本号的所有客户端不兼容.
我还没有完全了解,但看起来Terracotta很快就会成为一个容易出现的瓶颈.
您有什么想法,StackOverflow?你是否成功使用过兵马俑,或者你也发现它有点......不成熟?
我正在尝试决定是否从Hibernate
全身使用转为使用JPA2.0
,从而提供便携式设备.
1. JPA2.0
支持自定义用户类型吗?
2.我正处于实现Terracotta
二级缓存的边缘,Hibernate
主要考虑其聚类能力.我想,但我实际上并不知道,这JPA2.0
也定义了二级缓存提供程序的规范.如果我是对的,是否Terracotta
实施了它?(如果有人能指出我的入门Terracotta
,JPA
我会很感激).
感谢提前,
Ittai
我正在探索帮助我的内存密集型应用程序的选项,在这样做时我遇到了Terracotta的BigMemory.从我收集的内容来看,它们利用了非垃圾收集的堆外"本机内存",显然由于序列化/反序列化问题,这比堆存储慢大约10倍.在阅读BigMemory之前,我从未听说过正常JNI之外的"本机记忆".尽管BigMemory是一个值得进一步考虑的有趣选项,但如果可以绕过序列化问题,我会对本机内存可以实现的内容感到好奇.
ByteBuffer
当没有序列化问题时(例如,如果我将它与巨大的比较),Java本机内存是否比传统堆内存更快(我认为这需要对象?byte[]
)?或者做垃圾收集的变幻莫测等让这个问题无法回答?我知道"测量它"是一个常见的答案,但我担心我不会建立一个代表性的测试,因为我还不太了解本机内存在Java中是如何工作的.
我刚刚读到 BigMemory如何允许Java系统扩展而不是扩展.
关于BigMemory:
BigMemory使Java应用程序能够即时,轻松地访问大量内存,而不受垃圾收集的限制.
BigMemory是纯Java,提供进程内堆外缓存,允许您存储大量数据 - 最接近应用程序的TB级.
这一突破性解决方案通过独立和分布式缓存提高了内存利用率和应用程序性能.
那么我如何对.net做同样的事情,例如进程内,堆外缓存.(注意Asp.net缓存是在垃圾收集堆上)
.net garbage-collection terracotta scalability ehcache-bigmemory
因此,我试图最终了解基于云的企业应用程序如何工作,以及他们的架构通常是什么样子.假设我使用像亚马逊这样的云提供商.我假设(请纠正我,如果我错了),我将支付1+个虚拟机,根据我的应用程序需要容纳一堆软件.
我对jclouds或Terracotta这样的框架如何融入图片感到困惑.jclouds将自己宣传为" 一个可以帮助您开始使用云的开源库 ",并列出了许多巨大的功能,如果没有有意义的示例,对我来说并不重要.Terracotta自称是一个高规模的集群框架.为什么我需要使用像jclouds这样的东西?我将使用哪些具体的具体方案?
再说一遍,如果我使用亚马逊作为我的云提供商,他们不会已经高度扩展吗?为什么我需要云中的兵马俑?
我在我的应用程序中使用带有兵马俑的ehcache.当我使用赤土陶器的ehcache时,我的响应时间增加了700倍.我认为兵马俑正在花时间测量物体的大小,因为它给了我警告:
net.sf.ehcache.pool.sizeof.ObjectGraphWalker checkMaxDepth警告:在尝试计算对象图的大小时,已达到配置的1,000个对象引用限制.如果继续进行尺寸调整操作,则可能发生严重的性能下降.通过将CacheManger或Cache元素maxDepthExceededBehavior设置为"abort"或使用@IgnoreSizeOf注释添加停止点,可以避免这种情况.如果性能下降不是配置限制的问题,请使用CacheManager或Cache元素maxDepth属性提高限制值.有关更多信息,请参阅Ehcache配置文档.
当我在课堂上使用@IgnoreSizeOf注释时,响应时间减少了很多.我的问题是使用@IgnoreSizeOf注释有什么缺点.对于它的使用方式以及它如何缩短我的应用程序的响应时间请帮助.提前致谢.
在我的ehcache配置中,我看到了这些:
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
Run Code Online (Sandbox Code Playgroud)
这有什么意义?
文档提到timeToLiveSeconds ="0"表示不会进行这些检查.所以这意味着物体将是永恒的,即使"永恒"被设定为假?
目前我们正在分析一个tomcat线程转储.在tomcat上同时运行的所有线程的单个线程转储包含以下行:
...
"soldOutJmsConsumerContainer-1" prio=10 tid=0x00007f8409c14800 nid=0x231 in Object.wait() [0x00007f8403a9f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-33" daemon prio=10 tid=0x0000000041bc4000 nid=0x832 in Object.wait() [0x00007f8400f73000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- locked <0x00007f847612c820> (a com.tc.object.RemoteObjectManagerImpl)
...
"catalina-exec-109" daemon prio=10 tid=0x0000000041469800 nid=0x1e87 in Object.wait() [0x00007f83f84c1000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150)
at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216)
- …
Run Code Online (Sandbox Code Playgroud) 我一直在使用我的项目中实现一些缓存EhCache
.我已将以下依赖项添加到我的pom.xml中
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
请注意第三个依赖项EhCache
.在我在网上找到的所有教程中,组ID都不同.我改变组ID的原因是它被移动到了org.ehcache
.
我的classpath中有以下ehcache.xml文件.
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true"
monitoring="autodetect"
dynamicConfig="true">
<diskStore path="java.io.tmpdir"/>
<cache name="cardTypes"
maxEntriesLocalHeap="100"
maxEntriesLocalDisk="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
<persistence strategy="localTempSwap"/>
</cache>
</ehcache>
Run Code Online (Sandbox Code Playgroud)
以下是我的配置文件.
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.core.io.ClassPathResource;
@EnableCaching
@Configuration
public class CacheConfig {
@Bean
public CacheManager …
Run Code Online (Sandbox Code Playgroud) 将 Spring Boot 应用程序部署到 Pivotal Cloud Foundry 失败并出现以下错误。实例的限制设置为 2GB,然后是 4GB。本地应用程序在 2GB 堆大小下启动良好。应用程序在缓存管理器初始化期间失败。知道根本原因是什么吗?不确定 terracotta 在云铸造中扮演什么角色以及还需要寻找什么?
2019-05-07T19:24:53.39+0530 [APP/PROC/WEB/0] OUT at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
2019-05-07T19:24:53.39+0530 [APP/PROC/WEB/0] OUT Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'cacheManager' threw exception; nested exception is org.ehcache.StateTransitionException: Cache '<name hidden>' creation in EhcacheManager failed.
....
Caused by: java.lang.IllegalArgumentException: An attempt was made to allocate more off-heap memory than the JVM can allow. The limit on off-heap memory size is given by the -XX:MaxDirectMemorySize command (or equivalent).
2019-05-07T19:15:13.15+0530 [APP/PROC/WEB/0] OUT …
Run Code Online (Sandbox Code Playgroud) terracotta ×12
java ×6
ehcache ×4
caching ×2
hibernate ×2
.net ×1
bytebuffer ×1
cloud ×1
concurrency ×1
hbase ×1
heap-memory ×1
jclouds ×1
jpa-2.0 ×1
jvm ×1
locking ×1
maven ×1
memory ×1
mongodb ×1
monitor ×1
nosql ×1
scalability ×1
spring-boot ×1
spring-cache ×1