维基百科有关分布式事务的文章不是很有帮助.
您能否对分布式事务的内容进行高级描述?
另外,您能举例说明为什么应用程序或数据库应该执行更新两台或多台联网计算机上的数据的事务吗?我理解了经典的银行例子; 我更关心像Dynamo,Bigtable,HBase或Cassandra这样的Web规模数据库中的分布式事务.
我有一个线程调用T1读取平面文件并解析它.我需要创建一个新的线程,T2用于解析此文件的某些部分,稍后此T2线程需要更新原始实体的状态,原始线程也会对其进行解析和更新.T1如何处理这种情况?
我收到一个包含以下样本记录的平面文件:
AAAA
BBBB
AACC
BBCC
AADD
BBDD
Run Code Online (Sandbox Code Playgroud)
首先,此文件以Received状态保存在数据库中.现在所有以BB或AA需要在单独的线程中处理的记录.一旦成功解析,两个线程都会尝试将数据库中此文件对象的状态更新为Parsed.在某些情况下,我得到了staleObjectException.编辑:在异常丢失之前,任何线程完成的工作.我们正在使用乐观锁定.避免这个问题的最佳方法是什么?
上面的帖子有助于理解它的某些部分,但它无助于解决我的问题.
我希望我的实体在更新时有一个修改时间戳.mysql使用以下定义支持此操作:
@Entity
public class MyTable {
@Column(columnDefinition = "TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
private LocalDateTime thetime;
}
Run Code Online (Sandbox Code Playgroud)
问题:在我的JUnit测试中,我想使用嵌入式内存H2数据库.H2不支持on update CURRENT_TIMESTAMP.
问题:如何保持列定义(因为除了自动化测试之外,我将在所有情况下运行mysql)?我怎样才能在h2测试中解决这个问题?
我正在尝试使用StatelessSession在OSGi环境中进行一些批量插入(Karaf 4.0.7),但是当我尝试提交我的事务时,我得到了
be.ikan.lib.orm.base.exceptions.PersistenceBrokerException: org.hibernate.TransactionException: Cannot retrieve the TransactionManager OSGi service!
at be.ikan.lib.orm.hibernate.broker.HibernateStatelessPersistenceBrokerImpl.commitTransaction(HibernateStatelessPersistenceBrokerImpl.java:118)[79:be.ikan.lib.orm:7.0.0]
at be.ikan.scm4all.business.server.bs.pack.PackageServiceImpl.createLevelRequestFileRevisionAssociations(PackageServiceImpl.java:1412)[72:be.ikan.scm4all.daemons.server:5.8.0]
at be.ikan.scm4all.phases.core.level.LinkFileRevisionsPhase.execute(LinkFileRevisionsPhase.java:99)[72:be.ikan.scm4all.daemons.server:5.8.0]
at Proxy5a8c2944_a0d5_4e21_a1b7_3f30296f5993.execute(Unknown Source)[:]
at be.ikan.scm4all.phases.impl.DefaultPhaseExecutionImpl.execute(DefaultPhaseExecutionImpl.java:152)[114:be.ikan.scm4all.daemons.shared:5.8.0]
at be.ikan.scm4all.daemons.server.monitor.MonitorThread.run(MonitorThread.java:231)[72:be.ikan.scm4all.daemons.server:5.8.0]
Caused by: org.hibernate.TransactionException: Cannot retrieve the TransactionManager OSGi service!
at org.hibernate.osgi.OsgiJtaPlatform.retrieveTransactionManager(OsgiJtaPlatform.java:51)[62:org.hibernate.osgi:5.2.17.Final]
at org.hibernate.osgi.OsgiJtaPlatform.getCurrentStatus(OsgiJtaPlatform.java:98)[62:org.hibernate.osgi:5.2.17.Final]
at org.hibernate.internal.StatelessSessionImpl.flushBeforeTransactionCompletion(StatelessSessionImpl.java:667)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.internal.StatelessSessionImpl.beforeTransactionCompletion(StatelessSessionImpl.java:644)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:156)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68)[60:org.hibernate.core:5.2.17.Final]
at be.ikan.lib.orm.hibernate.broker.HibernateStatelessPersistenceBrokerImpl.commitTransaction(HibernateStatelessPersistenceBrokerImpl.java:114)[79:be.ikan.lib.orm:7.0.0]
... 5 more
Caused by: org.hibernate.TransactionException: Cannot retrieve the TransactionManager OSGi service!
at org.hibernate.osgi.OsgiJtaPlatform.retrieveTransactionManager(OsgiJtaPlatform.java:46)[62:org.hibernate.osgi:5.2.17.Final]
Run Code Online (Sandbox Code Playgroud)
我不使用JTA来管理我的事务,我设置了hibernate.transaction.coordinator_class = jdbc.使用常规Sesssion的代码运行正常.应用程序的另一部分在非OSGi环境中运行,并且StatelessSession可以正常工作.
我将它跟踪到Hibernate源代码中,并在org.hibernate.internal.StatelessSessionImpl中找到:
@Override
public void flushBeforeTransactionCompletion() {
boolean flush = false;
try …Run Code Online (Sandbox Code Playgroud) 我对Spring不太熟悉,我有以下情况:
存储库类:
@Repository
public class MyRepository {
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用存储库类的类:
public class MyClass extends AbstractClass {
@Autowired
private MyRepository myRepository;
//...
}
Run Code Online (Sandbox Code Playgroud)
我知道,如果我注释我MyClass用@Component,并用它与一个@Autowired,那么@Autowired MyRepository解决就好了.问题是我需要创建MyClass带反射的新实例.所以MyRepository永远不会解决,并且始终为null.
有没有办法@Autowired在这种情况下使用?
更好地解释我的情况:我有一些实现AbstractClass.在我的应用程序的设置阶段,我创建了HashMap这些实现.基本上:
{"MyClass", MyClass.class}
//...
Run Code Online (Sandbox Code Playgroud)
然后我有一个Controller映射到url 的泛型/{class}?options=...
使用{class} @PathVariable,HashMap上面和反射我能够根据给定创建一个类的实例options(这部分很重要).你们认为有更好的方法吗?
提前致谢
我想学习hibernate基础知识,并且在使用@EmbeddedId复合主键的annontations 向表中添加条目时,不明白为什么我的应用程序不起作用:
代表PK的类:
@Embeddable
public class OHLCVKey implements Serializable{
private static final long serialVersionUID = -3996067621138883817L;
@Column(name="Symbol")
protected String symbol;
@Column(name="Currency")
protected String currency;
@Column(name="Datum")
protected java.sql.Date datum;
public OHLCVKey() {}
public OHLCVKey(String symbol, String currency, Date datum) {
super();
this.symbol = symbol;
this.currency = currency;
this.datum = datum;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) { …Run Code Online (Sandbox Code Playgroud) 我想取出并从列表中删除第一个元素.我可以看到,我有两个选择:
第一种方法:
LinkedList<String> servers = new LinkedList<String>();
....
String firstServerName = servers.removeFirst();
Run Code Online (Sandbox Code Playgroud)
第二种方法
ArrayList<String> servers = new ArrayList<String>();
....
String firstServerName = servers.remove(0);
Run Code Online (Sandbox Code Playgroud)
我的列表中有很多元素.
什么是最有效的方法.
我正在使用具有云功能的收据打印机。它与我正在实施的服务器规范相通讯。它每x秒用POST请求轮询URL,并且POST响应中包含某条信息时,打印机将GET请求发送到该URL,以获取要打印的信息。
我将打印服务器实现为Spring Boot服务器,而POST方法遇到一些奇怪的问题,我需要一些帮助。
我的问题是从打印机到服务器的POST请求从不发送到控制器。但是,我能够将Postman的POST请求发送到完全相同的URL,并由控制器处理。
该URL就是:https:// www。[my-domain] .com:[port-number] / cloudprint
另外,我尝试将控制器方法复制到另一个在Apache后面的Tomcat实例上运行的Spring(不是Boot)应用程序中,并且打印机的POST请求由控制器方法处理。我可以在Apache日志和Tomcat日志中看到它们。当前的轮询频率为10秒。
控制器的外观如下:
package com.[my-domain].[application-name].controller;
[a bunch of imports]
@RestController
@CrossOrigin
public class PrintController {
Logger logger = LoggerFactory.getLogger(PrintController.class);
@RequestMapping(value="/cloudprint", method=RequestMethod.POST,
headers={"Accept=application/json"})
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody String printPost() {
logger.debug("in printPost");
return "OK";
}
@RequestMapping(value="/cloudprint", method=RequestMethod.GET,
headers={"Accept=application/json"})
@ResponseStatus(HttpStatus.OK)
public @ResponseBody String printGet(HttpServletRequest request) {
logger.debug("in printGet");
return "OK";
}
@RequestMapping(value="/cloudprint", method=RequestMethod.DELETE,
headers={"Accept=application/json"})
@ResponseStatus(HttpStatus.OK)
public @ResponseBody String printDelete() {
logger.debug("in printDelete");
return "OK";
}
}
Run Code Online (Sandbox Code Playgroud)
是什么原因造成的?我可以测试什么来解决此问题?
---添加的信息低于2019-06-03 @ 13:21 cet ---由于我有一个常规的Spring(non-boot)应用程序,可以接受来自打印机的POST请求,因此我可以将信息记录在接收到的信息中请求。所以我做到了。
这是来自打印机的POST请求之一,Spring boot …
我想了解如果我设置了分布式事务功能是否适用于我的应用程序 com.atomikos.icatch.enable_logging=false
com.atomikos.icatch.enable_logging=falsecom.atomikos.icatch.enable_logging=false如果并非所有分布式事务的参与者都已提交,则可能导致数据库的状态不一致?更新 我在这个问题之后被触发,以便更多地了解我在这里描述的分布式事务的内部结构: 如何调整分布式(XA)事务的性能?