JDBC知识点笔记

  • 双亲委派模型,加载DriverManger时需要扫描所有Driver实现类,会找不到Driver实现类,
    此时基于SPI原理会从线程上下中拿到AppClassloader,
    然后从appclassloader中获取driver实现类,封装成driverInfo,加入registry到DriverManager.这些实现需要SPI接口和service声明文件的支持。

  • 如果不希望破坏双亲委派模型,则需要用class.forname先主动加载驱动类,然后加载drivermanager,再将driver注册到drivermanager中。

  • 获取链接既不能所有请求处理线程共享,又不能每次执行SQL都创建connector浪费资源。因此,采用统一线程共享一个connector的方案,用map作缓存,用线程ID作key,自然就想到用threadlocal了。

  • connector在同一个线程的缓存功能时JDBC底层实现的,他通过对getConnector()方法进行判断,如果threadlocal有就不会再重新创建链接了。对于JDBC的用户来说时感知不到这个操作的。这里的用户可以是开发者也可以是mybatis框架,比如sqlsession…openConnector就是调用了JDBC的getConnector().

  • 当然sqlsession.openConnector有时候也会去调用连接池,从而获取链接,而不是直接访问JDBC,这相当于给JDBC作了一层代理缓存,进一步减少了链接创建的开销。

  • 对于同一个线程来说,仍然获得的是同一个链接

  • 由于threadlocal在底层JDBC作了声明,所以无论在哪里,线程都能获得这个链接,
    因此大多数连接池调用getConnector时都会优先去threadlocal中获取,当取不到的时候,才会考虑从连接池去获取,这是一个很容易忽略的细节。
    这个细节的好处,就是减少连接池的压力,而且又遵循了jdbc优良的缓存习惯。

你可能感兴趣的:(java,数据库)