- 浏览: 958786 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
先看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相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。
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相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。
发表评论
-
深入了解MyBatis参数
2017-05-04 21:12 386深入了解MyBatis参数 http://blog.csdn ... -
MyBatis Generator 详解
2015-08-03 14:00 761http://blog.csdn.net/isea533/ar ... -
ibatis的动态sql
2014-10-23 13:33 938位于包 com.ibatis.sqlmap.engine.ma ... -
枚举 enum
2013-12-13 17:28 2592当使用枚举时,需要使用EnumTypeHandler或者Enu ... -
mybatis generator tools配置文件解析
2012-12-20 23:28 25410这是mybatis3 generator 配 ... -
问题解决方案
2011-08-22 00:25 24221.Mapped Statements collection ... -
mybatis的参数
2011-06-16 12:36 6428在类DynamicSqlSource 方法 public Bo ... -
与spring结合
2011-05-20 21:58 1236实体省略 maping文件省略 dao接口省略 mybatis ... -
动态sql
2011-05-05 17:54 1261ibatis支持动态的组合sql。 包括动态元素 if ... -
ibatis缓存
2011-05-05 16:38 4508ibatis的session缓存。做了一个测试 <?xm ... -
ibatis官方推荐目录结构
2011-05-05 13:24 1056src/com.liyixing.application.da ... -
sql映射文件
2011-04-30 22:09 2554<?xml version="1.0" ... -
配置文件
2011-04-30 20:17 1805mybatis的配置文件结构 顶级是configuration ... -
session的getMapper方法解析
2011-04-30 17:22 9640跟踪: DefaultSqlSession类 public & ... -
一个简单例子,以及基于接口,class对象调用
2011-04-30 16:59 1325应用结构: IbatisConfiguration.xm ...
相关推荐
"fragment声明周期详解Demo"应该包含了这些关键点的代码示例,帮助开发者更好地理解和应用Fragment的生命周期。 为了调试和优化,可以使用Log.d()在每个生命周期方法中打印日志,观察其调用顺序。此外,Android ...
理解对象的生命周期对于有效地管理和优化Java应用程序至关重要。 #### 二、对象的创建 1. **对象生命周期的开始**: - 当对象被创建时,其生命周期开始。首先需要为对象分配内存空间,在Java堆内存中进行。 - ...
总之,C#中的对象生命周期管理通过CLR和垃圾回收器提供了一套自动化的内存管理机制。通过学习本章内容,开发者将能够理解并掌握如何在C#中创建和管理对象,以及如何通过各种方式正确地处理资源释放问题,以编写出...
3. **生命周期**:对象声明的生命周期与应用的生命周期相同,它们在应用启动时被创建,应用结束时销毁。 对象声明通常用作工具类或者应用的配置类,例如: ```kotlin object AppConfig { val version = "1.0.0" ...
在C#中,垃圾回收(Garbage Collection, GC)机制负责自动管理对象的生命周期和内存释放。当一个对象不再被引用时,GC会自动回收其占用的空间。然而,为了优化性能,开发者可以使用`using`语句或显式调用`Dispose()`...
声明式Kubernetes集群生命周期管理API,也称为Cluster API,是Kubernetes社区的一个开源项目,旨在简化Kubernetes集群的创建、升级和运维过程。这个项目始于2018年,由Kubernetes Cluster Lifecycle Special ...
了解 ASP.NET 页面生命周期对开发者来说非常重要,因为它可以帮助我们更好地理解和控制页面的行为。 Page_Init(): Page_Init() 是页面生命周期的第一个过程。这个过程主要是初始化控件,每次页面载入执行这个初始...
2. **生命周期**:`new`创建的对象由程序员控制释放(如Java和C++需要手动`delete`,C#有垃圾回收机制)。栈对象由编译器自动管理,当离开其作用域时自动销毁。 3. **初始化**:`new`创建的对象通常通过构造函数...
在Swift开发中,"无代码入侵获取AppDelegate声明周期"是一个技术话题,主要涉及如何在不修改原有AppDelegate.swift文件代码的情况下,监测和利用AppDelegate对象的生命周期事件。这在某些情况下非常有用,比如当需要...
了解并熟练掌握C++的作用域、生命周期和内存管理是编写高质量、健壮代码的基础。在实际编程中,合理使用命名空间可以有效地避免命名冲突,理解变量的生命周期有助于避免内存泄漏和意外的变量访问。而对内存分配的...
6. **Manifests**:资源描述清单是YAML文件,声明了Kubernetes API对象(包括内置对象和自定义对象)及其配置。用户可以通过`kubectl create`命令或直接调用API来创建这些资源实例。 **Cluster API的工作机制** ...
编写AIDL文件,你需要声明接口、数据类型和方法。编译后,AIDL会自动生成对应的Java类,这些类实现了客户端和服务端所需的接口。使用AIDL通信时,服务端需要实现接口并在onBind()中返回IBinder对象,而客户端则通过...
首先,RxJava2是一个基于Java和Kotlin的反应式编程库,它允许开发者以声明式的方式处理异步操作和事件流。通过使用Observables和Operators,开发者可以轻松地创建复杂的异步逻辑,同时处理错误和异常,确保资源的...
在C#代码中,可以通过构造函数声明和初始化对象。同时,可以重写`OnInit`方法来插入自定义代码,确保对象按需创建。值得注意的是,如果控件在.aspx文件中声明,它们的属性不能在构造函数中设置,因为创建顺序不确定...
在这个周期内,JVM负责管理所有类和对象的生命周期。 **2. Java程序与JVM生命周期的一致性** 程序生命周期与Java虚拟机生命周期是一致的。这意味着Java虚拟机进程从创建起的任务就是执行Java程序,直至程序正常...
不同作用域的Bean,其生命周期和管理方式也不同。例如,单例Bean在整个应用中只有一个实例,而原型Bean每次请求都会创建新的实例。 6. **AOP代理** 如果Bean被声明为需要AOP代理(例如,带有切面注解),Spring会...
在JSP中,有四种不同的属性范围,用于控制变量的生命周期和可见性: 1. **`page`**范围:仅在当前JSP页面内可见,生命周期从声明变量开始,到页面渲染结束。 2. **`request`**范围:在一次HTTP请求中可见,覆盖了...
Fragment是Android应用开发中的一个重要组件,它允许我们把UI的一部分逻辑独立出来,可以在Activity中进行管理,使得界面设计更加...正确地管理Fragment的状态和生命周期可以帮助我们构建更稳定、更高效的Android应用。
在函数或结构体中声明生命周期参数,可以确保引用不会超出其预期的有效范围。 ##### 示例1:修复返回引用生命周期不匹配的问题 ```rust // 错误的实现 fn invalid_output() -> &'a String { &String::from("foo")...