CN111338764A - 一种基于jvm共享机制的事务处理方法 - Google Patents
一种基于jvm共享机制的事务处理方法 Download PDFInfo
- Publication number
- CN111338764A CN111338764A CN202010206647.5A CN202010206647A CN111338764A CN 111338764 A CN111338764 A CN 111338764A CN 202010206647 A CN202010206647 A CN 202010206647A CN 111338764 A CN111338764 A CN 111338764A
- Authority
- CN
- China
- Prior art keywords
- jvm
- classloader
- class
- transaction
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45575—Starting, stopping, suspending or resuming virtual machine instances
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
一种基于JVM共享机制的事务处理方法,在一个应用中加载二个以上应用模块时,二个以上应用模块中的公共子模块部分提取出来,在JVM中开辟一块公共内存空间存储公共子模块,这样A和B公共资源只要加载一次,二个以上应用模块共用一个类加载器;即当一个应用模块在启动时,把当前线程的类加载器ClassLoader放到java.lang.ClassLoader中,为这个模块创建一个war包;公共的ClassLoader取值是,如果当前线程中有ClassLoader就取当前线程的,如果取不到就取jetty容器的ClassLoader。本发明在软件本地部署情况下,不需要使用额外的中间件,实现多模块之间事务控制。
Description
技术领域
本发明属于软件领域,一种基于JVM共享机制的事务处理方法。
背景技术
随着企业升级转型的加速,企业想要在激烈的竞争中脱颖而出,就要提高效率、降低成本。在制造加工型企业中,采购成本要占到总成本70%左右。每降低一个点的采购成本都会带来效益的巨大提升。传统的采购模式——采购商与供应商双方不能进行有效的信息沟通,已经不能适应现代企业的发展,企业需要加快信息化建设。用计算机编程语言开发的采购系统实现采购的线上化、透明化、采购流程的精细化管控。实现采购商和供应商之间的协同。
为适应系统的模块化销售,采用微服务架构。部分企业因信息安全考虑,采用本地部署的方式。如果在一台服务器上部署多个应用,对机器的内存和性能消耗较大。如果在多台服务器上部署,不仅部署成本会上升,而且不同模块之间的事务也不好处理。需要使用kafka,MQ等实现不同应用之间的事务一致性。部分企业在内网部署系统,不便增加告警消息。如果有服务器出现告警,不能提前预知,在运维上压力较大。所以考虑能不能用一种简单高效的方式,在一个应用中把所有模块加载起来,简单高效,使其共用一个JVM,在JVM内存中开辟一块公共的内存空间,把各个模块中相同的代码部分,存储在公共的内存空间,供其他模块调用。
JVM的组成:JVM由类加载器子系统、运行时数据区、执行引擎以及本地方法接口组成。JVM(Java虚拟机)是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
基于JVM共享机制的事务处理方法应运而生,主要解决以下问题:
(1)在一个应用中加载多个模块,不用多机部署,减轻运维压力降低成本。
(2)各模块公用一个JVM,一个ClassLoader。
(3)实现模块之间调用的事务一致性处理。
发明内容
本发明目的是,提出一种基于JVM共享机制的事务处理方法应运而生,主要解决以下问题:(1)在一个应用中加载多个模块,不用多机部署,减轻运维压力降低成本。(2)各模块公用一个JVM,一个ClassLoader。(3)实现模块之间调用的事务一致性处理。
本发明的技术方案为:一种基于JVM共享机制的事务处理方法,在一个应用中加载多个(二个以上)应用模块时,多个(二个以上)应用模块(如模块A和模块B)中的公共子模块部分提取出来,在JVM中开辟一块公共内存空间存储公共子模块,这样A和B公共资源只要加载一次,多个(二个以上)应用模块共用一个类加载器;提高加载效率。
具体包括:以(应用模块)jetty容器举例(其他的应用模块如tomcat等容器原理一样)在启动时,把当前线程的类加载器ClassLoader放到java.lang.ClassLoader中,为每一个模块创建一个war包(jetty容器的context)。在各模块中的lib包下面的jar包,或各项目中的class类,都被认为是公共域中的内容,都放到一个公共的java.lang.ClassLoader中。公共的ClassLoader取值是,如果当前线程中有ClassLoader就取当前线程的,如果取不到就取jetty容器的ClassLoader。
重写类加载器的loadClass方法,优化其加锁的方式。否则容易产生共享内存并发加载类时的死锁问题,加载类时用公共类加载器的父类进行加载。在递归调用findClass方法时不能加锁,不然会引起死锁。
继承DataSourceTransactionManager类重写其中的setDataSource(),doBegin(),doCommit()等方法。因为切面类是个全局单例,导致各个模块在启动之后,只保留了最后一次的事务管理器类,导致前面的所有事务控制失效。所以,这里使用线程安全管理的方式实现多环境的事务共存。这样就能实现在基于微服务架构的项目中不使用消息中心,确保事务的一致性。
与现有技术相比,本发明的有益效果:
(1)本发明在软件本地部署的情况下,不需要使用额外的中间件,实现多模块之间的事务控制。只需要一台服务器启动一个应用就可以实现软件的运行。(2)本发明减轻的软件本地部署时运维负担,简单高效。
附图说明
图1为本发明涉及的实施例中。模块A和模块B中的公共部分涉及的JVM共享机制的事务处理的框架示意图;模块A和模块B中的公共部分提取出来,在JVM中开辟一块公共内存空间的空间,这样A和B公共资源只要加载一次,A和B共用一个类加载器,提高加载效率。
具体实施方式
下面结合附图和示例性实施例对本发明作进一步的说明:
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,对本发明进一步详细说明。
以(应用模块)jetty容器举例(其他的应用模块如tomcat等容器原理一样)在启动时,把当前线程的类加载器ClassLoader放到java.lang.ClassLoader中,为每一个模块创建一个war包(jetty容器的context)。在各模块中的lib包下面的jar包,或各项目中的class类,都被认为是公共域中的内容,都放到一个公共的java.lang.ClassLoader中。公共的ClassLoader取值是,如果当前线程中有ClassLoader就取当前线程的,如果取不到就取jetty容器的ClassLoader。
在java.lang.ClassLoader的loadClass方法中,先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass方法进行加载。
重写类加载器的loadClass方法,因为要把jar包共享,所以所有的jar包都在common里面,在common中查找,找不到先不报错。再调用Webapp的Classloader查找逻辑,再调用findClass的方法时,这个方法不(能)加锁,否则容易在递归调用中死锁。
继承DataSourceTransactionManager类重写其中的setDataSource()方法,使用线程池的方式保证每个模块的DataSource是独立且安全,且在Common层面共享并统一处理,从而达到共用和一致性。重写doBegin()方法,找到每个模块对应的DataSource,获取当前模块对应的事务,并获取当前模块对应的数据库连接。重写doCommit()方法,获取当前模块对应的事务,进行提交。因为切面类是个全局单例,导致各个模块在启动之后,只保留了最后一次的事务管理器类,导致前面的所有事务控制失效。所以,这里使用线程安全管理的方式实现多环境的事务共存。这样就能实现在基于微服务架构的项目中不使用消息中心,确保事务的一致性。
以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。
Claims (6)
1.一种基于JVM共享机制的事务处理方法,其特征是,在一个应用中加载二个以上应用模块时,二个以上应用模块中的公共子模块部分提取出来,在JVM中开辟一块公共内存空间存储公共子模块,这样A和B公共资源只要加载一次,二个以上应用模块共用一个类加载器;
具体步骤如下:当一个应用模块在启动时,把当前线程的类加载器ClassLoader放到java.lang.ClassLoader中,为这个模块创建一个war包;在其它模块中的lib包下面的jar包,或各项目中的class类,都被认为是公共域中的内容,都放到一个公共的java.lang.ClassLoader中;公共的ClassLoader取值是,如果当前线程中有ClassLoader就取当前线程的,如果取不到就取jetty容器的ClassLoader。
2.根据权利要求1所述的基于JVM共享机制的事务处理方法,其特征是,重写类加载器的loadClass方法,加载类时用公共类加载器的父类进行加载。
3.根据权利要求1所述的基于JVM共享机制的事务处理方法,其特征是,继承DataSourceTransactionManager类重写其中的setDataSource(),doBegin(),doCommit()等方法;这里使用线程安全管理的方式实现多环境的事务共存;这样就能实现在基于微服务架构的项目中不使用消息中心,确保事务的一致性。
4.根据权利要求1所述的基于JVM共享机制的事务处理方法,其特征是,在java.lang.ClassLoader的loadClass方法中,先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass方法,若父加载器为空则默认使用启动类加载器作为父加载器;如果父加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass方法进行加载。
5.根据权利要求1所述的基于JVM共享机制的事务处理方法,其特征是,重写类加载器的loadClass方法,因为将jar包共享,所以所有的jar包都在common里面,在common中查找,找不到先不报错。再调用Webapp的Classloader查找逻辑,再调用findClass的方法时,这个方法不加锁。
6.根据权利要求3所述的基于JVM共享机制的事务处理方法,其特征是,继承DataSourceTransactionManager类重写其中的setDataSource()方法,使用线程池的方式保证每个模块的DataSource是独立且安全,且在Common层面共享并统一处理,从而达到共用和一致性;重写doBegin()方法,找到每个模块对应的DataSource,获取当前模块对应的事务,并获取当前模块对应的数据库连接。重写doCommit()方法,获取当前模块对应的事务,进行提交。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010206647.5A CN111338764B (zh) | 2020-03-23 | 2020-03-23 | 一种基于jvm共享机制的事务处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010206647.5A CN111338764B (zh) | 2020-03-23 | 2020-03-23 | 一种基于jvm共享机制的事务处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111338764A true CN111338764A (zh) | 2020-06-26 |
CN111338764B CN111338764B (zh) | 2023-06-30 |
Family
ID=71184305
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010206647.5A Active CN111338764B (zh) | 2020-03-23 | 2020-03-23 | 一种基于jvm共享机制的事务处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111338764B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7814472B2 (en) * | 2005-09-12 | 2010-10-12 | Oracle International Corporation | System and method for shared code-sourcing in a Java Virtual Machine environment |
CN104731634A (zh) * | 2013-12-24 | 2015-06-24 | 珠海世纪鼎利通信科技股份有限公司 | 一种实时在线的分布式计算框架的实现方法 |
-
2020
- 2020-03-23 CN CN202010206647.5A patent/CN111338764B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7814472B2 (en) * | 2005-09-12 | 2010-10-12 | Oracle International Corporation | System and method for shared code-sourcing in a Java Virtual Machine environment |
CN104731634A (zh) * | 2013-12-24 | 2015-06-24 | 珠海世纪鼎利通信科技股份有限公司 | 一种实时在线的分布式计算框架的实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111338764B (zh) | 2023-06-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6134594A (en) | Multi-user, multiple tier distributed application architecture with single-user access control of middle tier objects | |
US7191441B2 (en) | Method and apparatus for suspending a software virtual machine | |
US8819673B1 (en) | Systems and methods for java virtual machine management | |
CN101615138B (zh) | 维持对象的锁的乐观平衡同步的状态信息的方法、设备和系统 | |
US7546593B2 (en) | Common class loaders | |
US8141070B2 (en) | Bridging class loader name spaces | |
US20100083219A1 (en) | Runtime Object Composition | |
CN102422261A (zh) | 对所引起的异常的通知 | |
US20240078116A1 (en) | Just-in-Time Containers | |
CN101095111A (zh) | 一种维护计算装置中的应用程序的方法 | |
US11200085B2 (en) | Sharing transaction contexts in an optimized colocation of java and non-java language applications | |
US20220326981A1 (en) | Systemic extensible blockchain object model comprising a first-class object model and a distributed ledger technology | |
US20220083364A1 (en) | Reconciler sandboxes for secure kubernetes operators | |
CN106850650B (zh) | 用于游戏客户端访问数据的方法及客户端游戏系统 | |
US8924947B2 (en) | Direct deployment of static content | |
US20020174161A1 (en) | Java startup wrapper | |
JP5225071B2 (ja) | 埋め込みシステム、特にスマートカードにロードされる疑似コードの検証方法 | |
US7555746B2 (en) | System and method for registering native libraries with non-native enterprise program code | |
US9606846B2 (en) | System and method for dynamic proxy generation | |
US20070168509A1 (en) | System and method for remote loading of classes | |
CN111338764B (zh) | 一种基于jvm共享机制的事务处理方法 | |
CN108228266A (zh) | 一种Android插件框架下不同插件间启动Fragment组件的方法和装置 | |
US6901589B2 (en) | System and method for determining a root cause of a failure | |
CN112035192B (zh) | 支持组件热部署的Java类文件加载方法及装置 | |
EP2601627B1 (en) | Transaction processing system and method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |