Java 如何在SpringJdbc中使BeanPropertyRowMapper线程安全?

Java 如何在SpringJdbc中使BeanPropertyRowMapper线程安全?,java,multithreading,spring,thread-safety,spring-jdbc,Java,Multithreading,Spring,Thread Safety,Spring Jdbc,我在应用程序中使用SpringJDBCTemplate,在查询中使用映射为新BeanPropertyRowMapper(dto.class)的行 但我从我的客户那里得到了意见,以使行映射线程安全。如何做到这一点 查询方法如下所示: jdbcTemplate.query(qry, new Object[]("abc"), new BeanPropertyRowMapper<dto>(dto.class)) jdbcTemplate.query(qry,新对象[](“abc”

我在应用程序中使用SpringJDBCTemplate,在查询中使用映射为新BeanPropertyRowMapper(dto.class)的行 但我从我的客户那里得到了意见,以使行映射线程安全。如何做到这一点

查询方法如下所示:

jdbcTemplate.query(qry, new Object[]("abc"), 
    new BeanPropertyRowMapper<dto>(dto.class))
jdbcTemplate.query(qry,新对象[](“abc”),
新BeanPropertyRowMapper(dto.class))

给定从DAO实例方法调用的代码:

jdbcTemplate.query(qry, new Object[]("abc"), new BeanPropertyRowMapper<dto>(dto.class))
jdbcTemplate.query(qry,新对象[](“abc”),新BeanPropertyRowMapper(dto.class))
(其中jdbcTemplate是Spring注入的DAO的实例成员,DAO是具有单例作用域的Spring管理bean),那么这似乎是可以的。BeanPropertyRowMapper是有状态的,如果由多个线程同时使用,则不会是线程安全的,但您并没有将其暴露于多个线程,而是以线程受限的方式使用它,这是安全的

Java并发实践,第3.3节,一般讨论线程限制:

访问共享的、可变的数据需要使用同步;避免这一要求的一种方法是不共享。如果只从单个线程访问数据,则不需要同步。线程限制技术是实现线程安全的最简单方法之一。当一个对象被限制在一个线程中时,即使该限制对象本身不是线程安全的,这种使用也自动是线程安全的[CPJ 2.3.2]

它还讨论了(在3.3.2中)您正在执行的特定类型的线程限制:

堆栈限制是线程限制的一种特殊情况,其中对象只能通过局部变量访问。正如封装可以更容易地保留不变量一样,局部变量也可以更容易地将对象限制在线程中。局部变量本质上局限于执行线程;它们存在于执行线程的堆栈上,其他线程无法访问该堆栈。堆栈限制(也称为线程内或线程本地使用,但不要与ThreadLocal库类混淆)比特殊线程限制更易于维护且不易损坏


对RowMapper的唯一引用位于为该方法调用创建的stackframe上。没有其他线程(包括在同一DAO上调用相同方法的线程)可以访问它。告诉你的客户这个对象已经是安全的,因为它只能通过局部变量访问,并让他参考引用的JCIP手册中的一段,这是一个权威参考。

你的代码已经是线程安全的。但您可以通过创建一个常量来提高其性能。
BeanPropertyRowMapper
类具有可变数据。但是一旦初始化,这些数据就不会更改,因此类是线程安全的

例如:

private static final BeanPropertyRowMapper<dto> DTO_ROW_MAPPER = new dto<dto>(DtoDetailEvenement.class);
...
jdbcTemplate.query(qry, new Object[]("abc"), DTO_ROW_MAPPER)
private static final beanpropertyrowapper DTO\u ROW\u MAPPER=new DTO(DtoDetailEvenement.class);
...
jdbcTemplate.query(qry,新对象[](“abc”),DTO_ROW_MAPPER)

准确显示您是如何使用它的。如果要在查询方法中创建行映射器的新实例,那么就不可能存在threadsafety问题.JdbcTemplate.query(qry,new Object[](“abc”),new BeanPropertyRowMapper(dto.class))。请解释一下它的jdbcTemplate很抱歉出错了,它被注入了我的代码属于哪一类,是否需要进行任何更改以使其线程安全?@Vivek:你不必做任何事情,它已经安全了。我怀疑你的客户很困惑。