`
xiaoxiao1992428
  • 浏览: 13304 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Nutz--->>反复新建ioc容器的后果

    博客分类:
  • nutz
阅读更多
问题:
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需要的jar包

    `nutz-mvc`包括了`nutz-web`和`nutz-wk`,前者处理Web相关的功能,后者是Nutz的Web容器,提供了Servlet的替代方案,使得开发者可以脱离传统的Servlet容器运行Nutz应用。 在进行Web开发时,我们还需要`nutz-plugin-...

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz-1.b.43-jdk5.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.r.62.jar

    nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等

    nutz-1.b.52.zip

    如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计 如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计 如果你觉得 JSON 转换很麻烦(要写超过一行...

    nutz-1.r.58

    在实际开发中,通过引入`nutz-1.r.58.jar`,开发者可以利用Nutz提供的各种工具类和组件,例如`NutzIoc`用于实现IoC容器,`NutzDao`提供便捷的数据库操作,`NutzHttp`则简化了HTTP请求处理。同时,结合源码和文档,...

    nutz-1.b.43-jdk6.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.r.61-发布包

    "nutz-1.r.61-发布包"是Nutz框架的一个版本更新,具体为1.r.61版本。这个发布包包含了该版本的文档、源代码、编译后的类库以及相关的辅助文件,便于开发者下载、学习和使用。 1. **Nutz框架概述** Nutz 是一个轻量...

    nutz-1.b.48-manual.pdf 文档

    Nutz的设计目的之一是解决Java在Web开发领域相对于脚本语言而言显得开发效率较低的问题,通过提供一整套简洁、高效的组件和工具,如Dao、Ioc、Mvc、Json、Castors、Lang、Aop、Plugin和Resource,它们独立使用且功能...

    nutz-1.r.62.zip

    Nutz-1.r.62是该框架的一个版本,它包含了一系列优化和改进,使得开发者在构建应用程序时能更加得心应手。 在Nutz-1.r.62.zip压缩包中,主要有以下几个文件: 1. `nutz-1.r.62.jar`:这是Nutz框架的核心库文件,...

    wendal-nutz-master.zip

    这个压缩包“wendal-nutz-master.zip”包含了NUTZ框架的一个示例项目或者学习资源,帮助初学者理解和掌握NUTZ的核心特性。 在深入探讨NUTZ之前,我们先来理解一下什么是框架。框架是一种预定义的软件结构,它规定了...

    nutz-jar包,20170512

    Nutz-jar包是Nutz框架的打包形式,通常包含了框架的核心类库以及相关的依赖,方便开发者在项目中快速引入和使用。 在20170512版本的Nutz-jar包中,我们可以预见到以下几个关键知识点: 1. **Nutz IoC容器**:Nutz ...

    nutz-1.r.61.r2.jar包

    标题中的"nutz-1.r.61.r2.jar"是一个特定版本的Nutz框架的Java库文件。Nutz是一个开源的Java框架,它旨在简化Web开发,提供一系列实用工具和强大的支持,使得开发者能够更高效地进行业务逻辑处理。这个版本号"1.r.61...

    nutz-嵌入式开发资源

    Nutz -- Web(Mvc/Ioc/Aop/Dao/Json) for ALL Java developer

    nutz-1.r.57的JDK1.5编译

    在本案例中,我们关注的是"Nutz-1.r.57的JDK1.5编译",这表明我们需要了解如何在较低的JDK版本环境下,编译和使用Nutz框架。 首先,我们要知道Nutz官方推荐使用JDK1.6进行编译,这是因为JDK1.6引入了许多对开发者...

    nutz-1.b.49-manual.pdf

    标题:"nutz-1.b.49-manual.pdf" 指出了文档是关于Nutz框架的官方手册,版本为1.b.49。手册这一名称通常意味着该文档是为用户提供详细的指导,帮助用户理解和使用该框架。 描述:"nutz 框架nutz-1.b.49-manual.pdf...

    nutz-1.b.49.r2.zip

    Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。

    nutz-web:码头发射器

    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-1.r.65.zip

    nutzboot1.65版jar包...............................................................................................希望对你有用

    nutz-1.a.25_jdoc.zip

    "nutz-1.a.25_jdoc.zip" 是Nutz框架1.a.25版本的Java文档压缩包,其中包含了详细的API参考和使用指南,帮助开发者理解和使用这个框架。 首先,让我们深入了解Nutz的各个组件: 1. **Nutz MVC**:Nutz 提供了一个轻...

Global site tag (gtag.js) - Google Analytics