问题描述
引用
解决方案
恩,以前依照源代码为准,我前面是臆想
解决方案二:
JdbcTemplate用了ThreadLocal,使各线程能够保持各自独立的一个对象,其实就是一个变量副本,实现了线程安全。
解决方案三:
JdbcTemplate类的实例是线程安全的实例。这一点非常重要,正因为如此,你可以配置一个简单的JdbcTemplate实例,并将这个“共享的”、“安全的”实例注入到不同的DAO类中去。 另外, JdbcTemplate 是有状态的,因为他所维护的DataSource 实例是有状态的,但是这种状态是无法变化的。 一旦JdbcTemplate被创建,他是一个线程安全的对象。 一个你需要创建多次JdbcTemplate实例的理由可能在于,你的应用需要访问多个不同的数据库,从而需要不同的DataSources来创建不同的JdbcTemplates实例。
解决方案四:
线程安全主要在org.springframework.transaction.support.TransactionSynchronizationManager中,使用ThreadLocal来保证线程安全TransactionSynchronizationManager类中声明了:private static final ThreadLocal resources =new NamedThreadLocal("Transactional resources");private static final ThreadLocal synchronizations =new NamedThreadLocal("Transaction synchronizations");private static final ThreadLocal currentTransactionName =new NamedThreadLocal("Current transaction name");private static final ThreadLocal currentTransactionReadOnly =new NamedThreadLocal("Current transaction read-only status");private static final ThreadLocal currentTransactionIsolationLevel =new NamedThreadLocal("Current transaction isolation level");private static final ThreadLocal actualTransactionActive =new NamedThreadLocal("Actual transaction active");看看源代码就会很清楚了
解决方案五:
JdbcTemplate其实是JDBC的封装,包括了捕获异常、SQL执行、结果转换等。因为是设计模式里面的模版模式,所以叫做xxxTemplatedatasource是更底层的调用,datasource是java.sql的直接实现类,这里你可以实现带链接池的connection或者其它,一般来说,我们的datasource只指向一个数据库,一个数据库只有一个datasource,这样就能方便的管理这个数据库的链接,链接池的个数等等你可以想像,每一个次的http请求,都是不同的线程,每一次http请求,都几乎会调用数据库,那么通过jdbctemplate调用数据库肯定需要线程安全(其实这个不难,无状态即可,无共享变量),因为datasource只有一个(因为他要管理所有的链接池,这个数据库都是它来负责管理的),每次,jdbcTemplate从datasource里面获得connection,然后sql语句进去,获得结果返回,通过jdbcTemplate直接转化为你自己的结果,就好了,最后jdbctemplate关闭链接池(其实是送回datasource)。