在阅读了更多的博客/文章等之后,我现在对内存屏障之前/之后的加载/存储行为感到困惑.
以下是Doug Lea在他关于JMM的一篇澄清文章中的两个引用,它们都非常简单:
对我来说,Doug Lea的澄清比另一个更严格:基本上,这意味着如果负载屏障和存储屏障位于不同的监视器上,则无法保证数据的一致性.但后者意味着即使屏障位于不同的监视器上,数据的一致性也会得到保证.我不确定我是否正确理解这两个,而且我不确定它们中的哪一个是正确的.
考虑以下代码:
public class MemoryBarrier {
volatile int i = 1, j = 2;
int x;
public void write() {
x = 14; //W01
i = 3; //W02
}
public void read1() {
if (i == 3) { //R11
if (x == 14) //R12
System.out.println("Foo");
else
System.out.println("Bar");
}
}
public void read2() {
if (j == 2) { //R21
if (x == 14) //R22
System.out.println("Foo");
else
System.out.println("Bar"); …
Run Code Online (Sandbox Code Playgroud) 我在理解RabbitMQ的确认方面遇到了一些麻烦,我从RabbitMQ看到以下解释:
笔记
如果代理在将所述消息写入磁盘之前崩溃,则代理会丢失持久消息.在某些情况下,这会导致经纪人以令人惊讶的方式行事.例如,考虑这种情况:
客户端将持久性消息发布到持久队列
客户端使用队列中的消息(注意消息是持久的,队列是持久的),但还没有消息,
经纪人去世并重新启动,并且
客户端重新连接并开始使用消息.
此时,客户端可以合理地假设该消息将再次传递.情况并非如此:重启导致代理丢失消息.为了保证持久性,客户应该使用确认.如果发布者的频道处于确认模式,则发布者不会收到丢失消息的确认消息(因为消费者没有得到它并且没有写入磁盘).
然后我使用这个http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java做一些基本测试并验证确认,但得到一些奇怪的结果:
由于我是RabbitMQ的新手,任何人都可以告诉我,我对确认理解的问题在哪里?
我们不时在我们的生产环境中开始有这个"网络适配器无法建立连接"的问题,我做了很多谷歌并在这里经历了一些问题,但仍然没有得到解决方案.
以下是有关我们环境的一些信息:
我们运行以下测试来检查网络或oracle TNS监听器是否有任何问题:
最奇怪的是,这个错误在一台应用服务器上每小时发生10次左右,但在另一台应用服务器上每天只发生1到2次.
任何人都可以对这个错误有所了解吗?
谢谢
[编辑方面4]:我们在找到一个oracle实例时发现超时问题,所以我们更改了jdbc url只连接一个实例,发现IOException再也没发生过,所以我们认为问题与数据库有关,DBA团队将继续研究这个.
[编辑方面3]:我们做了以下尝试:
他们都没有成功,有人请帮助〜
[编辑]:错误堆栈跟踪:
java.sql.SQLException: Io Exception: The Network Adapter could not establish the connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387) …
Run Code Online (Sandbox Code Playgroud)