在使用我的Spring应用程序调试和测试MySql读取复制时,我注意到获取ACL的查询正在击中我的主数据库而不是从数据库数据库。我正在使用jdbc:mysql:replication://
连接字符串。对于非ACL数据,这似乎与@Transactional(readOnly = true)
中包含的调用有关。
我使用与JPA配置相同的数据源通过BasicLookupStrategy设置我的LookupStrategy。
就好像LookupStrategy没有将连接标记为只读。
这是正常的吗?有没有办法改变这种行为?
答案 0 :(得分:0)
Spring Security 3.0提供了一个BasicLookupStrategy类,它在其构造函数中允许注入将用于命中数据库的DataSource。所以我的建议是使用该实现,并实现ACLCache以避免不必要的数据库访问。
答案 1 :(得分:0)
因此,在阅读BasicLookupStrategy的所有来源之后,我没有看到任何地方,或者可以完成。然后在它上面,BasicLookupStrategy将jdbcTemplate作为私有使其无法扩展。 ug ..所以最后只是把整个班级称为BasicReadOnlyLookupStrategy
并添加了以下方法setConnectionReadOnly
'在jdbcTemplate.query
和lookupPrimaryKeys
中调用lookupObjectIdentities
之前和之后调用它{1}}
private void setConnectionReadOnly(boolean readOnly) {
log.debug("setting JDBC connection to {}", readOnly);
try {
Connection con = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
con.setReadOnly(readOnly);
} catch (SQLException e) {
e.printStackTrace();
}
}