跟我学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

相关文章

QT事件处理系统之三:子类化QPushButton后,对事件进行相应处理后,自定义按钮无法发出clicked信号的问题

1、信号槽绑定 如下,Widget中进行了SelfButton按钮的信号槽绑定。 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi

Python之三大基本库——Numpy(1)

最近呢学了一些关于python的一些功能,为了更方便快捷高效的实现项目,我们要熟知python的三个基本库:numpy、pandas、matplotlib的功能。由于我也是入门新手,所以先做一些基本的总结,后续有进阶的话会再来更新。 一、Numpy的作用 Numpy是一个Python科学计算库,提供了高性能的多维数组对象(ndarray)以及对这些数组进行操作的函数。它是许多其他数据科学和

DWR+SpringMVC整合的3种方式之三

方式三:这种方式和方式二差不多,主要使用annotation配置和注解  说明:这种的耦合度也是和方式二差不多,本人最推荐用方式一,写的清楚,配置也清楚。这种方式的时候也遇到了一个很无语的问题,我原来使用的是maven下载的dwr-3.0.M1.jar包,然后运行jetty没错,显示jsp的时候就一直报下面这个错误: org.springframework.beans.factory.p

如何开发海外仓系统?开发和购买海外仓系统哪个性价比更高

每个海外仓都各自不同,具备的优势,面临的困境也完全不同。所以在对海外仓系统的讨论时,是自己开发还是购买,都要放到具体的海外仓环境上才能得出合理结论。 1、实现海外仓精细化管理,你有哪些选择? 选择成熟的第三方海外仓系统:在市场上你有多种海外仓系统可以选择,他们会为你提供一个现成的解决方案,包括自定义功能和海外仓管理标准功能。 因为系统经过市场的检验,所以部署的速度更快,难度更低。通常只需

mke2fs -- 比mkfs.ext4艺术成分更高

mke2fs 介绍 mke2fs 是一个用于创建 ext2/ext3/ext4 文件系统的工具,是 mkfs.ext2, mkfs.ext3, mkfs.ext4 的底层工具。它提供了丰富的选项和参数,可以对文件系统进行详细的配置和优化。下面是 mke2fs 的详细讲解,包括其主要功能、常用选项及使用示例。 mke2fs 基本用法 mke2fs [options] device [blo

【REACT NATIVE 系列教程之三】函数绑定与FLEXBOX是用好REACT的基础

http://blog.csdn.net/xiaominghimi/article/details/51397172 http://blog.csdn.net/xiaominghimi/article/details/51397172 http://blog.csdn.net/xiaominghimi/article/details/51397172

阻力支撑相对强度(RSRS)选股系列报告之三

https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm=1001.2014.3001.5503https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm=1001.2014.3001.5503

【跟我学RISC-V】(三)openEuler特别篇

写在前面 这篇文章是跟我学RISC-V指令集的第三期,距离我上一次发文已经过去一个多月了,在这个月里我加入了oerv的实习项目组,并且还要准备期末考试,比较忙。 在这篇文章里我会隆重、详细地介绍一个对RISC-V支持非常友好的Linux发行版,同时也是国产操作系统 — openEuler.在此之前我都是使用我最熟悉的Fedora,在x86上Fedora确实非常好用、体验好,但是在RISC-V上总

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注,它通过识别和定位图像中的目标对象,提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为了帮助大家全面掌握目标检测的方法并寻找创新点,本文总结了最近两年【目标检测】相关的20篇顶会论文的研究成果,这些论文的文章、来源以及论文的代码都整理好了,希

更强的链表klist

前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的klist。虽然三者不同,但hlist和klist都可以看成是从list_head中发展出来的,用于特殊