`
lpm528
  • 浏览: 84134 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

代理模式--动态(事务代理的例子)

 
阅读更多

在tomcat的server.xml配置数据库:

 <Context path="/crm" docBase="/crm"  reloadable="false" crossContext="true">  <!-- 第一个path指web访问地址时的虚拟项目名(一般跟项目名一样),docBase指项目的实际物理地址-->
  	
			<Resource   name="jdbc/crm"   auth="Container"   type="javax.sql.DataSource"  
				 maxActive="10"   maxIdle="2"   maxWait="10000"  removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
				 username="xxx"   password="xxxx"  
				 driverClassName="net.sourceforge.jtds.jdbc.Driver"  
				 url="jdbc:jtds:sqlserver://x.x.x.x:x;DatabaseName=x"/>  

			<Resource   name="jdbc/dhyx_ivr"   auth="Container"   type="javax.sql.DataSource"  
				 maxActive="4"   maxIdle="2"   maxWait="10000"  removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
				 username="xxx"   password="xxx"  
				 driverClassName="oracle.jdbc.OracleDriver"  
				 url="jdbc:oracle:thin:@x.x.x.x:x:x"/>		
				 
 </Context>

 

 

在JPA 的配置文件persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
	version="2.0">
	<persistence-unit name="sqlserver" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>

		<jta-data-source>java:comp/env/jdbc/crm</jta-data-source>  //引用tomcat的server.xml配置的数据对应的Resourcename
		
		<class>com.user.model.Userinfo</class>
				
		。。。。。。
		
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"></property>
			<property name="hibernate.show_sql" value="false"></property>
		</properties>
	</persistence-unit>
	
	<persistence-unit name="oracle" transaction-type="RESOURCE_LOCAL">
	
		<provider>org.hibernate.ejb.HibernatePersistence</provider>

		<jta-data-source>java:comp/env/jdbc/dhyx_ivr</jta-data-source>//引用tomcat的server.xml配置的数据对应的Resourcename

		
       	<class>com.userMessage.model.Usermessage</class>
		
		。。。。。。		
		<properties>
		 	<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"></property> 
			<property name="hibernate.show_sql" value="false"></property> 
		</properties>
		
	</persistence-unit>
</persistence>

 在util包中创建获得EntityManager工具类:

public class HibernateEntityManager {
	 public static final ThreadLocal entityManager = new ThreadLocal();
	 private static EntityManagerFactory emf = null;
	 private static EntityManagerFactory emf_oracle = null;
		 public static void initDatabase()
	 {
		 try
			{
			 emf = Persistence.createEntityManagerFactory("sqlserver");
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			
			try
			{
				emf_oracle = Persistence.createEntityManagerFactory("oracle");
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			
	 }
		 public static void closeCurrentEm()
	 {
		 EntityManager em1 = (EntityManager)entityManager.get();
		 if(em1!=null)
		 {
			 em1.close();
		 }
		 entityManager.set(null);
	 }
	 
	 public static EntityManager getEm(int databaseType)
		{
		 EntityManager em1 = null;
		 if(databaseType==1)
		 {
			  em1 = (EntityManager)entityManager.get();
				if(em1==null)
				{
					em1 = emf.createEntityManager();
					entityManager.set(em1);
				}
		 }
		 else if(databaseType==2)
		 {
			  em1 = (EntityManager)entityManager.get();
				if(em1==null)
				{
					em1 = emf_oracle.createEntityManager();
					entityManager.set(em1);
				}
		 }
			
			return em1;
		}

action调用service的方式:

UserServiceInter userService =(UserServiceInter)ServiceFactory.getUserService();

ServiceFactory类中中的getUserService方法:

 public static UserServiceInter getUserService() {
  UserService g = new UserService();   //new出一个具体要让代理的service对象
  return (UserServiceInter) ServiceBaseProxy.newInstance(g);//通过代理就会在执行原方法前后添加所需的逻辑
 }

ServiceBaseProxy类:

public class ServiceBaseProxy implements InvocationHandler {

	private Object obj;
	private int datebaseType = 1;

	public static Object newInstance(Object obj) {
		// 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
		return java.lang.reflect.Proxy.newProxyInstance(obj.getClass()
				.getClassLoader(), obj.getClass().getInterfaces(),
				new ServiceBaseProxy(obj));
	}
//第一个参数是要让代理的service对象的classloader,第二个参数是service对象的接口,第三个参数是处理逻辑的InvocationHandler类
	public static Object newInstance(Object obj, int datebaseType) {
		return java.lang.reflect.Proxy.newProxyInstance(obj.getClass()
				.getClassLoader(), obj.getClass().getInterfaces(),
				new ServiceBaseProxy(obj, datebaseType));
	}

	public ServiceBaseProxy(Object obj) {
		this.obj = obj;
	}

	public ServiceBaseProxy(Object obj, int datebaseType) {
		this.obj = obj;
		this.datebaseType = datebaseType;
	}
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Exception {
		
		EntityManager em = HibernateEntityManager.getEm(this.datebaseType);
		String methodName = method.getName();
		EntityTransaction et = null;
		boolean flag = false;
		if (methodName.indexOf("WithTran") != -1) {  //执行前添加的逻辑
			flag = true;
		}
		Object result = null;
		try {
			if (flag) {
				System.out.println("em.getTransaction()");
				et = em.getTransaction();     //执行前添加的逻辑
				et.begin();
			}
			result = method.invoke(obj, args);   //执行原来service中的方法,obj对象告诉method执行哪个对象中的方法
		} catch (Exception e) {
			e.printStackTrace();
			if (flag) {
				 if ( et != null && et.isActive() ) 
				  et.rollback();
			}
			throw new Exception(e.getMessage());
		} finally {
			if (flag) {
				System.out.println("et.commit()");
				et.commit();
			}
			HibernateEntityManager.closeCurrentEm();  //执行后添加的逻辑
		}
		return result;
	}
}

 

 

 

分享到:
评论

相关推荐

    动态代理例子

    总结来说,动态代理是Java中一种强大的设计模式,它允许我们为现有对象添加新的行为,而无需修改原有代码。通过反射机制,我们可以在运行时创建并使用代理对象,使得代码更加灵活和可扩展。在实际开发中,动态代理常...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    为了更好地理解代理模式的工作原理,我们通过下面的例子来实现一个简单的代理模式。 **定义接口**: ```java public interface SellPerfume { void sellPerfume(double price); } ``` **定义真实对象**: ```java...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    JAVA设计模式之代理模式实例

    代理模式的应用场景非常广泛,比如在数据访问对象(DAO)中添加缓存功能、远程服务调用、事务管理等。理解并熟练运用代理模式,能够帮助开发者更好地设计和优化系统,提高代码的灵活性和可扩展性。在实际项目中,...

    优秀的设计模式示例-静态代理模式

    在这个例子中,"优秀的设计模式示例-静态代理模式"提供了实际项目中的代码实例,旨在帮助开发者更好地理解和应用静态代理模式。 静态代理模式的核心思想是通过代理类来代理原始对象(也称为真实对象或服务对象),...

    代理模式之动态代理

    在Java编程中,代理模式有静态代理和动态代理两种实现方式。本文将主要探讨动态代理,这是一种更灵活且适用于多种场景的技术。 动态代理通常在需要在调用目标方法前后执行额外操作时使用,例如日志记录、性能监控、...

    设计模式实现——代理模式

    例如,对于一个Web服务,我们可能需要在用户访问资源前进行身份验证,这就是一个很好的使用代理模式的例子。通过创建一个代理类,它首先检查用户权限,如果权限合法,则调用实际的服务处理请求。 总的来说,代理...

    spring动态代理类的示范小版本,很简单的例子

    这个文件名可能是指示示例使用静态代理模式的。静态代理是在编译时就已经明确知道代理类和被代理类关系的方式,而Spring的动态代理则是在运行时生成代理类。在静态代理中,我们需要手动创建代理类并实现相同的方法...

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    代理模式应用小例子C#

    通过代理模式,我们可以实现诸如数据验证、性能监控、事务管理等附加功能,同时保持客户端代码的简洁性。在C#中,代理模式是面向对象设计中一个非常实用的工具,广泛应用于各种场景,如Web服务调用、图形用户界面...

    动态代理设计模式详解.pdf

    在编程中,代理模式也遵循这一原则,代理对象代替目标对象执行某些操作。例如,如果目标对象是一个鸟(Bird),它有一个fly()方法表示飞行,而代理对象(如BirdTimeProxy)则会在调用fly()方法前后记录时间,从而...

    静态代理和动态代理的例子

    代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...

    Proxy代理模式经典实例(绝对OOP)

    Proxy代理模式是面向对象设计模式中的重要组成部分,它在软件工程中扮演着关键角色,尤其在Java编程中。代理模式的主要目的是为一个对象提供一个替身或者占位符,以便控制对这个对象的访问。这种设计模式允许我们...

    动态代理和工厂方法例子

    在编程领域,动态代理和工厂方法是两种非常重要的设计模式,它们在软件开发中起着至关重要的作用。这里我们将深入探讨这两种模式,并结合提供的文件名,即“005_Factory_Series_DesignPattern”和“006_Dynamic_...

    java-用Java动态代理实现AOP.pdf

    在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....

    用生动的例子讲述设计模式

    代理模式为另一个对象提供一个代理以控制对这个对象的访问。当直接访问某个对象带来很多不便的时候,我们可以通过一个称之为“代理”的第三者对象来实现间接访问。 #### 适用场景: - 要创建的对象开销很大时。 - ...

    spring学习笔记(十六)-声明式事务的例子

    首先,声明式事务管理基于AOP(面向切面编程)实现,Spring通过代理模式在方法调用前后自动插入事务管理的代码。它主要通过两种方式实现:XML配置和注解驱动。 1. XML配置:在`&lt;tx:advice&gt;`元素中定义事务行为,...

    静态代理和动态代理Demo

    静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...

    代理模式java代码 Proxy(5) 2个代理类

    在实际开发中,代理模式广泛应用于远程服务调用、事务管理、权限控制等多种场景。 总结起来,代理模式是Java中一种重要的设计模式,它可以让我们在不修改原始对象的基础上,通过代理类添加额外的功能或控制。静态...

    java代理模式示例源码

    在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...

Global site tag (gtag.js) - Google Analytics