我注意到Solr 4.0为具有关系的文档引入了"join"功能.这很好,但是,我注意到http://wiki.apache.org/solr/Join给出的示例是单核,所有文档都在单个索引中.
有人知道我是否可以使用'join'作为多核心?
我认为这是一个相当普遍的问题:如何将我的业务逻辑放在分布式系统环境中的全局事务中?举个例子,我有一个包含几个子任务的TaskA:
TaskA {subtask1,subtask2,subtask3 ...}
这些子任务中的每一个都可以在本地机器或远程机器上执行,我希望TaskA通过事务以原子方式(成功或失败)执行.每个子任务都有一个回滚函数,一旦TaskA认为操作失败(因为其中一个子任务失败),它就会调用子任务的每个回滚函数.否则,TaskA会提交整个事务.
为此,我按照"审计试用"事务模式来记录每个子任务,因此TaskA可以知道子任务的操作结果,然后决定回滚或提交.这听起来很简单,但是,困难的部分是如何将每个子任务与全局事务相关联?
当TaskA开始时,它启动一个关于哪个子任务什么都不知道的全局事务.为了使子任务意识到它,我必须将事务上下文传递给每个子任务调用.这真是太可怕了!我的子任务可以在新线程中执行,也可以通过AMQP代理发送消息在远程执行,很难巩固上下文传播的方式.
我做了一些研究,如"交易模式 - 四个交易相关模式的集合","异步消息传递环境中的已检查事务",这些都没有解决我的问题.他们要么没有实际的例子,要么没有解决上下文传播问题.
我想知道人们如何解决这个问题 因为这种交易必须在企业软件中很常见.
X/Open XA只是解决方案吗?JTA可以在这里提供帮助(我没有考虑JTA,因为它与数据库事务有关,我使用Spring,我不想在我的软件中涉及另一个Java EE应用服务器).
有些专家可以和我分享一些想法吗?谢谢.
Arjan和Martin给出了非常好的答案,谢谢.最后我没有这样做.经过更多的研究,我选择了另一种模式" CheckPoint " 1.
根据我的要求,我发现我的"审核试验事务模式"的意图是知道操作已进行到哪个级别,如果失败,我可以在重新加载某些上下文后在失败的地点重新启动它.实际上这不是事务,它在失败后没有回滚其他成功的步骤.这是CheckPoint模式的精髓.然而,研究分布式交易的东西让我学到了很多有趣的东西.除了Arjan和Martin提到的.我还建议人们深入研究这个领域,看看CORBA,这是一个众所周知的分布式系统协议.
假设我有连续的整数范围[0, 1, 2, 4, 6],其中第一个3是"缺失"数字.我需要一个算法来找到第一个"洞".由于范围非常大(可能包含2^32条目),因此效率很重要.数字范围存储在磁盘上; 空间效率也是一个主要问题.
什么是最好的时间和空间效率算法?
我正在分析我的应用程序,它使用Spring,Hibernate和mysql-java-connector.VisualVM显示,com.myql.jdbc.utils.ReadAheadInputStream.fill()当有1000个并行连接正在读取时,超过50%的CPU时间花在方法上.
是否有任何优化使其更快?
当我使用企业应用程序时,经常会遇到一些错误,需要咨询服务台。我发现许多应用程序仍然倾向于使用数字作为错误代码而不是人类可读的字符串。鉴于大多数企业应用程序都是用 java/C# 等现代语言编写的,我无法弄清楚使用数字错误代码有什么好处。
那么问题来了,对于企业应用来说,是否有一个通用的错误码定义模式呢?有什么原因数字比字符串更受欢迎吗?
顺便说一句:我了解使用 REST API 的应用程序可能使用 http 状态代码作为错误代码,这可以理解为 http 状态代码本身就是数字。但对于其他人,我不明白
这对我来说真的很奇怪,但看起来我的程序中的notifyAll()/ notify()失败了.代码相当复杂,基本上我有三个线程A,B,C
A向请求发送请求并在请求上等待()10秒超时,当B完成时,它调用notify()来唤醒A.
死循环中的C通过队列向A提供大量字符串,A拾取它们并打印出来.每次A打印出一个字符串,它就会向B发送请求并等待.
所以工作流程变为:
C继续喂食死角
B通知()A ......
A一次又一次打印出来自C ....的字符串....
这可以在几秒钟内完成.然而,过了一会儿我看到B打印出来它已经通知()A,A仍然在等待,因为C用来喂A的队列快速增加,并且没有字符串被A打印.最后,10秒后,A抱怨请求超时.
这看起来像notify()失败,因为B在调用notify()之后打印出消息.鉴于wait/notify是java的根本特性,我不敢相信它会失败.可能吗?
JPA2.0中的CriteriaQuery提供了一种类型安全的选择方法,它非常棒.但我想知道它为什么不提供更新/删除操作?要批量更新/删除,您必须回到旧时编写容易出错的SQL或JPQL文本.IMO,更新/删除的CriteriaQuery不应该证明是困难的,因为where cause处理与select相同.
希望这将在下一版本的JPA中实现.
我正在阅读"实用API设计"并找到以下段落:
" 可以在JVM规范中找到优先使用字段的方法的另一个原因.您可以将方法从类移动到其超类之一,并且仍然保持二进制兼容性.因此,最初作为Dimension javax.swing引入的方法.JComponent.getPreferredSize(Dimension d)可以在新版本中删除并移动到Dimension java.awt.Component.getPreferredSize(Dimension d),因为JComponent是Component的子类.这样的更改确实发生在JDK 1.2中,并且这可以仅仅因为字段被方法封装而完成.对于字段不允许这样的操作.一旦在类中定义字段,它必须永远保持在那里以保持二进制兼容性,这是另一个原因保持字段私密 "
因为我同意使用getter/setter是更好的方法.但是我不明白为什么将公共字段移到父类会打破二进制兼容性?您仍然可以通过子类访问该字段,只要它在父级中是公共的.
我们来说就像一张桌子
CREATE TABLE `testdb`.`test` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
还有其他表可能有外键引用test.id列.有趣的是我不知道哪个表有这样的外键以及表有多少行.
现在我想计算分散在具有test.id的外键的表中的行数.可能吗?
我认为这是理论上的可能,否则,MySQL不能做这样的操作ON DELETE CASCADE,DELETE SET NULL...
我有两个实体:
@Entity
@Table(name="TableA")
public class TableA {
@Id
@Column(name="id")
long id;
@Column(name="tableB_id")
long tbId;
@Column(name="column1", table="TableB")
String tbColumn1;
}
@Entity
@Table(name="TableB")
public class TableB {
@Id
@Column(name="id")
long id;
@Column(name="column1")
String column1;
}
Run Code Online (Sandbox Code Playgroud)
TableA对TableB.id有一个外键'tbId'.并且TableB有一个名为"column1"的列,现在我希望通过某种连接在TableA实体中获得"column1".在JPA方面我应该采取什么方式?这不是OneToOne,因为我不想在TableA中连接整个TableB实体.