问题:
public class DaoZ {
public static Dao dao() { // 每当需要使用dao的时候就取一次
Ioc ioc = new NutIoc(new JsonLoader("dao.js"));
return ioc.get(Dao.class);
}
}
----------------------------------------------------------------------------
Wedal解析:
注意, java.sql.DataSource只是个接口.但下面讨论的DataSource均指代数据库连接池实现.
根本原因在于: Nutz的Ioc容器不是全局的,一旦没有被引用,就随时被GC.
题目中的NutIoc实例,在方法返回之后,处于无引用的状态, 即满足了GC的条件,随时会被GC.
题目中默认为2个基本ioc对象, DataSource和Dao, 其中Dao默认指代NutDao
NutIoc被gc时,会触发depose事件, 从而调用各ioc对象的depose/close方法
一般来说DataSource都会配置成depose事件触发close方法,即关闭连接池. 这样就导致DataSource对象处于关闭状态, 而NutDao的数据库连接均由DataSource提供, 直接导致NutDao实例在操作任意数据库方法时报错.
注意, GC的时机是几乎不可控,不可预测的, 这就意味着上述的ioc容器被gc, depose方法被调用,DataSource被关闭的时机也是不可控及不可预测的. 这会导致程序有时候是好的(GC在Dao方法执行完成之后),有时候会挂的(GC在Dao执行完成之前)
错误的解决思路:
1. 去掉depose事件. 首先是连接池都有初始大小和最小活跃数,这意味着DataSource被gc前总持有那么几个数据库连接. 并发上去了,gc来不及, 很快就数据库连接耗尽.
2. 那,去掉depose事件,连接池初始化大小和最小活跃数都设置为0呢. 初始化大小为0, 但你总会使用一次NutDao的方法吧, 那么就建立了一个连接, 然后最小活跃数是0, 将连接数从1降为0那么, 总有那么一个时间差,然后, 呵呵, 一个坑就摆在那了, 哪天碰巧没能快速关闭,也没被gc, 爆数据库连接数
3. 好吧,那我不用连接池,可以了吧? 可以,性能掉渣
解决方法:
1 在Mvc中, 你几乎100%会用到@IocBy, 也就是NutMvc来持有ioc, 那么你就不别自行new NutIoc了. 在Setup接口中,你可以通过config.getIoc()来获取Ioc容器(常见于启动时的初始化,加载全局变量,计划任务什么的), 在任何不可能直接得到Ioc容器的地方, 通过 Mvcs.ctx().getDefaultIoc() 获取 .注意, Mvcs.ctx()总是非常规方法.
2 非Mvc环境, 应使用一个工具类管理, 而且必须持有Ioc容器
3
public class DaoZ { // 供参考
private static Ioc ioc; // 静态属性,确保了Ioc容器不会被gc
public static synchronized Ioc ioc() { // 同步,用你喜欢的方法就好啦
if (ioc == null) {
try {
ioc = new NutIoc(new ComboIocLoader("*js","ioc/", "*annotation", "net.wendal.iot"));
}
catch (ClassNotFoundException e) {
throw Lang.warp(e);
}
}
return ioc;
}
public static Dao dao() {
return ioc.get(Dao.class);
}
}
分享到:
相关推荐
nutz-1.r.60.jar
nutz-1.b.43-jdk5.jar 资源包
java 框架 nutz-1.b.48-manual.pdf
nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等
如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计 如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计 如果你觉得 JSON 转换很麻烦(要写超过一行...
nutz-1.b.43-jdk5.jar 资源包
nutz-1.r.61-发布包
Nutz -- 不只是Web框架(Mvc/Ioc/Aop/Dao/Json) for ALL Java developer
nutz-1.a.25_jdoc.zip nutz-1.a.25_jdoc.zipnutz-1.a.25_jdoc.zip
Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。
nutz-1.r.62.zip 强大的Java框架,里面有许多好玩的方便的约定配置,有兴趣的可以下载再看看
nutz-webA Jetty launcher + Nutz.Mvc Ajax View添加依赖(maven)<dependency><groupId>org.nutz</groupId><artifactId>nutz-web</artifactId><version>1.r.62</version></dependency>新建一个配置文件web....
nutz 框架nutz-1.b.49-manual.pdf,配置简单易懂
nutzboot1.65版jar包...............................................................................................希望对你有用
nutz-jar包,20170512
nutz-1.r.61.r2-发布包_修正JDK6兼容性
Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...
nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册
•活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 •整 -- 它所有功能均不依赖第三方 jar 文件。 这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 ...
nutz-master的JAVA源码 Nutz核心代码 http://nutzam.com