`
liyixing1
  • 浏览: 952865 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

范围和声明周期(对象声明周期)

阅读更多
先看mybatis用户手册中的一段代码

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new
JdbcTransactionFactory();
Environment environment =
new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);

SqlSessionFactoryBuilder
这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好的方式是不需要保持它一直存在来保证所有XML解析资源,因为还有更重要的事情要做。

在上面的代码中
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
可以看出,我们只是new SqlSessionFactoryBuilder()并构造了SqlSessionFactory后,并没有保存它,它随时都可能被gc回收了。


SqlSessionFactory
一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如Google Guice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。


SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。


Mapper实例
映射器是你创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和SqlSession是相同的。然而,映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭,那么在请求对象中保留它们也就不是什么问题了,这和SqlSession相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。
分享到:
评论

相关推荐

    fragment声明周期详解Demo

    "fragment声明周期详解Demo"应该包含了这些关键点的代码示例,帮助开发者更好地理解和应用Fragment的生命周期。 为了调试和优化,可以使用Log.d()在每个生命周期方法中打印日志,观察其调用顺序。此外,Android ...

    Java中对象的生命周期 ..doc

    理解对象的生命周期对于有效地管理和优化Java应用程序至关重要。 #### 二、对象的创建 1. **对象生命周期的开始**: - 当对象被创建时,其生命周期开始。首先需要为对象分配内存空间,在Java堆内存中进行。 - ...

    C#第八章(对象的生命周期)

    总之,C#中的对象生命周期管理通过CLR和垃圾回收器提供了一套自动化的内存管理机制。通过学习本章内容,开发者将能够理解并掌握如何在C#中创建和管理对象,以及如何通过各种方式正确地处理资源释放问题,以编写出...

    Kotlin中的对象表达式和对象声明的具体使用

    3. **生命周期**:对象声明的生命周期与应用的生命周期相同,它们在应用启动时被创建,应用结束时销毁。 对象声明通常用作工具类或者应用的配置类,例如: ```kotlin object AppConfig { val version = "1.0.0" ...

    C#中动态声明与使用对象数组实例

    在C#中,垃圾回收(Garbage Collection, GC)机制负责自动管理对象的生命周期和内存释放。当一个对象不再被引用时,GC会自动回收其占用的空间。然而,为了优化性能,开发者可以使用`using`语句或显式调用`Dispose()`...

    声明式Kubernetes集群生命周期管理API介绍.pptx

    声明式Kubernetes集群生命周期管理API,也称为Cluster API,是Kubernetes社区的一个开源项目,旨在简化Kubernetes集群的创建、升级和运维过程。这个项目始于2018年,由Kubernetes Cluster Lifecycle Special ...

    ASP.NET页面生命周期描述

    了解 ASP.NET 页面生命周期对开发者来说非常重要,因为它可以帮助我们更好地理解和控制页面的行为。 Page_Init(): Page_Init() 是页面生命周期的第一个过程。这个过程主要是初始化控件,每次页面载入执行这个初始...

    用new创建对象和直接定义的区别

    2. **生命周期**:`new`创建的对象由程序员控制释放(如Java和C++需要手动`delete`,C#有垃圾回收机制)。栈对象由编译器自动管理,当离开其作用域时自动销毁。 3. **初始化**:`new`创建的对象通常通过构造函数...

    swift-无代码入侵获取AppDelegate声明周期

    在Swift开发中,"无代码入侵获取AppDelegate声明周期"是一个技术话题,主要涉及如何在不修改原有AppDelegate.swift文件代码的情况下,监测和利用AppDelegate对象的生命周期事件。这在某些情况下非常有用,比如当需要...

    c++ 基本知识--作用域和生命周期(曹阳).ppt

    了解并熟练掌握C++的作用域、生命周期和内存管理是编写高质量、健壮代码的基础。在实际编程中,合理使用命名空间可以有效地避免命名冲突,理解变量的生命周期有助于避免内存泄漏和意外的变量访问。而对内存分配的...

    声明式Kubernetes集群生命周期管理API介绍.pdf

    6. **Manifests**:资源描述清单是YAML文件,声明了Kubernetes API对象(包括内置对象和自定义对象)及其配置。用户可以通过`kubectl create`命令或直接调用API来创建这些资源实例。 **Cluster API的工作机制** ...

    Activity和Service生命周期及使用AIDL通信实例备份

    编写AIDL文件,你需要声明接口、数据类型和方法。编译后,AIDL会自动生成对应的Java类,这些类实现了客户端和服务端所需的接口。使用AIDL通信时,服务端需要实现接口并在onBind()中返回IBinder对象,而客户端则通过...

    Android-rxjava2retrofit2rxlifecycle2有生命周期感知的网络请求框架封装

    首先,RxJava2是一个基于Java和Kotlin的反应式编程库,它允许开发者以声明式的方式处理异步操作和事件流。通过使用Observables和Operators,开发者可以轻松地创建复杂的异步逻辑,同时处理错误和异常,确保资源的...

    ASP.Net页面生命周期

    在C#代码中,可以通过构造函数声明和初始化对象。同时,可以重写`OnInit`方法来插入自定义代码,确保对象按需创建。值得注意的是,如果控件在.aspx文件中声明,它们的属性不能在构造函数中设置,因为创建顺序不确定...

    Java中类的生命周期

    在这个周期内,JVM负责管理所有类和对象的生命周期。 **2. Java程序与JVM生命周期的一致性** 程序生命周期与Java虚拟机生命周期是一致的。这意味着Java虚拟机进程从创建起的任务就是执行Java程序,直至程序正常...

    Spring bean生命周期demo

    不同作用域的Bean,其生命周期和管理方式也不同。例如,单例Bean在整个应用中只有一个实例,而原型Bean每次请求都会创建新的实例。 6. **AOP代理** 如果Bean被声明为需要AOP代理(例如,带有切面注解),Spring会...

    JSP九大内置对象和四种属性范围解读

    在JSP中,有四种不同的属性范围,用于控制变量的生命周期和可见性: 1. **`page`**范围:仅在当前JSP页面内可见,生命周期从声明变量开始,到页面渲染结束。 2. **`request`**范围:在一次HTTP请求中可见,覆盖了...

    探究fragment生命周期

    Fragment是Android应用开发中的一个重要组件,它允许我们把UI的一部分逻辑独立出来,可以在Activity中进行管理,使得界面设计更加...正确地管理Fragment的状态和生命周期可以帮助我们构建更稳定、更高效的Android应用。

    Rust的生命周期练习和讲解

    在函数或结构体中声明生命周期参数,可以确保引用不会超出其预期的有效范围。 ##### 示例1:修复返回引用生命周期不匹配的问题 ```rust // 错误的实现 fn invalid_output() -> &'a String { &String::from("foo")...

Global site tag (gtag.js) - Google Analytics