发表于: 2018-03-22 23:43:04

1 688


今日完成:

1.       <context:annotation-config/>

将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor 以及 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/>

相当于注册了DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter两个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被关闭,任何尝试访问它的任何方法(除了Closedclose方法)都将导致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关闭并不是物理关闭,只是归还连接池,所以StatementResultSet有可能被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行就有可能报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

优良传统:

(1)由于垃圾回收的线程级别是最低的,为了充分利用数据库资源,有必要显式关闭它们,尤其是使用Connection Pool的时候;

(2)最优经验是按照ResultSetStatementConnection的顺序执行close

(3)为了避免由于java代码有问题导致内存泄露,需要在rs.close()stmt.close()后面一定要加上rs = nullstmt = null

(4)如果一定要传递ResultSet,应该使用RowSetRowSet可以不依赖于ConnectionStatementJava传递的是引用,所以如果传递ResultSet,你会不知道StatementConnection何时关闭,不知道ResultSet何时有效。

5.       查看源码快捷键

ctrl+左键  ctrl+alt+左键

明日计划:

1.       上午:配置任务6数据库,mybatisspringspringmvc等基础框架

2.       下午:短信

3.       晚上:短信验证优化

4.       有时间弄邮箱

遇到的问题:

1.       jdbc中三个close如何理解

                                             

connection关闭,会导致自动关闭preparestatdment自动关闭吗

收获:

1.       今天将前六个任务使用过的几个重要工具和框架进行复习,jdbcmybatistilesspringspringmvcmemcachedredis进行重点复习,填了之前不懂的几个坑,对整个项目有了比较清晰的理解,有助于从整个项目的角度思考

2.       JDBC链接close的问题有个结果:resultsetstatememtconnection依次关闭最为保险,使用连接池的话需要关闭resultsetstatement



返回列表 返回列表
评论

    分享到