我在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;
}
我的问题是:
GenerateKey
的新实例或所有请求将重用相同的实例?JdbcTemplate
时,所有这些实例是否会共享同一个JdbcTemplate实例,或者每个实例都有自己唯一的JdbcTemplate
?由于JdbcTemplate
未定义范围,因此默认值为单一意味着只会创建JdbcTemplate
的一个实例。JdbcTemplate
意味着所有请求都将使用相同的数据库连接?这意味着任何时候都只能运行一个查询。 答案 0 :(得分:3)
对问题1的回答:Spring控制器是单例。这意味着只会创建一个GenerateKey
类的实例,它是一个REST控制器(所有请求都将使用该实例)。
回答问题2:您可以安全地重复使用JdbcTemplate
。以下是JdbcTemplate
的JavaDoc的摘录:
可以通过直接实例化在服务实现中使用 使用DataSource引用,或在应用程序上下文中做好准备 并将服务作为bean引用。注意:DataSource应该 始终在应用程序上下文中配置为bean 第一种情况直接给予服务,在第二种情况下给予 准备好的模板。
突出显示的文字描述了您的用例,这完全有效。
JavaDoc还提到了这一点:
注意:配置后,此类的实例是线程安全的。
支持之前的声明。配置实例后(Spring创建实例并注入数据源引用),您可以安全地在多个位置同时使用它。
对问题3的回答:通常,您的数据源将具有一些连接池功能。这意味着如果一次调用多个查询,它们将从连接池中借用未使用的连接。