Spring中的JdbcTemplate bean:为每个请求重用相同的会话?

时间:2014-11-26 22:53:36

标签: spring

我在xml

中定义了以下bean
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
    <constructor-arg type="javax.sql.DataSource">
        <ref bean="dataSource"></ref>
    </constructor-arg>
</bean>

然后在弹簧mvc控制器中我们使用如下:

@RestController
public class GenerateKey {
    final private JdbcTemplate jdbcTemplate;
    final private AmqpTemplate rabbitMQTemplate;
    final private String queueName;
    @Autowired
    public GenerateKey(@Qualifier("jdbcTemplate") JdbcTemplate jdbcTemplate,@Qualifier("keyRequestTemplate") AmqpTemplate rabbitMQTemplate,@Value("${keyRequestQueueName}") String queueName){
        this.jdbcTemplate=jdbcTemplate;
        this.rabbitMQTemplate =rabbitMQTemplate;
        this.queueName =queueName;
    }

我的问题是:

  1. 对于每个请求来到此控制器,是否会创建GenerateKey的新实例或所有请求将重用相同的实例?
  2. 如果使用不同的实例,那么在连接JdbcTemplate时,所有这些实例是否会共享同一个JdbcTemplate实例,或者每个实例都有自己唯一的JdbcTemplate?由于JdbcTemplate未定义范围,因此默认值为单一意味着只会创建JdbcTemplate的一个实例。
  3. 如果#2有效,共享相同的JdbcTemplate意味着所有请求都将使用相同的数据库连接?这意味着任何时候都只能运行一个查询。

1 个答案:

答案 0 :(得分:3)

对问题1的回答:Spring控制器是单例。这意味着只会创建一个GenerateKey类的实例,它是一个REST控制器(所有请求都将使用该实例)。

回答问题2:您可以安全地重复使用JdbcTemplate。以下是JdbcTemplate的JavaDoc的摘录:

  

可以通过直接实例化在服务实现中使用   使用DataSource引用,或在应用程序上下文中做好准备   并将服务作为bean引用。注意:DataSource应该   始终在应用程序上下文中配置为bean   第一种情况直接给予服务,在第二种情况下给予   准备好的模板。

突出显示的文字描述了您的用例,这完全有效。

JavaDoc还提到了这一点:

  

注意:配置后,此类的实例是线程安全的。

支持之前的声明。配置实例后(Spring创建实例并注入数据源引用),您可以安全地在多个位置同时使用它。

对问题3的回答:通常,您的数据源将具有一些连接池功能。这意味着如果一次调用多个查询,它们将从连接池中借用未使用的连接。