gpt4 book ai didi

java - JDBC 复制驱动程序总是在没有 Activity 缓存的情况下返回相同的数据

转载 作者:行者123 更新时间:2023-11-30 23:20:54 24 4
gpt4 key购买 nike

我正在使用 MySQL JDBC 复制驱动程序 com.mysql.jdbc.ReplicationDriver 在主从之间转移负载。

我正在使用那个连接 URL

jdbc.de.url=jdbc:mysql:replication://master:3306,slave1:3306,slave2:3306/myDatabase?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&roundRobinLoadBalance=true

一旦我启动我的应用程序,我就只能从它启动的地方获取数据,就像我正在处理数据库的锁定快照一样。如果我正在执行任何 CRUD 操作,则数据不可调用或更新不会显示。 mysql 的复制工作正常,我可以从数据库中查询正确的数据。

没有 level2 缓存处于 Activity 状态,我正在使用带池连接的 hibernate

如果我使用普通的 JDBC 驱动程序 com.mysql.jdbc.Driver 一切正常。那么,无论我在数据库中做了什么更改,为什么我总是得到相同的结果集...

更新1

好像跟我的方面有关

@Aspect
public class ReadOnlyConnectionInterceptor implements Ordered {

private class ReadOnly implements ReturningWork<Object> {

ProceedingJoinPoint pjp;

public ReadOnly(ProceedingJoinPoint pjp) {
this.pjp = pjp;
}

@Override
public Object execute(Connection connection) throws SQLException {

boolean autoCommit = connection.getAutoCommit();
boolean readOnly = connection.isReadOnly();

try {
connection.setAutoCommit(false);
connection.setReadOnly(true);
return pjp.proceed();
} catch (Throwable e) {
//if an exception was raised, return it
return e;
} finally {
// restore state
connection.setReadOnly(readOnly);
connection.setAutoCommit(autoCommit);
}

}

}

private int order;

private EntityManager entityManager;

public void setOrder(int order) {
this.order = order;
}

@Override
public int getOrder() {
return order;
}

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}

@Around("@annotation(readOnlyConnection)")
public Object proceed(ProceedingJoinPoint pjp,
ReadOnlyConnection readOnlyConnection) throws Throwable {
Session hibernateSession = entityManager.unwrap(Session.class);
Object result = hibernateSession.doReturningWork(new ReadOnly(pjp));
if (result == null) {
return result;
}
//If the returned object extends Throwable, throw it
if (Throwable.class.isAssignableFrom(result.getClass())) {
throw (Throwable) result;
}
return result;
}
}

我用 @ReadOnlyConnection 注释我所有的只读请求。在我对所有服务层方法进行注释之前,即使它们可能会相互调用。现在我只注释请求方法,我进入状态,我在 second 调用中获取数据库更新。

1) 进行初始调用 => 按预期获取数据

2) 改变数据库中的数据

3) 再次调用 => 从第一次调用中获取完全相同的数据

4) 再次调用 => 获取更改后的数据

最佳答案

connection.setAutoCommit(false) 的问题在于它似乎在设置回 connection.setAutoCommit(true) 后不执行提交。因此,在将以下行添加到方面后,一切又按预期进行了

try {
connection.setAutoCommit(false);
connection.setReadOnly(true);
return pjp.proceed();
} catch (Throwable e) {
return e;
} finally {
// restore state
connection.commit(); // THIS LINE
connection.setReadOnly(readOnly);
connection.setAutoCommit(autoCommit);
}

关于java - JDBC 复制驱动程序总是在没有 Activity 缓存的情况下返回相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15483506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com