2015-11-03 47 views
2

我在我的应用程序和我的查询中使用spring jdbctemplate我使用的行映射为新的BeanPropertyRowMapper(dto.class) 但是我从我的客户端获得了使得行映射线程安全的评论。如何做到这一点?如何在SpringJdbc中使BeanPropertyRowMapper线程安全?

查询方法是这样的:

jdbcTemplate.query(qry, new Object[]("abc"), 
    new BeanPropertyRowMapper<dto>(dto.class)) 
+0

显示你究竟是如何使用它。如果您正在查询方法中创建行映射器的新实例,那么线程安全问题应该不存在可能性。 –

+0

JdbcTemplate.query(qry,new Object [](“abc”),new BeanPropertyRowMapper (dto.class))。请给出解释 –

+0

这是jdbcTemplate对于错误感到抱歉并且被注入 –

回答

1

鉴于这种代码从一个DAO实例方法称为:

jdbcTemplate.query(qry, new Object[]("abc"), new BeanPropertyRowMapper<dto>(dto.class)) 

(其中的JdbcTemplate是由Spring注入的DAO的一个实例成员,和DAO是一个具有单例作用域的Spring管理bean),那么这看起来没问题。 BeanPropertyRowMapper是有状态的,如果多线程同时使用,将不会是线程安全的,但是您不会将它公开给多线程,而是以线程受限的方式使用它,这是安全的。

爪哇并发实践,第3.3节,从总体上讨论线程禁闭:

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

它还讨论(3.3.2)的特定类型的线程限制的,你正在做的:

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

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

+0

在哪些类别中,我的代码正在下降,并且是否需要进行任何更改以使其线程安全? –

+0

@Vivek:你不需要做任何事情,它已经很安全了。我怀疑你的客户感到困惑。 –

0

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

例:

private static final BeanPropertyRowMapper<dto> DTO_ROW_MAPPER = new dto<dto>(DtoDetailEvenement.class); 
... 
jdbcTemplate.query(qry, new Object[]("abc"), DTO_ROW_MAPPER)