发表于: 2018-03-22 23:43:04
1 689
今日完成:
1. <context:annotation-config/>
将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
2. <context:component-scan/>
<context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan base-package="xxx.xxx.xxx"/> 后,就可以将 <context:annotation-config/> 移除了。
默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标,如:@Scope(“prototype”),这样,当从 Spring 容器中获取 boss Bean 时,每次返回的都是新的实例了。
3. <mvc:annotation-driven/>
相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置
4. jdbc三个close方法:
resultset.close()
preparedstatememt.close()
connection.close()
源码看得一知半解的,直接查了JDBC规范如下:
1. 应用程序调用Statement.close方法来指示它已完成处理。 当创建它们的connection关闭时,所有Statement对象都将被关闭。 但是,对于应用程序来说,尽快关闭语句,这是良好的编程实践。 这允许该语句正在使用的任何外部资源立即释放。
2. 关闭Statement对象将关闭并使该语句对象生成的ResultSet的任何实例无效。 直到垃圾收集再次运行时,ResultSet对象所拥有的资源才可能被释放,所以最好在不需要时关闭ResultSet对象。
3. 一旦一个Statement被关闭,任何尝试访问它的任何方法(除了Closed或close方法)都将导致SQLException被抛出。
JDK规范:
1. 当Statement对象关闭、新执行或用于从多个结果序列中检索下一个结果时,Statement对象会自动关闭ResultSet对象。 垃圾收集时,ResultSet对象也会自动关闭。
2. 收集垃圾时,Statement对象会自动关闭。 当Statement对象关闭时,其当前RsultSet对象(如果存在)也会关闭。
3. Connection对象在垃圾收集时会自动关闭。 某些致命错误会将Connection对象关闭。
总结:
1.垃圾回收机制可以自动关闭它们;
2.Statement关闭会导致ResultSet关闭;但是ResultSet不会立即释放,直到下次GC
3.Connection关闭不一定会导致Statement关闭。(连接池或者致命错误)????不确定
4. 使用的是数据库连接池,Connection关闭并不是物理关闭,只是归还连接池,所以Statement和ResultSet有可能被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行就有可能报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。
优良传统:
(1)由于垃圾回收的线程级别是最低的,为了充分利用数据库资源,有必要显式关闭它们,尤其是使用Connection Pool的时候;
(2)最优经验是按照ResultSet,Statement,Connection的顺序执行close;
(3)为了避免由于java代码有问题导致内存泄露,需要在rs.close()和stmt.close()后面一定要加上rs = null和stmt = null;
(4)如果一定要传递ResultSet,应该使用RowSet,RowSet可以不依赖于Connection和Statement。Java传递的是引用,所以如果传递ResultSet,你会不知道Statement和Connection何时关闭,不知道ResultSet何时有效。
5. 查看源码快捷键
ctrl+左键 ctrl+alt+左键
明日计划:
1. 上午:配置任务6数据库,mybatis,spring,springmvc等基础框架
2. 下午:短信
3. 晚上:短信验证优化
4. 有时间弄邮箱
遇到的问题:
1. jdbc中三个close如何理解
connection关闭,会导致自动关闭preparestatdment自动关闭吗
收获:
1. 今天将前六个任务使用过的几个重要工具和框架进行复习,jdbc,mybatis,tiles,spring,springmvc,memcached,redis进行重点复习,填了之前不懂的几个坑,对整个项目有了比较清晰的理解,有助于从整个项目的角度思考
2. JDBC链接close的问题有个结果:resultset,statememt,connection依次关闭最为保险,使用连接池的话需要关闭resultset和statement
评论