在Martin Fowler的书中,我读到了UnitofWork
和IdentityMap
模式。
作者提到,将identityMap放在UnitOfWork内部是一个好主意。但怎么做呢?
据我所知,identitymap
受会话限制,但作者没有提到UnitofWork
public clas Client{
List<Order> orders;
...
}
每个unitOfWork实例需要多少个IdentityMap实例?
如果我们有两个并发请求呢?
问:UnitOfWork
实例是否受会话限制?
在马丁的书的第11章中,你读到:
“一个工作单元跟踪您在可能影响数据库的业务事务期间所做的一切。完成后,它会计算出作为您工作的结果而需要进行的更改数据库的所有操作。[...]
class UnitOfWorkServlet...
final protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
UnitOfWork.newCurrent();
handleGet(request, response);
UnitOfWork.getCurrent().commit();
} finally {
UnitOfWork.html" target="_blank">setCurrent(null);
}
}
abstract void handleGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
在本例中,您可以将会话理解为UnitOfWork
。在书的后面,他解释说:
“如果您有多个映射,明显的路径是每个类或每个表一个映射,如果您的数据库模式和对象模型相同,这会很好地工作。“
在后面的几段中,Martin解释了identitymap
的位置:
现在,“业务事务”的范围可能是短暂的,例如,绑定到HTTP请求的生命期,就像Martin Fowler在上面的例子中那样,其中UnitOfWork似乎绑定到每个请求的线程本地变量。
或者“业务事务”可以包含多个请求,例如在JPA中有一个扩展持久性上下文的概念,其中JPA中的持久性上下文对应于UnitOfWork
模式。在扩展的持久性上下文中,业务事务扩展的时间更长。一个典型的例子是购物车:当用户开始将项目放入购物车时,就会创建上下文/工作单元,直到用户签出购物车(提交更改)或会话过期(丢弃工作单元中的所有内容),上下文才会被清除。
现在,还有应用程序管理上下文的思想,这基本上意味着,在您认为合适的时候启动您的工作单元,在您不再需要它的时候关闭它。例如,假设您有一个桌面应用程序和一个具有隔离并发性的小型数据库(即每个用户只管理自己的数据,从不与其他用户的数据冲突)。假设用户的数据可以完美地放入计算机的内存中。在这种情况下,您可以在应用程序开始时启动UnitOfWork
,并将其用作数据库的某种缓存。适当时,可以将UnitOfWork刷新到磁盘上,例如当用户单击save按钮时,但仍保持其活动状态。当用户关闭应用程序时,UnitOfWork将被丢弃。
根据到目前为止的解释,您可以有多个工作单元,其中包括以下原因:
UnitWork
,如果您的应用程序处理并发请求,那么您将同时拥有多个工作实例单元。UnitOfWork
绑定到用户的会话。如果有多个用户,则可以有多个工作单元。然而,除了这些,我还发现了其他原因,为什么你可能希望在同一“业务交易”期间产生一个新的工作单元。
我尝试使ajv使用两个JSON-Schema,一个依赖于另一个。下面是我的模式的一个示例(简化): json 错误:没有带有键或引用“http://json-schema.org/draft-04/schema#”的模式 更新:如果我从types.json中删除“$schema…”,我得到的错误是: MissingReferror:无法从id#中解析引用types.json#/definition
我正在读取Kafka的流,我将Kafka的值(即JSON)转换为结构。 有一个变体,它采用类型的模式,但我找不到示例。请告知下面代码中的错误。 错误 程序
问题内容: 我正在使用大猩猩架构根据用户的表单提交来填充结构。我的结构包含,并且我目前收到以下错误: 如何在要使用大猩猩架构填充的结构中使用? 问题答案: 我创建了一个要点(https://gist.github.com/carbocation/51b55297702c7d30d3ef),它显示了解决此问题的一种方法。您需要为以下四种类型的每一种创建一个:sql.NullString,sql.Nu
问题内容: 使Super Dev模式与IntelliJ配合使用时,我遇到很多问题。这个问题,以及我在下面的回答,是为将来可能遇到此问题的其他任何人(和我自己的参考)记录如何做到这一点: 问题答案: IntelliJ IDEA 14 EAP 现在提供了对GWT Super Dev Mode的改进支持。您将需要使用JetBrains IDE插件在Chrome上进行JavaScript调试,然后安装GW
问题内容: 我试图将Python 3程序反向移植到2.7,但遇到了一个奇怪的问题: 根据文档,返回Unicode文本的内存流。当我尝试手动输入Unicode字符串时,它可以正常工作。为什么即使所有写入的字符串都是Unicode字符串,它也无法与模块结合使用?在什么地方来,它使得异常? (我知道我可以代替使用,但是我想知道在这种情况下怎么了) 问题答案: Python 2.7模块不支持Unicode