跟我学OpenJPA之三(更快、更高、更强)

2024-02-01 02:10

本文主要是介绍跟我学OpenJPA之三(更快、更高、更强),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上节跟我学OpenJPA之二(Hello OpenJPA)

 

昨天打开ITEYE,发现我的两篇文章上了首页兴奋ing....

上ITEYE不短时间,同时上两篇还是第一次,感谢大家的支持,谢谢!

 

本来昨天考虑好了第三节的题目和内容,可惜出了趟差,回来的时候又冒雨开了两个多小时的车,高速上精神太紧张回来直接倒头睡觉,今天虽然晚上时间也不多,但是有大家的支持再累也得补上。嘿嘿 废话多了些,归正传先

 

=================废话的分割线===================

 

奥林匹克五个圈圈的精神:更高、更快、更强,同样我们的OpenJPA也有这样的需求,因此有了Enhance(参见http://book.51cto.com/art/200806/76766.htm )。这个东西非常奇特,借用参考里面的解释:


------OpenJPA的增强器(Enhancer)能够在运行时对系统性能进行优化,并且提高惰性加载的灵活性,是OpenJPA与Hibernate最大不同之处。增强器能够自动为持久化的类添加一些代码,这些代码能够帮助二进制的类实现持久化类所必需的一些特性。OpenJPA的增强器可以通过两种方式对持久化类进行优化,一是编译时强化;二是使用Java 5 提供的新特性Instrumentation,在运行时创建代理来强化。

 

这个是OpenJPA的一大特点,很多人在刚开始接触的时候很容易因为这个出错,因为OpenJPA默认是开启了编译时强化,我最开始使用OpenJPA的时候就经历了下面的过程。

 

我们现在修改上次Test代码:

  @Testpublic void doTest() {System.out.println("=====Hello OpenJPA " + entityManager + "=======");TXx txx = new TXx();txx.setXxMc("第一选项");entityManager.persist(txx);}

运行后报错如下:

.............
<openjpa-2.1.1-r422266:1148538 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
com.strong.module.txx.jpa.TXx".
.............

解决的方法有三种:

 

第一,在我之前的文章写过,就是使用Spring的Instrumentation(传送门Spring3(MVC)+OpenJPA2构建及发布 ),这个方法的缺点就是发布的时候在Tomcat的启动配置中也需要增加-javaagent:/simen/workspace/tomcat/lib/spring-agent.jar,且效率不高。下面列出我之前文章的内容给大家参考一下,不建议大家在实际中使用:

 

----当初为这个把我郁闷的,去 OpenJPA和Spring网站翻了半天才知道tomcat启动的时候要注册一个agent,名字叫spring-agent.jar,兴奋……翻遍 spring的包没找到这个东东  狂晕……,求教Google半天从一个犄角旮旯发现2.5这个包换名字,现在是org.springframework.instrument- 3.0.1.RELEASE-A.jar,找到2.5的spring-agent.jar才发现本来包里面的路径名就应该是instrument。把这个包改成spring-agent.jar(本身那个太长了),放到tomcat/lib目录里面,然后给tomcat加上启动参数  -javaagent:/simen/workspace/tomcat/lib/spring-agent.jar,在Eclipse里面是右键点这个 项目,Debug as -> Debug Configrations....

 

第二,在persistence.xml中增加如下:

<!-- 不使用加载时强化和编译时强化,使用运行时Unenhanced -->
<property name="openjpa.ClassLoadEnhancement" value="false" />
<property name="openjpa.DynamicEnhancementAgent" value="false" />
<property name="openjpa.RuntimeUnenhancedClasses" value="supported" />

这个方法最简单,可惜不能发挥OpenJPA的最大效能,所以也不推荐

 

第三,终极解决方案(参考http://www.ibm.com/developerworks/cn/java/j-lo-openjpa2/ )对每个持久化类执行

java org.apache.openjpa.enhance.PCEnhancer TXx.java

介个.......太麻烦了..............我还是不用了吧,不过等等,OpenJPA官方提供了几种解决方法,参见http://openjpa.apache.org/entity-enhancement.html ,如果使用的是Eclipse,那么还有无缝解决方案,参见http://openjpa.apache.org/enhancement-with-eclipse.html ,这里我使用的是Eclipse增加Ant编译的方法,过程如下(简单翻译官方文档,E文较差大家将就):

 

1、下载enhance.xml.tar.gz 解压到项目的根目录;新建openjpa_libs目录,下载与项目maven中openjpa版本相同openjpa-all 的jar包到这个目录(千万不要直接用openjpa-****.jar,必须是openjpa-all-*****.jar ),刷新项目保证能看增加的内容

 

2、右键项目,选择属性,进入Builders

 

3、在Main选项卡,新建一个Ant Builder,Buildfile的点“Browse Workspace”,选择上面的那个xml文件

 

Base Directory的点“Variables ”,选择build_project

 

最后填写Arguments的内容如图:

 

4、在Targets选项卡中为Manual Build 和 Auto Build点“Set Targets..”添加enhance


 

5、保存后控制台提示Ant Build的信息如下(不能显示的话刷新项目):

Buildfile: /simen/ramwork/StrongOpenJPA/enhance.xmlopenjpa.libs.check:build.dir.check:enhance:[echo] /simen/ramwork/StrongOpenJPA/target/classes:/simen/ramwork/StrongOpenJPA/openjpa_libs/openjpa-all-2.2.0.jar[openjpac] 299  StrongOpenJPAPU  INFO   [Worker-44] openjpa.Tool - Enhancer running on type "com.strong.module.txx.jpa.TXx".
BUILD SUCCESSFUL
Total time: 1 second

这里提示TXx类在编译的时候被增强,再次运行Test,运行通过

 

本节成功的把TXx增强了起来,如果大家觉得麻烦也可以直接枪毙了这个增强,或者在开发过程中不增强只是在发布的时候增强一下,恩这个主意不错!

可能大家会发现一个问题,刚才的Test执行了,但是数据库的内容没有变化,为什么?当然是事务的问题,这个问题下节我们继续。

 

本节资源:

OpenJPA官方提供的Eclipse增强xml:enhance.xml.tar.gz

本节的源码(内含openjpa-2.2.0.jar,上节源码在maven中没有MySQL的JDBC,本节已默认增加):StrongOpenJPA.tar.gz

 

 

 

 

 

 

 

 

 

 

 

这篇关于跟我学OpenJPA之三(更快、更高、更强)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665760

相关文章

LLM 模型压缩之三: FoldGPT

0. 资源链接 论文: FoldGPT: Simple and Effective Large Language Model Compression Scheme 项目: to be released. 1. 背景动机 现有的大语言模型推理存在以下问题: LLM 模型因为有大量的参数,以及 next token 的预测方式,导致 LLM 模型推理慢,计算消耗大。 模型压缩,量化和

selenium 自动化之三----元素定位多窗口切换

针对多窗口切换操作,定位方式 import timefrom selenium import webdriverdriver=webdriver.Chrome()driver.implicitly_wait(10)driver.get("http://www.baidu.com")sreach_window=driver.current_window_handle # 获取当前窗口dri

内部排序之三:堆排序

前言    堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用到的操作。比如我们建堆的时候可以采用堆的插入操作(将元素插入到适当的位置,使新的序列仍符合堆的定义)将元素一个一个地插入到堆中,但其实我们完全没必要这么做,我们有执行操作更少的方法,

RFC6455-The WebSocket protocol 之三:WebSocket URIs

3.WebSocket URIs This specification defines two URI schemes, using the ABNF syntax defined in RFC 5234 [RFC5234], and terminology and ABNF productions defined by the URI specification RFC 3986 [RF

Windows驱动_UMDF驱动之三UMDF取消IO完成IO访问IO类型HID驱动

Canceling I/O Requests(取消I/O请求)         正在被设备处理的IO请求,可以被应用程序,系统,或者驱动取消。如果设备的IO操作被取消,IO管理器尝试取消所有的和IO操作所关联的没有被处理的IO请求。设备驱动可以一个例程得到通知但IO管理器尝试取消IO请求的时候,然后驱动可以通过设置IO请求的完成状态值为ERROR_OPERATION_ABORTED取消请求。

在win8以及更高版本的操作系统中使用SQl Server

最近电脑重新安装系统,选择了win10,想要在win10上安装SQL Server 2008(之前win8上安装的是SQL Server 2008),结果发现提示不兼容,并且安装不成功,打开了提示链接https://support.microsoft.com/zh-cn/kb/2681562,说明如下:

跟我学C++中级篇——explicit的分析

一、C++中的类型转换 在学习C++(包括C语言)的过程中,有一个细节非常容易被开发者忽略,就是有一些类型编译器可以自做主张的进行转换。最简单的就是short,int,long,char这些基本类型,编译器会假定开发者就是想转换,所以它会自动转一下。这个在前面分析过有符号和无符号类型时,跳过大坑儿。不过随着开发工具和编译器的升级,这种一般会提供显示的警告。 而在一些类对象中,也存在着这种问题,比

Vue通信组件之三:父组件向子组件传值

【父组件向子组件传值data和props区别】      子组件中默认是无法访问到父组件中data上的数据和methods中的方法。我们可以在父组件引用子组件的时候,通过属性绑定(v-bind:)的形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部,以供子组件使用。      子组件的data(){}中的数组是子组件自己私有的数据,而子组件props中的数据是父组件传

局部凸空间及其在算子空间中的应用之三

局部凸空间及其在算子空间中的应用之三 前言一、豪斯多夫局部凸空间的例子二、线性算子的连续性刻画总结 数学是一种艺术,如同诗歌一样,它寻求美和简洁。—— André Weil 前言 本文继续该系列的上一篇文章,介绍一个特殊而重要的豪斯多夫局部凸空间,并证明其上的结论。然后我们给出了线性算子的连续性刻画的几个重要结论,方便后续文章的引用。 一、豪斯多夫局部凸空间的例子

主题模型Gensim入门系列之三:主题和变换

系列目录: (1)主题模型Gensim入门系列之一:核心概念 (2)主题模型Gensim入门系列之二:语料和向量空间 (3)主题模型Gensim入门系列之三:主题和变换 (4)主题模型Gensim入门系列之四:文本相似度查询 ————————————————————————————   本节主要介绍Gensim中从一个向量空间转换到另外一个向量空间的变换的概念,通过一个简单的语料加以