- 浏览: 1172208 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (411)
- ASP (6)
- ASP.NET (2)
- CSS (4)
- HTML (11)
- Javascript (34)
- Java (100)
- PHP (1)
- XML (2)
- Flash/Flex/AS (1)
- 编程理论 (6)
- 操作系统 (23)
- 架构与搭建 (13)
- 软件应用 (39)
- 移动开发及应用 (4)
- UI设计 (2)
- 数据库 (23)
- 围棋 (1)
- 闲语茶楼 (6)
- 金融 (1)
- 其他 (3)
- Linux/Unix (38)
- 项目管理 (3)
- cmd (2)
- ssh (3)
- SVN (1)
- 移动开发 (1)
- HTML5 (1)
- jquery (1)
- redis (1)
- nginx (2)
- webservice (1)
- vmware (1)
- ssl (1)
- eclipse (1)
- sqlite (1)
- spring (2)
最新评论
-
cnhome:
Java 8 下:// 编码String asB64 = Ba ...
不要使用sun.misc.BASE64Encoder -
请叫我翠西狗:
那如果我要用this.getServletContext() ...
JSP/Servlet使用代理或路由器映射时获取服务器地址为内网地址 -
nomblouder:
按照别的博客,别名一直是p4merge,导致一直报错comma ...
win与linux下git配置p4merge为合并比较工具的方法 -
linuxzhang:
请问我按你的方法修改了sts-3.7.3.RELEASE中的o ...
Eclipse中setter/getter方法自动添加属性注释 -
yzh__:
求解答。。。
Struts2定义默认拦截器时需要注意
Spring和Hibernate结合的时候,接口提供非常有限
尤其是对于一些需要自定义对数据进行更改的操作时,Spring提供的update和save就远远无法满足复杂的业务需求了
此时,我们只能使用callback方法来回调,除此以外,Hibernate的分页查询功能也不能逃脱此列,只能使用callback方法来实现
于是我在架构项目的时候,写了两个callback方法以简化开发,减少冗余代码
一个是ExecuteCallback,用于执行更新和删除的
一个是PageCallback,用于执行hibernate分页的
这里就以PageCallback为例来讨论
可以看到代码中我用到了volatile和synchronized
这是因为我发现这样设计,产生了并发的问题,线程不再安全,所以我才加上去的
不过加上去后,结果并不是非常满意,虽然并发问题被改善了,但是依然存在,只是降低了发生的频率而已
其实最安全的方法就是直接把callback的回调写在dao中,不过这实在太恐怖了。。我不敢想象这种情况
不知道spring在设计之初,是不是故意不封装callback进去的。。。现在都觉得这个问题开始让人很头大了,我想如果换成ibatis,应该是没有这样的问题的,毕竟灵活性比hibernate要强很多,不需要callback这一类问题
不知道大家在整合spring和hibernate的时候,是如何分页的?如果使用的是callback,是否也跟我一样遇到过这样的并发问题呢?
用ThreadLocal,不行?
总不能每次查询的时候都用它吧?
代码冗余严重。。
我说的用参数代替实例变量就是这个意思
不行啊
Callback中的doInHibernate不允许传参数阿
要不然我也想这么做。。。。。
尤其是对于一些需要自定义对数据进行更改的操作时,Spring提供的update和save就远远无法满足复杂的业务需求了
此时,我们只能使用callback方法来回调,除此以外,Hibernate的分页查询功能也不能逃脱此列,只能使用callback方法来实现
于是我在架构项目的时候,写了两个callback方法以简化开发,减少冗余代码
一个是ExecuteCallback,用于执行更新和删除的
一个是PageCallback,用于执行hibernate分页的
这里就以PageCallback为例来讨论
public abstract class BaseCallback implements HibernateCallback { protected volatile String hql; public String getHql() { return hql; } public synchronized void setHql(String hql) { this.hql = hql; } } public class PageCallback extends BaseCallback { protected volatile int startRow; protected volatile int pageSize; public int getStartRow() { return startRow; } public synchronized void setStartRow(int startRow) { this.startRow = startRow; } public int getPageSize() { return pageSize; } public synchronized void setPageSize(int pageSize) { this.pageSize = pageSize; } public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); query.setFirstResult(startRow); query.setMaxResults(pageSize); List list = query.list(); return list; } }
可以看到代码中我用到了volatile和synchronized
这是因为我发现这样设计,产生了并发的问题,线程不再安全,所以我才加上去的
不过加上去后,结果并不是非常满意,虽然并发问题被改善了,但是依然存在,只是降低了发生的频率而已
其实最安全的方法就是直接把callback的回调写在dao中,不过这实在太恐怖了。。我不敢想象这种情况
不知道spring在设计之初,是不是故意不封装callback进去的。。。现在都觉得这个问题开始让人很头大了,我想如果换成ibatis,应该是没有这样的问题的,毕竟灵活性比hibernate要强很多,不需要callback这一类问题
不知道大家在整合spring和hibernate的时候,是如何分页的?如果使用的是callback,是否也跟我一样遇到过这样的并发问题呢?
评论
7 楼
欣水寓言
2009-04-09
xieyongwei 写道
用ThreadLocal,不行?
总不能每次查询的时候都用它吧?
代码冗余严重。。
6 楼
daquan198163
2009-04-09
欣水寓言 写道
突然想到了一个思路
就是dao的父类中定义两个方法
然后子类dao中所有需要分页的都用getPage方法,所有需要对数据库数据执行操作的使用execute方法,只要使用这两个方法就能实现原来的两个callback类实现的方法了
而且不存在线程安全问题,也不存在代码冗余问题,无论如何也只有2个内部类。。。
貌似这个方法是最好的。。。正是我一直以来寻求的方法。。。。还真是灵光一闪阿。。。
想了很久了,没想到突然想到了。。。哈哈哈哈
大家觉得如何?
就是dao的父类中定义两个方法
protected List getPage(final String hql, final int startrow,final int pagesize) { return getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); query.setFirstResult(startRow); query.setMaxResults(pageSize); List list = query.list(); return list; } } } protected void execute(final String hql) { public synchronized Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); return query.executeUpdate(); } } }
然后子类dao中所有需要分页的都用getPage方法,所有需要对数据库数据执行操作的使用execute方法,只要使用这两个方法就能实现原来的两个callback类实现的方法了
而且不存在线程安全问题,也不存在代码冗余问题,无论如何也只有2个内部类。。。
貌似这个方法是最好的。。。正是我一直以来寻求的方法。。。。还真是灵光一闪阿。。。
想了很久了,没想到突然想到了。。。哈哈哈哈
大家觉得如何?
我说的用参数代替实例变量就是这个意思
5 楼
xieyongwei
2009-04-09
用ThreadLocal,不行?
4 楼
hedream
2009-04-08
很好。。收益了
3 楼
欣水寓言
2009-04-08
突然想到了一个思路
就是dao的父类中定义两个方法
然后子类dao中所有需要分页的都用getPage方法,所有需要对数据库数据执行操作的使用execute方法,只要使用这两个方法就能实现原来的两个callback类实现的方法了
而且不存在线程安全问题,也不存在代码冗余问题,无论如何也只有2个内部类。。。
貌似这个方法是最好的。。。正是我一直以来寻求的方法。。。。还真是灵光一闪阿。。。
想了很久了,没想到突然想到了。。。哈哈哈哈
大家觉得如何?
就是dao的父类中定义两个方法
protected List getPage(final String hql, final int startrow,final int pagesize) { return getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); query.setFirstResult(startRow); query.setMaxResults(pageSize); List list = query.list(); return list; } } } protected void execute(final String hql) { getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); return query.executeUpdate(); } } }
然后子类dao中所有需要分页的都用getPage方法,所有需要对数据库数据执行操作的使用execute方法,只要使用这两个方法就能实现原来的两个callback类实现的方法了
而且不存在线程安全问题,也不存在代码冗余问题,无论如何也只有2个内部类。。。
貌似这个方法是最好的。。。正是我一直以来寻求的方法。。。。还真是灵光一闪阿。。。
想了很久了,没想到突然想到了。。。哈哈哈哈
大家觉得如何?
2 楼
欣水寓言
2009-04-08
daquan198163 写道
用参数代替实例变量不就没有并发问题了?
不行啊
Callback中的doInHibernate不允许传参数阿
要不然我也想这么做。。。。。
1 楼
daquan198163
2009-04-08
用参数代替实例变量不就没有并发问题了?
发表评论
-
Maven使用mvn命令时跳过test的参数
2015-05-28 11:24 1730方法有两种: 方法1: mvn install -Dsk ... -
Spring中Propagation类的事务属性区别
2014-12-08 14:50 1940PROPAGATION_REQUIRED:支持当前事务,如果 ... -
Spring AOP中pointcut expression表达式解析
2014-08-27 15:39 3422Pointcut 是指那些方法需要被执行"AOP& ... -
用正则表达式替换手机号为星号*的写法
2014-08-11 15:43 10042现在网络越来越关注一些隐私,比如手机号隐藏当中的若干位数字 ... -
java使用相对路径连接sqlite
2014-08-01 15:48 6918在sqlite的连接源码中,可以看到 :resource: ... -
Eclipse中setter/getter方法自动添加属性注释
2014-08-01 12:11 16584这篇文章以前在公司内网发的,到现在也一直有用,发上来分享给有 ... -
memcached-session-manager配置
2014-07-09 18:01 954声明:本篇文章是根据memcach ... -
使用java原生url连接传输protobuf
2014-06-26 18:16 1463protobuf已经出来好多年了,原谅我最近才了解到goo ... -
Tomcat内存、连接数等性能参数设置
2014-02-20 14:37 17111、修改启动时内存参数、并指定JVM时区 (在windows ... -
使用JSP列出所有运行中的线程
2013-07-29 10:06 1046<html> <head> &l ... -
JVM系列五:JVM监测&工具[整理中]
2013-05-10 10:34 1130前几篇篇文章介绍了介绍了JVM的参数设置并给 ... -
JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
2013-05-10 10:32 1257java application项目(非web项目) 改进 ... -
JVM系列三:JVM参数设置、分析
2013-05-10 10:30 1023不管是YGC还是Full GC,GC过程中都 ... -
JVM系列二:GC策略&内存申请、对象衰老
2013-05-10 10:19 1032JVM里的GC(Garbage Collec ... -
JVM系列一:JVM内存组成及分配
2013-05-10 10:14 1094java内存组成介绍:堆(Heap)和非堆(Non-h ... -
jenkins配置权限不对导致无法登陆的重置方法
2013-04-20 20:43 25389找到.jenkins/config.xml文件: 替换为: ... -
Spring3中替换默认拦截器的方法BeanFactoryPostProcessor
2012-08-14 16:51 4053由于Spring默认的静态资源处理器不能满足需求,需要做一些自 ... -
Hessian 权限认证
2012-08-07 11:23 1524Hessian 权限认证 Hessian的一些基本简介已经在上 ... -
利用java 6.0的脚本引擎执行字符串表达式运算
2012-08-06 23:09 1454例子都在这里了:http://www.java2s.com/C ... -
在spring、tomcat中使用多数据源并支持分布式事务管理
2012-08-06 22:10 2626原文:http://zxlaiye.iteye.c ...
相关推荐
Spring 框架是 Java 开发中的一个核心组件,它为开发者提供了丰富的功能,包括依赖注入(IOC)、面向切面编程(AOP)以及回调机制。让我们深入了解一下这些概念。 **Spring IOC(Inversion of Control,控制反转)*...
5. **查询和结果集处理**:提供了丰富的查询方法,如`find()`, `load()`, `get()`等,以及方便的结果集转换和分页功能。 6. **Callback机制**:通过HibernateCallback接口,可以在Hibernate Session内部执行自定义...
10. **Callback事件**:Hibernate提供了一些生命周期回调方法,如preInsert、postLoad等,可以在对象的生命周期中插入自定义代码。 11. ** Criteria API**:这是一种更面向对象的查询方式,相比HQL,它更具有灵活性...
3. 在用友U9客户化开发中使用 Callback 的方法 4. 注册事件和事件执行内容的实现 5. 使用适配器来改变控件的值 6. 注意事项,如_callback 中赋字符串值带单引号时,无效果 这些知识点对于用友U9客户化开发中的 ...
HibernateCallback 是 Hibernate 框架中的一种 callback 机制,允许开发者在持久层访问时执行自定义操作。HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以实现灵活的持久层访问。 在 ...
10. **Callback事件**:Hibernate允许在对象生命周期中的特定时刻(如加载、保存、更新和删除)注册回调方法,实现业务逻辑。 11. **Association Mapping关联映射**:Hibernate支持一对一、一对多、多对一、多对多...
6.9 Template/Callback 简化业务方法 6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 ...
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...
1. 在 Activity 或 Service 中创建一个 Handler 实例,并实现 Handler.Callback 接口的 handleMessage 方法。 2. 在需要发送消息的线程中,使用 Handler 的 obtainMessage 方法创建一个 Message 对象,并将消息内容...
在 Spring AOP 中,`org.springframework.aop.framework.JdkDynamicAopProxy` 类实现了 `InvocationHandler` 接口,当代理对象的方法被调用时,实际会执行 `JdkDynamicAopProxy.invoke()` 方法。这个方法会检查并...
9. Callback事件:Hibernate支持在对象生命周期中的特定时刻触发回调方法,如预加载、加载、保存、更新和删除。源码中可能包含这些事件的监听器实现。 通过深入研究《Hibernate Quickly 源代码》,开发者可以全面...
本文将深入探讨如何在Spring中通过自定义工具类获取代理对象所代理的目标对象。 ### 核心概念:AOP与Spring Proxy 在理解如何获取目标对象之前,我们需要先了解Spring AOP的实现机制。Spring AOP主要通过动态代理...
在`DoSomething`函数中,我们将`callback`参数作为已定义的`CallbackType`类型来使用,这样我们就可以在适当的时候调用传入的函数。 然后,我们需要定义一个实际的回调函数,这可能是在我们的主程序中: ```cpp ...
回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个对象在完成特定操作后通知另一个对象。在Java或Android开发中,回调机制经常用于处理异步操作,例如网络请求、文件读写等,当操作完成时,通过回...
10. **Callback事件**:Hibernate 2.1提供了预加载、加载、保存、更新和删除等生命周期事件,开发者可以通过实现这些接口或使用注解来添加自定义逻辑。 在"chapter1"这个子目录中,你可能找到关于Hibernate 2.1的...
在低版本的Spring中实现类似自动配置的功能,主要目的是为了在不升级或重构现有系统的情况下,增强系统的功能和灵活性。由于Spring 4之后引入的@Conditional等条件注解是Spring Boot自动配置的关键,但在3.x版本中...
在Spring框架中,`spring-cglib-repack-3.2.6.jar`和`spring-objenesis-repack-2.6.jar`是两个重要的依赖库,它们在Spring源码环境中扮演着不可或缺的角色。本文将详细介绍这两个库以及它们在Spring框架中的作用。 ...
10. **Callback事件处理**: Hibernate 提供了一些预定义的生命周期回调方法,如`@PrePersist`, `@PostLoad`等,可以在对象的生命周期中的特定时刻执行自定义逻辑。 在"Hibernate Example-1"中,你可以找到一个具体...
总的来说,Spring JDBC的JdbcTemplate是Spring框架中用于数据库操作的关键组件,通过回调接口和模板方法设计,它极大地简化了数据库访问的代码,同时也提供了良好的异常处理和资源管理机制。理解和掌握JdbcTemplate...