我有一个从外部代码获取JPA实体的服务.在这个服务中,我想迭代一个延迟加载的集合,该集合是该实体的一个属性,以查看客户端是否相对于DB中的当前版本添加了一些内容.
但是,客户端可能从未触及过该集合,因此它仍未初始化.这导致众所周知
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.SomeEntity.
当然,如果客户从未触及过该集合,我的服务无需检查它是否有可能发生变化.问题是我似乎无法找到一种方法来测试集合是否已初始化.我想我可以打电话size()给它,如果它抛出LazyInitializationException我会知道,但我试图不依赖于这样的模式.
isInitialized()某处有某种方法吗?
遵循最佳实践,我Thread.currentThread().getContextClassLoader().getResourceAsStream用于在Web应用程序(如文本文件或xml文件)中加载资源,而不是通过文件API.
但是,这样做的缺点是,如果资源在磁盘上发生更改,则对getResourceAsStream的以下调用将无限期地返回旧版本.
我希望它能拿到新版本.在我的调试器中,我看到classLoader中有一个名为resourceEntries的简单HashMap.使用反射我已经能够删除一个特定的条目,这似乎工作.
然而,这种方法很脆弱.
有更标准的方法吗?
我正在尝试使用Hadoop并创建一个非常简单的地图并减少工作量.输入是一个30行文本文件,输出只有3行(它是日志文件的摘录,其中地图提取页面名称和执行时间,而reduce计算min,max和avg执行时间).
这个简单的工作需要大约36秒才能在Padoo-distributed模式下在Hadoop上执行(fs.default.name = hdfs:// localhost,dfs.replication = 1,mapred.job.tracker = localhost:8021).这是运行Ubuntu 10.04的2.93Ghz Nehalem,8GB内存,X25-E SSD.
我在mapper和reducer中为每次调用添加了调试输出,这清楚地表明每次调用mapper都是如此.减速器发生在同一秒.换句话说,开销是在Hadoop实际调用我的代码之前和之后.
这是最终输出:
18:16:59 INFO input.FileInputFormat: Total input paths to process : 1
18:16:59 INFO mapred.JobClient: Running job: job_201108251550_0023
18:17:00 INFO mapred.JobClient: map 0% reduce 0%
18:17:15 INFO mapred.JobClient: map 100% reduce 0%
18:17:30 INFO mapred.JobClient: map 100% reduce 100%
18:17:35 INFO mapred.JobClient: Job complete: job_201108251550_0023
18:17:35 INFO mapred.JobClient: Counters: 25
18:17:35 INFO mapred.JobClient: Job Counters
18:17:35 INFO mapred.JobClient: Launched reduce tasks=1
18:17:35 INFO mapred.JobClient: …Run Code Online (Sandbox Code Playgroud)