java - Spring事务及其与synchronized关键字的交互

标签 java spring jdbc transactions spring-jdbc

我有一个 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/

相关文章:

java - 调用以 Graphics g 作为参数的方法

java - 为什么我的 spring 验证注释不起作用

Hibernate 5.0 方言自动检测不适用于 Tomcat 上的 JNDI

java - Get 方法返回 XML 和 JSON

java - 在桌面应用程序中延迟加载 JPA 实体

java - 在 Spring 中模拟用户

结合处理 acl_sid 表中的 GrantedAuthority 和 Principle 的 Spring ACL

java - 使用JDBC和MySQL解决“通信链接失败”问题

java - JDBC 不返回结果集

java - 部署取消部署时 Weblogic 内存泄漏