- 浏览: 268614 次
- 性别:
- 来自: 新乡
文章分类
- 全部博客 (227)
- servciemix (10)
- db (18)
- javaTools (4)
- hibernate (31)
- web (3)
- spring (14)
- design pattern (4)
- java security (3)
- portal (1)
- ejb (6)
- session (2)
- java_lang (21)
- jbpm (29)
- struts (7)
- orgRights (2)
- project manager Jira (7)
- 跨库事务 (2)
- mysql (14)
- ubuntu (7)
- osgi (9)
- maven ant make (4)
- 分布式 高并发 高性能 (5)
- virgo-dm_server (0)
- osgi web (3)
- platform (1)
- smooks (1)
- business (1)
- 职场生涯 (14)
- Java编码格式 (2)
- web服务 (1)
- 计算机使用 (1)
- 健康工作生活的保障,工作中务必抛掉的不良心态 (4)
- 电信-网络监控 (1)
- 多线程-multithread (1)
- 海量数据-高性能 (2)
- Mybatis (1)
- web开发平台研发 (0)
- oracle (0)
- 应用服务器调优 (0)
- web前端 (0)
- servlet-jsp (0)
- tomcat (2)
- newtouch (1)
- portal_liferay (2)
- version control (1)
- apm-impact (2)
- tools (1)
- 研发管理 (1)
- 电商业务 (1)
- 生鲜电商市场调查 (0)
- PBX (0)
- 房东 (0)
最新评论
-
lifuchao:
...
权限问题 -
Branding:
谢谢,受教了,另外,CONN AS SYSDBA,必须是在操作 ...
Oracle密码忘记了怎么办? -
zhuchao_ko:
...
Portal实现原理 -
败类斯文:
不知道改哪里。。。木有见到红色。。表示悟性低了、、
jira error: Neither the JAVA_HOME nor the JRE_HOME environment variable is defin -
c__06:
正文:假如事务我是这样定义的: <tx:method n ...
Spring中Transactional配置
使用动态代理实现用AOP对数据库进行操作
2008-03-14 11:04 作者:reverocean 来源:赛迪网
[摘要] 要实现对数据库的操作,离不开数据源(DataSource)或者连接(Connection),但是通常来说对数据库的操作都应该放在DAO中,而DAO又不应该与应用服务器相关联,所以一般都使用连接(Connection)。 [关键字] 动态代理 AOP 数据库
要实现对数据库的操作,离不开数据源(DataSource)或者连接(Connection),但是通常来说对数据库的操作都应该放在DAO中,而DAO又不应该与应用服务器相关联,所以一般都使用连接(Connection)。现在我们这里就有一个问题了,怎么在拦截器中获得连接。我想可以通过两种方式获得:
在分别讨论这两种方法之前,我们需要先讨论一下在处理数据库的时候的异常的处理。我这里做了一个TransactionException继承至RuntimeException然后在拦截器里面抛出,再又应用框架处理这个异常。下面试这个类的代码:
public class TransactionException extends RuntimeException {
private Throwable superException;
private String myMessage;
public TransactionException(Throwable throwable){
super(throwable);
this.superException = throwable;
}
public TransactionException(Throwable throwable,String message){
super(message,throwable);
this.superException = throwable;
this.myMessage = message;
}
/**
* @return Returns the myMessage.
*/
public String getMessage() {
return myMessage;
}
/**
* @return Returns the superException.
*/
public Throwable getSuperException() {
return superException;
}
/**
* @param myMessage The myMessage to set.
*/
public void setMyMessage(String message) {
this.myMessage = message;
}
/**
* @param superException The superException to set.
*/
public void setSuperException(Throwable superException) {
this.superException = superException;
}
}
1) 通过方法的第一个参数传进去
l DAO
import java.sql.Connection;
public class TestDao {
public void insertA(Connection con,String a,String b,……){
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
}
l 拦截器
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TransactionInterceptor implements Interceptor {
public void before(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new TransactionException(e);
}
}
}
public void after(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.commit();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
public void exceptionThrow(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.rollback();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
private List getNeedTransaction(){
List needTransactions = new ArrayList();
needTransactions.add("insert");
needTransactions.add("update");
return needTransactions;
}
private boolean isNeedTransactions(InvokeJniInfo invInfo){
String needTransaction = "";
List needTransactions = getNeedTransaction();
for(int i = 0;i needTransaction = (String)needTransactions.get(i);
if(invInfo.getMethod().getName().startsWith(needTransaction)){
return true;
}
}
return false;
}
}
需要注意的是:getNeedTransaction就是需要进行事务处理的方法的开头,这个方法可以写成一个从配置文件里面去读,这里我就写死在里面了。只是对insert和update开头的方法进行事务控制。
2) 将Connection对象放在ThreadLocal中
l ConnectionUtil类:
import java.sql.Connection;
public final class ConnectionUtil {
private static ThreadLocal connections = new ThreadLocal();
public static Connection getConnection(){
Connection conn = null;
conn = (Connection) connections.get();
if(conn == null){
conn = getRealConnection();
connections.set(conn);
}
return conn;
}
public static void realseConnection(Connection conn){
connections.set(null);
}
private static Connection getRealConnection() {
实现自己获取连接的代码
return null;
}
}
l DAO类
public class TestDao {
public void insertA(String a,String b){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
Connection conn = getConnection();
………………………………………
1 2 下一页>>
关键词: 动态代理, AOP, 数据库,
* 相关文章
1、使用“DB2”数据库临时表的6个注意事项
2、大型数据库的设计原则与开发技巧
3、如何从数据库查询结果集中获得随机结果
4、关于Access数据库4种安全方式
5、讲解SQL Server 2005数据库的同义词Bug
6、如何防止插入删除表造成的数据库死锁
7、详细讲解Oracle表分区相关概念及优点
8、详细讲解各种数据库使用JDBC连接的方式
9、数据库相关--Hibernate的事务和并发
10、Linux系统安全机制进阶分析
11、安全的配置和应用MySQL数据库
12、哪些因素可以影响Oracle数据库的性能
13、SQL端口改变后的远程连接和数据库连接
14、Delphi编程:三层数据库构架实例解析
15、对一些代码加密后再放到Oracle数据库中
16、SQL Server 2008关系数据库引擎新增功能
17、J2EE综合:业务逻辑和数据库的访问决策
18、J2EE综合--业务逻辑和数据库访问决策
19、融会贯通Oracle数据库的25条基本知识
20、exp的版本高于数据库版本导出时出现报错
21、使用“DB2”数据库临时表的6个注意事项
* 我要留言
论坛焦点
*
* PLSQL程序设计
*
* 经典资料3----oracle培训18天老师
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函数大全
*
* 提供点ORACLE9i_优化设计与系统调整
*
* ORACLE初始化参数详解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初学者的好书,图文讲解
*
* oracle超级帮助文件(中文版)-OR
*
* Oracle SQL 內置函數大全
技术分类
* 微软技术
* vista Windows ISA Exchange SharePoint
* Oracle
* 入门与认证 数据库管理 开发应用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 数据库
* SQL Server Sybase DB2 Access MySQL
* WEB开发
* ASP JSP PHP JavaScript VB VC
* JAVA开发
* J2SE J2EE J2ME Web Services XML
开源 SOA Eclipse Jbuilder
* NET开发
* C# J# ASP.NET VB.NET VC.NET C++
* 图形设计
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒体技术
* Authorware MAYA 3Dmax Flash
* 虚拟技术
* vmware Virtual PC Virtuozzo xen
* 其他技术
* 中间件 嵌入式开发 移动开发 游戏开发
关于硅谷动力 | 广告服务 | 版权声明 | 加入硅谷动力 | 联系我们 | 建议/投诉 | 网站导航 | 加入收藏
网站合作、内容监督、商务咨询、投诉建议:010-65245588
合作建议:hezuo@mail.enet.com.cn
2008-03-14 11:04 作者:reverocean 来源:赛迪网
[摘要] 要实现对数据库的操作,离不开数据源(DataSource)或者连接(Connection),但是通常来说对数据库的操作都应该放在DAO中,而DAO又不应该与应用服务器相关联,所以一般都使用连接(Connection)。 [关键字] 动态代理 AOP 数据库
要实现对数据库的操作,离不开数据源(DataSource)或者连接(Connection),但是通常来说对数据库的操作都应该放在DAO中,而DAO又不应该与应用服务器相关联,所以一般都使用连接(Connection)。现在我们这里就有一个问题了,怎么在拦截器中获得连接。我想可以通过两种方式获得:
在分别讨论这两种方法之前,我们需要先讨论一下在处理数据库的时候的异常的处理。我这里做了一个TransactionException继承至RuntimeException然后在拦截器里面抛出,再又应用框架处理这个异常。下面试这个类的代码:
public class TransactionException extends RuntimeException {
private Throwable superException;
private String myMessage;
public TransactionException(Throwable throwable){
super(throwable);
this.superException = throwable;
}
public TransactionException(Throwable throwable,String message){
super(message,throwable);
this.superException = throwable;
this.myMessage = message;
}
/**
* @return Returns the myMessage.
*/
public String getMessage() {
return myMessage;
}
/**
* @return Returns the superException.
*/
public Throwable getSuperException() {
return superException;
}
/**
* @param myMessage The myMessage to set.
*/
public void setMyMessage(String message) {
this.myMessage = message;
}
/**
* @param superException The superException to set.
*/
public void setSuperException(Throwable superException) {
this.superException = superException;
}
}
1) 通过方法的第一个参数传进去
l DAO
import java.sql.Connection;
public class TestDao {
public void insertA(Connection con,String a,String b,……){
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
}
l 拦截器
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TransactionInterceptor implements Interceptor {
public void before(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new TransactionException(e);
}
}
}
public void after(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.commit();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
public void exceptionThrow(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.rollback();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
private List getNeedTransaction(){
List needTransactions = new ArrayList();
needTransactions.add("insert");
needTransactions.add("update");
return needTransactions;
}
private boolean isNeedTransactions(InvokeJniInfo invInfo){
String needTransaction = "";
List needTransactions = getNeedTransaction();
for(int i = 0;i needTransaction = (String)needTransactions.get(i);
if(invInfo.getMethod().getName().startsWith(needTransaction)){
return true;
}
}
return false;
}
}
需要注意的是:getNeedTransaction就是需要进行事务处理的方法的开头,这个方法可以写成一个从配置文件里面去读,这里我就写死在里面了。只是对insert和update开头的方法进行事务控制。
2) 将Connection对象放在ThreadLocal中
l ConnectionUtil类:
import java.sql.Connection;
public final class ConnectionUtil {
private static ThreadLocal connections = new ThreadLocal();
public static Connection getConnection(){
Connection conn = null;
conn = (Connection) connections.get();
if(conn == null){
conn = getRealConnection();
connections.set(conn);
}
return conn;
}
public static void realseConnection(Connection conn){
connections.set(null);
}
private static Connection getRealConnection() {
实现自己获取连接的代码
return null;
}
}
l DAO类
public class TestDao {
public void insertA(String a,String b){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
Connection conn = getConnection();
………………………………………
1 2 下一页>>
关键词: 动态代理, AOP, 数据库,
* 相关文章
1、使用“DB2”数据库临时表的6个注意事项
2、大型数据库的设计原则与开发技巧
3、如何从数据库查询结果集中获得随机结果
4、关于Access数据库4种安全方式
5、讲解SQL Server 2005数据库的同义词Bug
6、如何防止插入删除表造成的数据库死锁
7、详细讲解Oracle表分区相关概念及优点
8、详细讲解各种数据库使用JDBC连接的方式
9、数据库相关--Hibernate的事务和并发
10、Linux系统安全机制进阶分析
11、安全的配置和应用MySQL数据库
12、哪些因素可以影响Oracle数据库的性能
13、SQL端口改变后的远程连接和数据库连接
14、Delphi编程:三层数据库构架实例解析
15、对一些代码加密后再放到Oracle数据库中
16、SQL Server 2008关系数据库引擎新增功能
17、J2EE综合:业务逻辑和数据库的访问决策
18、J2EE综合--业务逻辑和数据库访问决策
19、融会贯通Oracle数据库的25条基本知识
20、exp的版本高于数据库版本导出时出现报错
21、使用“DB2”数据库临时表的6个注意事项
* 我要留言
论坛焦点
*
* PLSQL程序设计
*
* 经典资料3----oracle培训18天老师
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函数大全
*
* 提供点ORACLE9i_优化设计与系统调整
*
* ORACLE初始化参数详解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初学者的好书,图文讲解
*
* oracle超级帮助文件(中文版)-OR
*
* Oracle SQL 內置函數大全
技术分类
* 微软技术
* vista Windows ISA Exchange SharePoint
* Oracle
* 入门与认证 数据库管理 开发应用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 数据库
* SQL Server Sybase DB2 Access MySQL
* WEB开发
* ASP JSP PHP JavaScript VB VC
* JAVA开发
* J2SE J2EE J2ME Web Services XML
开源 SOA Eclipse Jbuilder
* NET开发
* C# J# ASP.NET VB.NET VC.NET C++
* 图形设计
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒体技术
* Authorware MAYA 3Dmax Flash
* 虚拟技术
* vmware Virtual PC Virtuozzo xen
* 其他技术
* 中间件 嵌入式开发 移动开发 游戏开发
关于硅谷动力 | 广告服务 | 版权声明 | 加入硅谷动力 | 联系我们 | 建议/投诉 | 网站导航 | 加入收藏
网站合作、内容监督、商务咨询、投诉建议:010-65245588
合作建议:hezuo@mail.enet.com.cn
发表评论
-
如何使用hibernate
2012-05-24 19:21 0一、选择Hibernate还是iBATIS都有它的道理: H ... -
关于hibernate自动建表和主键的数据类型的关系
2012-02-27 16:18 1139要想让hibernate自动建表, 1、除了 <prop ... -
用Spring+Hibernate链接时,在增删改时会报错: Write operations are not allowed in read-only mod
2011-09-11 19:53 878用Spring+Hibernate链接时,在增删改时会报错: ... -
[转]hibernate延迟加载
2011-04-26 11:41 5632007-12-01 [转]hibernate延迟 ... -
Hibernate利用XDoclet自动生成配置文件
2011-04-18 18:34 795Hibernate利用XDoclet自动生 ... -
如何利用 myeclipse 生成Hibernate 配置文件
2011-04-18 18:13 1243在hibernate中,每个数据表对应的其实是一个实体类,每个 ... -
Hibernate Synchronizer是一个Eclipse插件,可以自动生成*.hbm文件、持久化类和DAOs
2011-04-18 18:00 1887Hibernate Synchronizer是一个Eclips ... -
Hibernate auto produce
2011-04-18 17:52 976Hibernate 中需要class和mapp ... -
Hibernate中cascade与inverse属性详解
2011-04-01 16:20 933Hibernate中cascade与inverse属性详解 ... -
事务和事务边界
2011-03-31 15:44 100910.1.2 事务和事务边界 http://book.51ct ... -
事务传播行为种类
2011-03-31 15:31 814事务传播行为种类 Spring在TransactionDef ... -
Hibernate saveOrUpdate分析
2011-03-31 15:30 857* Hibernate s ... -
使用Spring AOP代理方式实现声明式事务的原理
2011-03-31 15:28 1198使用Spring AOP代理方式实 ... -
Hibernate Session缓存概述
2011-03-31 15:27 1000* Hibernate Session缓存 ... -
解说Hibernate的工作原理实例
2011-03-31 15:26 866* 解说Hibernate的工作原理实例 ... -
简述Hibernate配置连接池
2011-03-31 15:25 838* 简述Hiber ... -
简单解析J2EE数据持久层设计
2011-03-31 15:24 977* 简单解 ... -
浅析Hibernate Callback接口
2011-03-31 15:23 890* 浅析Hibernate Callbac ... -
概述Hibernate equals()方法
2011-03-31 15:22 765* 概述Hiber ... -
概括潜在的Hibernate性能问题
2011-03-31 15:21 940* 概括潜在的Hibernate性能问题 ...
相关推荐
这些代码可能涉及到如何创建分页对象,如何与数据库交互获取分页数据,以及如何在AOP中使用动态代理进行拦截和处理。 总的来说,Java分页、动态代理和AOP是Java开发中的关键技术,它们能帮助我们构建出更加高效、可...
在WCF中,实现AOP拦截器可以让我们在服务调用前后执行特定的逻辑,比如添加日志、验证权限或处理异常。 在本DEMO中,AOP拦截器被用来在消息传递过程中捕获和处理消息。这可能包括验证请求的合法性、添加操作日志、...
在Java编程中,数据库连接池是一种管理数据库连接的机制,它允许程序在多个请求之间...这个压缩包中的"使用JAVA中的动态代理实现数据库连接池"文档可能包含了更详细的实现细节和技术说明,可以进一步阅读以深入了解。
在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口;而CGLIB则是通过字节码技术生成一个类的子类来实现代理,因此即使目标类...
这种技术常用于实现AOP(面向切面编程),如日志记录、性能监控、事务管理等。Java的动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建代理对象,而...
4. **事务管理Demo**:结合Spring的事务管理特性,展示了如何使用AOP实现数据库操作的事务控制。 通过这些示例,你可以深入理解Spring AOP的工作原理,掌握其配置和使用方式,从而在实际项目中灵活地应用切面编程,...
本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志记录框架,能够自动追踪和记录应用程序的关键操作,同时支持数据持久化到数据库中,方便后期分析和问题排查。下面将详细介绍这些技术...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,对程序的行为进行统一的管理和控制。本篇文章将深入探讨Spring AOP的内部实现,以及如何通过源代码理解其DataSource...
本项目是一个基于Spring框架的应用程序,专注于使用Spring AOP(面向切面编程)和MyBatis进行数据库操作的集成。项目涵盖了从基本的Git操作到复杂的动态代理、事务管理以及数据库操作的实现。通过本项目,开发者可以...
- 类似地,连接池工具包(如`connect类工具包`)可能也会使用动态代理来封装数据库连接的获取与释放,以实现更高效的资源管理。 4. **性能考虑**: - 虽然动态代理提供了强大的功能,但它的性能相对较低,因为...
在本项目中,我们主要探讨如何使用SpringBoot与AOP(面向切面编程)来实现一个简单的数据库读写分离方案,同时利用阿里巴巴的Druid数据源。数据库读写分离是提高系统性能和可扩展性的重要手段,它将读操作和写操作...
当一个业务操作涉及多个数据库操作时,可以使用AOP在开始和结束时自动进行事务的开启和提交,如果出现异常则回滚事务,保证数据的一致性。 总之,Spring AOP通过aspectjweaver.jar和aspectjrt.jar这两个关键库,...
代理模式分为静态代理和动态代理,静态代理是通过编写代理类来实现,而动态代理则可以在运行时动态创建代理对象。 在Java中,动态代理主要通过java.lang.reflect包中的Proxy和InvocationHandler接口实现。Proxy类...
本例子是一个关于如何在Spring框架中实现AOP的应用实例。 标题中的"aop例子aop例子"表明我们将探讨Spring AOP的实践应用。Spring是Java领域中最流行的框架之一,它提供了对AOP的强大支持,使得我们可以方便地创建和...
动态代理通常用于实现AOP(面向切面编程)和拦截器模式,使得我们可以在不修改源代码的情况下增强或扩展已有对象的功能。在这个场景中,我们将动态代理应用于自定义连接池的实现,来提高数据库访问的效率和资源管理...
系统权限允许用户执行特定的数据库操作,如INSERT、UPDATE或DELETE,而对象权限则限制用户对特定表或视图的访问。我们可以创建自定义的角色,并分配适当的权限,以满足不同用户组的需求。 接下来,我们使用Spring ...
Spring默认使用运行时织入,通过动态代理实现。 6. **代理(Proxy)**:代理是AOP的核心,它是目标对象的增强版本,负责在调用目标方法前后执行通知。 在使用Spring AOP时,我们可以通过XML配置或注解的方式来定义...
在Spring中,AOP通过代理模式实现,可以分为JDK动态代理和CGLIB代理两种方式。 1. **AOP概念** - **切面(Aspect)**:切面是关注点的模块化,比如日志、安全检查等,它将分散在代码各处的相同关注点集中在一起。 ...
在事务管理中,动态代理通常用于实现AOP(面向切面编程),将事务逻辑与业务逻辑分离。 1. **Java动态代理基础**: - Java动态代理基于Java反射API实现,主要涉及到`java.lang.reflect.Proxy`和`java.lang.reflect...
连接池是数据库操作中常见的优化手段,动态代理可以用于监控连接的获取与释放,或者在每次连接使用前后执行特定的逻辑,如记录日志、检查连接状态等。 7. **应用场景**: Spring 动态代理常用于以下场景: - **...