在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 public interface SellPerfume { void sellPerfume(double price); } ``` **定义真实对象**: ```java...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
代理模式的应用场景非常广泛,比如在数据访问对象(DAO)中添加缓存功能、远程服务调用、事务管理等。理解并熟练运用代理模式,能够帮助开发者更好地设计和优化系统,提高代码的灵活性和可扩展性。在实际项目中,...
在这个例子中,"优秀的设计模式示例-静态代理模式"提供了实际项目中的代码实例,旨在帮助开发者更好地理解和应用静态代理模式。 静态代理模式的核心思想是通过代理类来代理原始对象(也称为真实对象或服务对象),...
在Java编程中,代理模式有静态代理和动态代理两种实现方式。本文将主要探讨动态代理,这是一种更灵活且适用于多种场景的技术。 动态代理通常在需要在调用目标方法前后执行额外操作时使用,例如日志记录、性能监控、...
例如,对于一个Web服务,我们可能需要在用户访问资源前进行身份验证,这就是一个很好的使用代理模式的例子。通过创建一个代理类,它首先检查用户权限,如果权限合法,则调用实际的服务处理请求。 总的来说,代理...
这个文件名可能是指示示例使用静态代理模式的。静态代理是在编译时就已经明确知道代理类和被代理类关系的方式,而Spring的动态代理则是在运行时生成代理类。在静态代理中,我们需要手动创建代理类并实现相同的方法...
装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...
通过代理模式,我们可以实现诸如数据验证、性能监控、事务管理等附加功能,同时保持客户端代码的简洁性。在C#中,代理模式是面向对象设计中一个非常实用的工具,广泛应用于各种场景,如Web服务调用、图形用户界面...
在编程中,代理模式也遵循这一原则,代理对象代替目标对象执行某些操作。例如,如果目标对象是一个鸟(Bird),它有一个fly()方法表示飞行,而代理对象(如BirdTimeProxy)则会在调用fly()方法前后记录时间,从而...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
Proxy代理模式是面向对象设计模式中的重要组成部分,它在软件工程中扮演着关键角色,尤其在Java编程中。代理模式的主要目的是为一个对象提供一个替身或者占位符,以便控制对这个对象的访问。这种设计模式允许我们...
在编程领域,动态代理和工厂方法是两种非常重要的设计模式,它们在软件开发中起着至关重要的作用。这里我们将深入探讨这两种模式,并结合提供的文件名,即“005_Factory_Series_DesignPattern”和“006_Dynamic_...
在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....
代理模式为另一个对象提供一个代理以控制对这个对象的访问。当直接访问某个对象带来很多不便的时候,我们可以通过一个称之为“代理”的第三者对象来实现间接访问。 #### 适用场景: - 要创建的对象开销很大时。 - ...
首先,声明式事务管理基于AOP(面向切面编程)实现,Spring通过代理模式在方法调用前后自动插入事务管理的代码。它主要通过两种方式实现:XML配置和注解驱动。 1. XML配置:在`<tx:advice>`元素中定义事务行为,...
静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...
在实际开发中,代理模式广泛应用于远程服务调用、事务管理、权限控制等多种场景。 总结起来,代理模式是Java中一种重要的设计模式,它可以让我们在不修改原始对象的基础上,通过代理类添加额外的功能或控制。静态...
在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...