我有一个 DAO 类,它使用 Spring JDBC 访问 SQLite 数据库。我已经在 DAO 方法本身上声明了事务,因为我的服务层从不将查询合并到事务中。
由于我并行使用几个工作线程,但只有一个线程可以同时更新 SQLite DB,因此我使用 synchronized
来序列化对 DAO 的访问。
首先,我从服务类进行外部同步,例如:
synchronized (dao) {
dao.update(...);
}
然后,我想我不妨摆脱外部同步并将 synchronized
放在 DAO 方法本身上:
public synchronized void update(...) {
// Spring JDBC calls here
}
奇怪的是:我的查询现在花费的时间是以前的两倍!
为什么?
最佳答案
嗯,有一个区别是显而易见的:
synchronized (dao) {
// here you are synchronizing on the transactional proxy
}
public synchronized void update(...) {
// and here you are synchronizing on the target class, *inside* the proxy
}
其含义取决于您的其他代码,但这是明显的区别。
关于java - Spring事务及其与synchronized关键字的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9391701/