ResultSet executeQuery(String sql) throws SQLException;
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
org.springframework.transaction.interceptor.TransactionInterceptor
@Nullable
public Object invoke(MethodInvocation invocation) throws Throwable {
Class<?> targetClass = invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null;
Method var10001 = invocation.getMethod();
invocation.getClass();
return this.invokeWithinTransaction(var10001, targetClass, invocation::proceed);
}
org.springframework.transaction.TransactionDefinition
其实这里看不出来跟servlet的关联性有多么高,如果实在要说其中的关联性,
还不如将jdbc的整合过程与Mybatis进行比较,或者分析jdbc代码分析封装硬编码的过程,
就连其包下的大部分类名都不与之相关,当然你要说再Servlet与jdbc集成开发的时代,他也是有一定时代和代表性的。
@CallerSensitive
public static Connection getConnection(String url,
java.util.Properties info) throws SQLException {
return (getConnection(url, info, Reflection.getCallerClass()));
}
CallerSensitive是什么鬼?
CallerSensitive老规矩,猜测下Caller=调用,Sensitive=敏感的,那么标识在方法上则是当调用方法时的一些控制。
其中特指Reflection.getCallerClass()能够追踪到调用者的第一人。项目中用是用不到。
学习方法就是学习大佬的学习方法
这里JDBC就先到此为止,我先不得不先记录下我在javacache中遇到的小问题思考。
为什么有ConcurrentHashMap还要加入synchronized
在org.springframework.cache.support.AbstractCacheManager中有一段关于初始化缓存静态配置的代码。
/**
* Initialize the static configuration of caches.
* <p>Triggered on startup through {@link #afterPropertiesSet()};
* can also be called to re-initialize at runtime.
* @since 4.2.2
* @see #loadCaches()
*/
public void initializeCaches() {
Collection<? extends Cache> caches = loadCaches();
synchronized (this.cacheMap) {
this.cacheNames = Collections.emptySet();
this.cacheMap.clear();
Set<String> cacheNames = new LinkedHashSet<>(caches.size());
for (Cache cache : caches) {
String name = cache.getName();
this.cacheMap.put(name, decorateCache(cache));
cacheNames.add(name);
}
this.cacheNames = Collections.unmodifiableSet(cacheNames);
}
}
Triggered:触发
原因:本身put和add的线程安全是由ConcurrentHashMap保证的,但是此时获取的值ConcurrentHashMap并不能保证其他线程对共享变量的值操作时还是原来的值。
怎么说呢,这么看来可能失去了map的本来特性,但其实还是不理解,是不理解这个原因准不准确。
谁提出谁解决:concurrentHashMap只能保证一次操作的原子性,一系列操作的时候就需要加锁了,不能保证第N+1个线程进来的时候获取到的状态是未clear的
Collections.emptySet():如果你想 new 一个空的 List ,而这个 List 以后也不会再添加元素,那么就用 Collections.emptyList() 好了。
new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小,多少会占用一内存。
每次使用都new 一个空的list集合,浪费就积少成多,浪费就严重啦,就不好啦。
还有一个
@Override
@Nullable
public Cache getCache(String name) {
Cache cache = this.cacheMap.get(name);
if (cache != null) {
return cache;
}
else {
// Fully synchronize now for missing cache creation...
synchronized (this.cacheMap) {
cache = this.cacheMap.get(name);
if (cache == null) {
cache = getMissingCache(name);
if (cache != null) {
cache = decorateCache(cache);
this.cacheMap.put(name, cache);
updateCacheNames(name);
}
}
return cache;
}
}
}
其中的getMissingCache方法
@Nullable
protected Cache getMissingCache(String name) {
return null;
}
无论如何都要返回null,那么他还要进行判空意义又何在?
源码注释是这样写的
Return a missing cache with the specified name, or null if such a cache does not exist or could not be created on demand.
Caches may be lazily created at runtime if the native provider supports it. If a lookup by name does not yield any result, an AbstractCacheManager subclass gets a chance to register such a cache at runtime. The returned cache will be automatically added to this cache manager.
返回指定名称的缺失缓存,如果此类缓存不存在或无法按需创建,则返回null。
如果本机提供程序支持,可以在运行时延迟创建缓存,就是其扩展实际是在子类中来复写的,
注意:在spring-data-redis的1.7.2中是没有复写此方法的
在官网中查询https://spring.io/projects/spring-data-redis#support
接入了
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
低版本可是没有的呢,具体变化是在2.X前后的区别
protected RedisCache getMissingCache(String name) {
return allowInFlightCacheCreation ? createRedisCache(name, defaultCacheConfig) : null;
}
第二次见到identityHashMap
public static void main(String[] args) {
var var1 = new Integer(1);
var var2 = new Integer(1);
System.out.println(var1.equals(var2));
System.out.println(var1.hashCode());
System.out.println(var2.hashCode());
System.out.println(System.identityHashCode(var1));
System.out.println(System.identityHashCode(var2));
}
控制台输出
true
1
1
1524960486
117009527
org.springframework.cache.Cache对于缓存是应用接口,
Hashmap是否是在并发写的情况下,如果是则不是线程安全的
Consistency(一致性)
getinclude
想要看到源文档时,搜索:JSR107规范即可
推荐文章:https://www.jianshu.com/p/f6a1eae