JPA、EJB、事物管理、WebSphere ---相关内容整理
目錄
1.前言
■實現(xiàn)原理:容器管理事務
■代碼實現(xiàn)簡單描述:
2.EJB 標簽
2.1.EJB中的有狀態(tài)與無狀態(tài)( @stateless/@stateful )
2.1.@Stateless 與 @ApplicationScoped
2.JPA
■定義
■1.1.配置文件? ---??persistence.xml?
?1.1.1.配置文件? ---??persistence.xml? --- 中指定數(shù)據(jù)源
■1.2.OSS jar ?
■1.3.一些JPA的類(舉例)
■1.4. jpa 框架在實體類(Entity)中添加非數(shù)據(jù)庫字段的屬性---@Transient
■1.5. JPA 原生配置
■1.6. EntityManager 管理事務
■1.7.ORM框架
■1.8.javax.persistence
■1.9.transaction-type
■1.10.JTA 與 RESOURCE_LOCAL 之間的區(qū)別
■1.11.JPA原生代碼
■1.12.關于【persistence.xml】 中的【transaction-type】
■1.13.?關于【persistence.xml】 中的【shared-cache-mode】
■1.14.JPA介紹
■1.15.JPA原生代碼
■1.16.xx
■1.17.xx
■1.18.xx
■1.19.xx
2.EJB-事務管理
2.1.EJB默認事物
2.2.EJB的事務管理分如下兩個方面
2.3.容器管理事務
3.WebSphere架構
?cell,node,server,app
?Cluster
4.WebSphere常用功能呢
【システム管理】
?查看部署的主機的信息
【セキュリティ】【証明書】
?客戶端證明書
【故障檢修】【トラブルシューティング】
?查看Cell,Node,Server的構造--- ?【樹形結構】
?查看jar加載順序
【アプリケーション】【Application】
?查看Application的數(shù)據(jù)源?(比如 JNDI)
?查看Application的EJB?
( ↑ ★ EJB中的各個方法,都是一個事物,中間處理出錯,可以回滾 ★)
?查看Cluster
?查看所有的Application
?查看所有的Application部署的位置(Context root) 上下文
?查看Application發(fā)布的位置
?配布した後の資材の構造 (赤字は固定)
?查看引用的資源文件(配置文件)
【リソース】
?指定配置文件(資源文件)的位置
【服務】【サーバー】
?查看Server,Node,Cluster的構造--- 【一覽表】
?查看Server的JDK版本
?查看Server的端口號
?查看Server上面部署的App
?查看Server上面部署的App的資源情報(比如 JNDI)
■5.WebSphere 錯誤調查
5.1. Failed to load webapp: Context root /xxx/***
5.2.openjpa-2.2.3-SNAPSHOT-r422266:1764177 nonfatal store error
└org.apache.openjpa.persistence.EntityNotFoundException
最終解決2:清空緩存
5.3.org.apache.openjpa.lib.jdbc.ReportingSQLException
5.4.XXX
5.5.XXX
【數(shù)據(jù)源】【データ?ソース】
?配置1
?配置2
■6.各種目錄
6.1.緩存目錄(實際運行目錄)
6.2.配置文件目錄
6.3.啟動Log目錄
6.4.XXX
6.5.XXX
6.6.XXX
=====
1.前言
看了一段業(yè)務對于的處理代碼,
代碼里面沒有任何事物處理的相關處理,
卻實現(xiàn)了事物功能。
■實現(xiàn)原理:容器管理事務
容器管理事務主要是通過容器自動控制事務的開啟,提交和回滾,開發(fā)人員不需要手工編寫代碼,由容器來控制事務的邊界,一般來說是業(yè)務方法的開始
■代碼實現(xiàn)簡單描述:
??代碼部署在WebSphere上
?數(shù)據(jù)庫處理在Service層中,在Sevice層中,有多個對數(shù)據(jù)庫的操作。
?是使用JPA (ORM)實現(xiàn)數(shù)據(jù)庫操作的。可以實現(xiàn)回滾功能。
?有關于JPA的配置文件??WEB-INF/classes/META-INF/persistence.xml
?JPA的配置文件中,管理事務管理方式是JTA,即是由應用程序服務器的實現(xiàn)事物管理。
? service層中,使用了一個EJB的標簽:@Stateless。
2.EJB 標簽
2.1.EJB中的有狀態(tài)與無狀態(tài)( @stateless/@stateful )
1.Stateful session bean的每個用戶都有自己的一個實例,所以兩者對stateful session bean的操作不會影響對方。另外注意:如果后面需要操作某個用戶的實例,你必須在客戶端緩存Bean的Stub對象(JSP通常的做法是用Session緩存),這樣在后面每次調用中,容器才知道要提供相同的bean實例。?
2.Stateless Session Bean不負責記錄使用者狀態(tài),Stateless Session Bean一旦實例化就被加進會話池中,各個用戶都可以共用。如果它有自己的屬性(變量),那么這些變量就會受到所有調用它的用戶的影響。?
3.從內存方面來看,Stateful Session Bean與Stateless Session Bean比較,Stateful Session Bean會消耗J2EE Server 較多的內存,然而Stateful Session Bean的優(yōu)勢卻在于他可以維持使用者的狀態(tài)。?
2.1.@Stateless 與 @ApplicationScoped
?@Stateless標注的類,會被作為EJB,在WebSphere的EJB管理中被看到
?@Stateless標注的類,因為是EJB,每一個方法,都有事務。(整個方法的開始,結束,作為一個事務被管理)
?被@Stateless 或 @ApplicationScoped 標注的類,都是被EJB容器管理的,可以在別的類中,使用@inject類,注入進來
===
2.JPA
jpa詳解_java菜鳥1的博客-CSDN博客
■定義
JPA(Java Persistence API)和JDBC類似,也是官方定義的一組接口,但是它相比傳統(tǒng)的JDBC,它是為了實現(xiàn)ORM而生的,即Object-Relationl Mapping,它的作用是在關系型數(shù)據(jù)庫和對象之間形成一個映射,這樣,我們在具體的操作數(shù)據(jù)庫的時候,就不需要再去和復雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了。
?
=========================================================
■1.1.配置文件? ---??persistence.xml?
persistence.xml ? // JPA persistence.xml
JPA persistence.xml 文件初學者指南_allway2的博客-CSDN博客_persistence.xml
persistence.xml在下面這個目錄中
WEB-INF/classes/META-INF?1.1.1.配置文件? ---??persistence.xml? --- 中指定數(shù)據(jù)源
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistencehttp://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"version="2.1"><!-- 有一個或者多個persistence-unit --><!-- transaction-type:在J2EE應用服務器中缺省為JTA(Java Transaction API),在J2SE和簡單的servlet容器中缺省為標準本地事務 RESOURCE_LOCAL。為避免歧義,我們應明確設置 --><!-- persistence-unit里面可以為空,但是如果設置,必須要順序 --><persistence-unit name="EntityMappingsTest" transaction-type="RESOURCE_LOCAL"><!-- 首先是<description>,小例子不提供 --><!-- provider:具體的javax.persistence.spi.PersistenceProvider實現(xiàn),缺省值為classpath中第一個JPA的實現(xiàn) --><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!-- 如果persistence-unit的transaction-type為JTA,使用<jta-data-source>,如果為RESOURCE_LOCAL,使用<non-jta-data-source>。他們的區(qū)別在于后者使用EntityTransaction接口,而前者使用UserTransaction接口,缺省是前者(JTA)。它們均采用JNDI(Java Naming and Directory Interface)方式,給出數(shù)據(jù)源。 --><non-jta-data-source>java:comp/env/jdbc/learnTest</non-jta-data-source><!-- <mapping-file>:基于classpath的XML mapping file,如果不指定,缺省為orm.xml,可以設置多個mapping-file --><!-- <jar-file>:JPA實現(xiàn)將對jar包進行綁定標記掃描,如果里面有@Entity,@Embeddable,@javax.persistence.MappedSuperclass或者@javax.persistence.Converter,加入本持續(xù)化單元中,可以設置多個jar-file --><!-- <class>:JPA實現(xiàn)將對這個class加入到持續(xù)化單元中,這個class必須帶有@Entity,@Embeddable,@javax.persistence.MappedSuperclass或者@javax.persistence.Converter。可以設置多個class --><!-- 設置<exclude-unlisted-classes/>或者<exclude-unlisted-classes>true</exclude-unlisted-classes>表示只關注在jar-file和在class中所設置的,不掃描其他。刪除<exclude-unlisted-classes/>或者<exclude-unlisted-classes>false</exclude-unlisted-classes>則表示將掃描classpath位置;如果本文件在JAR文件,則掃描JAR文件的classes,如果本文件位于classes中的某個特定目錄,則只掃描該目錄下的文件(例如指定到某個package)。 --><exclude-unlisted-classes>false</exclude-unlisted-classes><!-- <shared-cache-mode>:是否緩存entity,--><!-- ? NONE表示不緩存,--><!-- ? ALL表示緩存所有的entities。--><!-- ? ENABLE_SELECTIVE 表示只緩存帶有@Cacheable或者@Cacheable(true)標識的entity --><!-- ? DISABLE_SELECTIVE 表示除了@Cacheable(false)外均緩存 --><!-- ? UNSPECIFIED 表示有JPA的提供者來決定,Hibernate ORM缺省為ENABLE_SELECTIVE,但采用這種方式,對于移植可能會存在混淆,應明確設定 --><shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode><!-- <validation-mode> --><!-- ? NONE表示不使用Bean validator,--><!-- ? CALLBACK表示在寫操作(insert,update,delete)前進行validate --><!-- ? AUTO,如果classpath中存在Bean validator provider,則CALLBACK,不存在則NONE --><!-- 如果使用validate,而我們自定義了spring framework的validator,JPA將忽略這個自定義。因此建議使用NONE,在數(shù)據(jù)持久化之前進行校驗,而不是在持久化這個層面。 --><validation-mode>NONE</validation-mode><!-- <properties>以name-value的方式提供其他JPA屬性(如JDBC連接,用戶,密碼,schema產(chǎn)生成設置等)以及提供者特有的屬性(如Hibernate設置)。 --><properties><!-- 禁止schema生成,即不根據(jù)entity創(chuàng)建表格 --><property name="javax.persistence.schema-generation.database.action" value="none" /></properties></persistence-unit> </persistence>=========
JNDI
java:comp/env 是環(huán)境命名上下文(environment naming context(ENC)),是在EJB規(guī)范1.1以后引入的,引入這個是為了解決原來JNDI查找所引起的沖突問題,也是為了提高EJB或者J2EE應用的移植性。
java:comp/env/jdbc/
java:comp/env/jdbc/YourDataSourceName
https://www.cnblogs.com/dekn/archive/2006/02/14/330308.html
=========
■1.2.OSS jar ?
org.eclipse.persistence.jpa
java - 我對Maven依賴感到困惑:“org.eclipse.persistence.jpa”和“org.hibernate” | persistence
■1.3.一些JPA的類(舉例)
javax.persistence.PersistenceContext
(所屬jar ?javax.persistence-2.x.x.jar )
■1.4. jpa 框架在實體類(Entity)中添加非數(shù)據(jù)庫字段的屬性---@Transient
問:jpa表實體的字段和表的字段是一一對應的。比如,那么,如果我在查詢時,想在表字段的基礎上添加幾個返回的字段,怎么辦?
解:在實體類中添加我們想添加的字段,并加上注解:@Transient,
?
效果:這樣在調用此類返回時,便有了此字段,我們可以給這個字段賦值,進行操作,而且不會在數(shù)據(jù)庫中添加這個字段。
■1.5. JPA 原生配置
JPA原生配置和使用_Chgl16的博客-CSDN博客
■1.6. EntityManager 管理事務
import javax.persistence.EntityManager; import javax.persistence.Persistence;public class EMUtil {public static EntityManager getEM() {return Persistence.createEntityManagerFactory("hotel").createEntityManager();} }import javax.persistence.EntityManager; import javax.persistence.Persistence; import javax.persistence.Query;----
public void insertMember(Member member) {em.getTransaction().begin();em.persist(member);em.getTransaction().commit();// 僅僅一個數(shù)據(jù)庫連接,就不關了 // em.close(); }----
import javax.persistence.*;@Entity @Table(name = "member") public class Member {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private int id;private String phone;private String identity;private String username;private String password;/** getter and setter **/ }----
■1.7.ORM框架
JPA(Java Persistence API), JPA是一個ORM的標準規(guī)范,而不是一個具體的ORM框架
? ? ( ?ORM(object relation mapping) 對象關系映射關系 ,面向對象的對象模型和關系型數(shù)據(jù)之間的相互轉換。)
介紹幾種ORM框架_火腿編程的博客-CSDN博客
?Hibernate: Hibernate是一個全自動的ORM模型,Hibernate可以自動生成SQL語句,自動執(zhí)行。
?MyBatis:MyBatis是一款半自動的ORM模型,它支持定制化 SQL、存儲過程及高級映射。
?【javax.persistence-2.x.x.jar】或【javaee-web-api-7.0.jar】中的接口,類
javax.persistence.Query和javax.persistence.EntityManager都是JAP發(fā)布的接口,是用于對象持久化API。
使用,[em.createNativeQuery(sql);]創(chuàng)建Query
■1.8.javax.persistence
javax.persistence.Persistence - JPA class
■1.9.transaction-type
?JPA 事務策略,它可以采用以下兩個值之一:
?JTA
?RESOURCE_LOCAL
如果您使用的是 JTA,您可以使用jta-data-source為關聯(lián)的 JTA 指定 JNDI 名稱DataSource,
而對于RESOURCE_LOCAL,您需要使用non-jta-data-source.
?
■1.10.JTA 與 RESOURCE_LOCAL 之間的區(qū)別
JPA實現(xiàn)可以選擇自己管理事務(RESOURCE_LOCAL),還是由應用程序服務器的JTA實現(xiàn)對其進行管理。
在大多數(shù)情況下,RESOURCE_LOCAL可以。這將使用基本的JDBC級事務。缺點是該事務對于JPA持久性單元而言是本地的,因此,如果您想要一個跨多個持久性單元(或其他數(shù)據(jù)庫)的事務,則RESOURCE_LOCAL可能不夠好。
JTA還用于跨JMS和JCA之類的系統(tǒng)管理事務,但這對我們大多數(shù)人來說是相當奇特的用法。
要使用JTA,您需要在應用程序服務器中對其進行支持,并且還需要JDBC驅動程序的支持
■1.11.JPA原生代碼
【JAVA】-【JPA】-orm思想及jpa配置_劉曉偉-liu的博客-CSDN博客
■1.12.關于【persistence.xml】 中的【transaction-type】
默認值
?(屬性)使用的事物類型。
?有兩種:JTA和RESOURCE_LOCAL(在J2EE環(huán)境中默認是【JTA】,而在J2SE環(huán)境中默認是【RESOURCE_LOCAL】)。
?當使用的是jta數(shù)據(jù)源時,默認的事物類型是JTA,如果使用的不是jta數(shù)據(jù)源時,默認的事物類型就是RESOURCE_LOCAL。
內容說明
比較RESOURCE_LOCAL和JTA持久性上下文
==========
使用<persistence-unit transaction-type =“RESOURCE_LOCAL”> 您負責EntityManager(PersistenceContext / Cache)創(chuàng)建和跟蹤...
-----
您必須使用EntityManagerFactory來獲取EntityManager
生成的EntityManager實例是 PersistenceContext / Cache
EntityManagerFactory只能通過@PersistenceUnit注釋注入(不是@PersistenceContext)
不允許使用@PersistenceContext來引用RESOURCE_LOCAL類型的單元
您必須使用EntityTransaction API開始/提交對EntityManger的每次調用
兩次調用entityManagerFactory.createEntityManager()會導致兩個獨立的EntityManager實例,從而產(chǎn)生兩個獨立的PersistenceContexts / Caches。
使用多個EntityManager 實例 幾乎絕不是一個好主意(除非你已經(jīng)破壞了第一個實體 ,否則不要創(chuàng)建第二個實例 )
==============
使用<persistence-unit transaction-type =“JTA”> CONTAINER將執(zhí)行EntityManager(PersistenceContext / Cache)創(chuàng)建和跟蹤...
-----
您不能使用EntityManagerFactory來獲取EntityManager
您只能獲取容器提供的EntityManager
可以通過@PersistenceContext注釋注入EntityManager (不是@PersistenceUnit)
您不能使用@PersistenceUnit來引用JTA類型的單位
容器給出的EntityManager是對與JTA事務關聯(lián)的PersistenceContext / Cache的引用 。
如果沒有正在進行的JTA事務, 則無法使用 EntityManager,因為沒有PersistenceContext / Cache。
具有EntityManager引用到同一事務中 相同單元的每個人都將自動引用相同的PersistenceContext / Cache
在JTA 提交時刷新并清除PersistenceContext / Cache
自己負責創(chuàng)建 EntityManager
======================================
package com.dmsd.test;import com.dmsd.jpa.Customer; import org.junit.jupiter.api.Test;import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence;public class jpaTest1 {/*** 測試jpa保存* jpa操作步驟* 1、加載配置文件創(chuàng)建工程對象* 2、通過實體管理類工程獲取實體管理器* 3、開啟事務* 4、完成CRUD* 5、提交事務-回滾事務* 6、釋放資源*/@Testpublic void testSave(){//加載配置文件EntityManagerFactory factory= Persistence.createEntityManagerFactory("myjpa");//參數(shù)為配置文件中的持久化單元名稱//通過實體管理器工廠獲取實體管理器EntityManager em = factory.createEntityManager();//獲取事務對象,開啟事務EntityTransaction tx = em.getTransaction();//獲取事務對象tx.begin();//開始事務//完成增刪改查操作Customer customer=new Customer();customer.setCustName("test201127");customer.setCustINdustry("beijing");customer.setCustAddress("111");customer.setCustLevel("1");customer.setCustPhone("029833904");customer.setCustSource("333");//保存em.persist(customer);//將實體保存到數(shù)據(jù)表中//提交事務tx.commit();//釋放資源em.close();//釋放實體管理器factory.close();//釋放工廠} }自己負責創(chuàng)建時的persistence.xml文件。(要放到main下面的【src/resources】的【META-INF】目錄下面)?
main
? └java
? └resources
? ? ? ??? └META-INF
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <!--配置persistence-unit節(jié)點稱為持久化單元name:持久化單元名稱transaction-type:事務管理的方式JTA:分布式事務管理RESOURCE_LOCAL:本地事務管理 --><persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL"><!-- 配置jpa實現(xiàn)方式--><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><properties><!-- 配置數(shù)據(jù)庫信息用戶名:javax.persistence.jdbc.user密碼: javax.persistence.jdbc.password驅動: javax.persistence.jdbc.driver數(shù)據(jù)庫地址: javax.persistence.jdbc.url--><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="root"/><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><!-- value中:mysql:///代表本地mysql數(shù)據(jù)庫-3306端口。jpa代表數(shù)據(jù)庫名 --><property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/><!-- 可選配置,配置jpa實現(xiàn)方的配置信息顯示sql: false|true true為顯示數(shù)據(jù)庫表,false為不顯示數(shù)據(jù)庫表自動創(chuàng)建數(shù)據(jù)庫表: hibernate.hbm2ddl.auto可選值:create:程序運行時創(chuàng)建數(shù)據(jù)庫,如果有表先刪除在創(chuàng)建update:程序運行時創(chuàng)建表,如果有表,不會創(chuàng)建表none:不會創(chuàng)建表--><property name="hibernate.show_sql" value="true"/><property name="hibernate.hbm2ddl.auto" value="update"/></properties></persistence-unit> </persistence>======================================
■1.13.?關于【persistence.xml】 中的【shared-cache-mode】
https://www.cnblogs.com/zr520/p/5024127.html
■1.14.JPA介紹
https://localhost01.blog.csdn.net/article/details/83422893
===
https://www.cnblogs.com/zhuxiang1029/p/14900749.html
■1.15.JPA原生代碼
【JAVA】-【JPA】-orm思想及jpa配置_劉曉偉-liu的博客-CSDN博客
■1.16.xx
xxx
■1.17.xx
xxx
■1.18.xx
xxx
■1.19.xx
xxx
=========================================================
2.EJB-事務管理
2.1.EJB默認事物
EJB--事務管理 ._51CTO博客_ejb服務
@TransactionManagement(TransactionManagementType.CONTAINER)
表示指定事務的類型。如果省略,默認為CMT方式。
?
2.2.EJB的事務管理分如下兩個方面
1、CMT(容器管理事務)(默認)
2、BMT(Bean管理事務)
EJB事務控制(CMT和BMT兩種方式以及JTA事務) - 姜師爺闖世界 - 博客園
2.3.容器管理事務
容器管理事務主要是通過容器自動控制事務的開啟,提交和回滾,開發(fā)人員不需要手工編寫代碼,由容器來控制事務的邊界,一般來說是業(yè)務方法的開始
================================
15.
3.WebSphere架構
?cell,node,server,app
基本結構:單元(cell) ——> 多個節(jié)點(node) ——> 多個服務(server) ——> 多個應用(app)
WebSphere8集群配置_websphere集群配置共享庫_chjttony的博客-CSDN博客
?單元Cell:整個分布式網(wǎng)絡中一個或多個節(jié)點的邏輯分組,是一個管理上的概念, 是管理員將節(jié)點間邏輯關聯(lián)起來的實現(xiàn)方法, 可以將單元看作是WAS最大的作用域
?節(jié)點Node:是受管服務器(Server)的邏輯分組, 節(jié)點通常與具有唯一IP主機地址的邏輯或物理計算機系統(tǒng)對應, 節(jié)點不能跨多臺計算機,它也是管理使用上的概念
?服務Server:Application Server Instance,即實際部署應用的地方,在ND版本中一個節(jié)點
可能有多個Server,但非ND版本(Single Server版本),一個節(jié)點只能使用一個Server
?Cluster
對WebSphere中Cell、Node、Server、Node Agent、Cluster 的理解_websphere cluster_仁王_雅治的博客-CSDN博客
?Cluster(集群)是一組Server的集合,通常這些Server在一起處理同一類業(yè)務請求。集群負責平衡服務器之間的工作負載。當在集群上安裝應用程序時,會在每個集群成員上自動安裝此應用程序。
?===
====
4.WebSphere常用功能呢
【システム管理】
?查看部署的主機的信息
一個節(jié)點下面,有多個Node (ノード)
? ? ? 一個Node,? ? ? 對應i1個【XXXXCell_XXX_dmger】,即DM(Deployment Manager)
? ? ? 一個Node,? ? ? 對應多1個主機(Host)
? ? ? 一個Node(1個主機),? ? ? 對應多個 服務(Server)
【システム管理】----【Cell】【Node】【Host】
?セル
└ノード
└XXXXCell_XXX_dmgr
└XXXXCell_node01
└XXXXCell_node02
★ 在這個,可以查看節(jié)點對應的 ?【host名】
?
【セキュリティ】【証明書】
?客戶端證明書
?セキュリティ
└SSL証明書および鍵管理
└エンドポイント?セキュリティ構成の管理
インバウンド
XXXCell
nodes
XXXnodes
XXXnodes
XXXnodes●
Servers
XXX Servers1
XXX Servers2
XXX Servers3
clusters
XXXCluster
XXXCluster
XXXCluster
アウトバウンド
XXXCells
nodes
XXXnodes
XXXnodes
XXXnodes
clusters
XXXCluster
XXXCluster
XXXCluster
●?鍵ストアおよび証明書
└CellDefaultKeyStore
└CellDefaultTrustStore
└NodeDefaultKeyStore ?
└NodeDefaultTrustStore●●
●●?個人証明書
?
====================
【故障檢修】【トラブルシューティング】
?查看Cell,Node,Server的構造--- ?【樹形結構】
【トラブルシューティング】 ( trouble shooting 故障檢修)
?サーバー?ローダー?ビューアー
?XXXCell
└【ノード】
└XXX Node1
└【サーバー】
└XXX Server1
└XXX Server2
└XXX Node2
?查看jar加載順序
websphere7.0 jar包沖突解決辦法,類加載順序-蒲公英云
【トラブルシューティング】 // 故障檢修
?クラス?ローダー?ビューアー
?Cell
?ノード
?サーバー
?XXXServer
?アプリケーション
?YourApplication
?ClassLoader - 検索順序
1.
2.
3.
4.
..
n.工程的目錄 // 工程的下面的jar是最后被加載的。
シューティング 【名】【英】shooting 射擊
==============================
【アプリケーション】【Application】
?查看Application的數(shù)據(jù)源?(比如 JNDI)
【アプリケーション】
?すべてのアプリケーション
?YourApplicationName
javax.sql.DataSource
【ターゲット?リソースJNDI名】的部分 ?
//jdbc/xxxDB ? ? ?// 可以在數(shù)據(jù)源配置中,查到這個
【リソース參照】的部分 ? ? ? ? ? ? ? ? ? ? ? ? ??
//jdbc/xxxSchema ?// ? ? 在數(shù)據(jù)源配置中,查不到這個,是數(shù)據(jù)庫的Schema
?查看Application的EJB?
【アプリケーション】
?すべてのアプリケーション
?YourApplicationName
?ビジネス?インターフェースを持つエンタープライズBean
( ↑ ★ EJB中的各個方法,都是一個事物,中間處理出錯,可以回滾 ★)
?查看Cluster
【アプリケーション】
?すべてのアプリケーション
?YourApplicationName
└ターゲット特定アプリケーションの狀況
↑ここで、所屬のClusterが表示あれる。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xxxClusterX
?查看所有的Application
【アプリケーション】
?すべてのアプリケーション
?YourApplicationName
?XXX。。。
? ↑ 部分Application在這里并沒有顯示
?アプリケーション?タイプ
?WebSphere エンタープライズ?アプリケーション
?YourServerName
?XXX。。。
↑ 這里可以查看所有的Application
?查看所有的Application部署的位置(Context root) 上下文
【アプリケーション】
?アプリケーション?タイプ
?WebSphere エンタープライズ?アプリケーション
?YourServerName
?「Web モジュールのコンテキスト?ルート」
↑ 可以看到Context root情報「/xxx/」路徑
?查看Application發(fā)布的位置
【アプリケーション】
?アプリケーション?タイプ
?WebSphere エンタープライズ?アプリケーション
?YourServerName
?詳細プロパティー
?アプリケーション?バイナリ
↑ * ロケーション(絶対パス)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?【/Apl/XXSystem/installedApps/】
?配布した後の資材の構造 (赤字は固定)
/Apl/XXSystem/installedApps
└YourEarName-editionYourEditionName.ear
? ? ? ?└META-INF
? ? ? ?└YourEarName.war
? ? ? ? ? ?└META-INF
? ? ? ? ? ? ? ? ? └persistence.xml // (JPAの配置ファイル)
? ? ? ? ? ?└WEB-INF
? ? ? ? ? ? ? ? └classes
? ? ? ? ? ? ? ? └lib
? ? ? ? ? ? ? ? └*.xml
?查看引用的資源文件(配置文件)
【アプリケーション】
?アプリケーション?タイプ
?WebSphere エンタープライズ?アプリケーション
?YourServerName
?參照
?リソース參照
==============================
【リソース】
?指定配置文件(資源文件)的位置
【リソース】 (指定配置文件(資源文件)的位置)
└URL
xxxx.properties ファイル Location
file:///AAA/BBB/xxxx.properties
==============================
【服務】【サーバー】
?查看Server,Node,Cluster的構造--- 【一覽表】
可以通過 在【アプリケーション】找到的?xxxClusterX,在這里找到對應的?xxxxServer X
サーバー
?すべてのサーバー
顯示了下面的信息
==============
名前(Server)、ノード、クラスター名、狀況、保守モード、バージョン、。。。
xxxxServer X? ? ?? ? ? ? ? ? ? ? ? ??xxxClusterX
==============
?查看Server的JDK版本
【サーバー】
?すべてのサーバー
?YourServerName
?Java SDK
?查看Server的端口號
【サーバー】
?すべてのサーバー
?YourServerName
?通信
?ポート
?WC_defaulthost(應用程序訪問端口)
?查看Server上面部署的App
【サーバー】
?すべてのサーバー
?YourServerName
?インストール済みアプリケーション
(一個Server上面,可以部署多個App,多個App使用同一個端口號)
10.123.123.126:12006/web1
10.123.123.126:12006/web2
10.123.123.126:12006/web3
?查看Server上面部署的App的資源情報(比如 JNDI)
【サーバー】
?すべてのサーバー
?YourServerName
?インストール済みアプリケーション
?YourApplicationName
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?リソース參照
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?└「javax.sql.DataSource 」的部分 ?
? ? ? ? ? └【リソース參照】的部分 ? ? ? ? ? ? ? ? ? ? ? ? ??
?//jdbc/xxxSchema ?// ? ? 在數(shù)據(jù)源配置中,查不到這個,是數(shù)據(jù)庫的Schema
? ? ? ? ? └【ターゲット?リソースJNDI名】的部分 ?
? //jdbc/xxxDB ? ? ?// 可以在數(shù)據(jù)源配置中,查到這個
===
■5.WebSphere 錯誤調查
5.1. Failed to load webapp: Context root /xxx/***
Caused by: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Context root /xxx/*** is already bound. Cannot start application ideal。
原因:
Application中,「コンテキスト?ルート」這里、可以查看路徑「/xxx/」
有別的Application也使用了這個「/xxx/」路徑。
停止占用了這個「コンテキスト?ルート」的Application即可。
===
5.2.openjpa-2.2.3-SNAPSHOT-r422266:1764177 nonfatal store error
└org.apache.openjpa.persistence.EntityNotFoundException
前言:新增了一個EJB
===
org.apache.openjpa.persistence.EntityNotFoundException
タイプ "xxxxx.xxxx.xxxx.XXXEntity"、oid "A12345" のインスタンスは、データ?ストアにもう存在していません。これは別のトレサビリティでそのインスタンスを削除したが、キャッシュされたものがこのコンテキストにまだ含まれることを意味している可能性があります。
FailedObject:xxxxx.xxxx.xxxx.XXXEntity-A12345
oid "A12345" : 是查詢的表的主鍵的值。
=====
原因:執(zhí)行了2次查詢,
? ? ? ? ? 第一次查詢時,使用的是代碼的SQL (Schema666),對應的表中有數(shù)據(jù)。
? ? ? ? ? 第二次查詢,是框架自己的查詢 (Schema Default),對應的表中,沒有數(shù)據(jù)。
所以,在錯誤信息中,才會出現(xiàn)事務相關的信息。
(臨時解決:
? ? ? 發(fā)布時,對應數(shù)據(jù)庫關聯(lián)的 Entity, 指定Schema666,這樣第二次查詢時,和第一次查詢時,就是同一個Schema了。
? ? @Table(name=“xxxxx”, schema="Schema666"))
=====
===
嘗試解決1:(看看有沒有主表,子表直接的關系。)
?===?===?===?===?===?===?===?===
javax.persistence.EntityNotFoundException: Unable to find 某個類 with id?
原因:
無論是@OneToOne 還是@ManyToOne,出現(xiàn)這個原因都是因為子表(被關聯(lián)表)中沒有主表(關聯(lián)表)中ID所對應的記錄。
解決辦法:
檢查為什么子表中沒有主表中ID對應的記錄
如果子表中沒有主表ID對應的記錄也可以正常加載數(shù)據(jù),那么需要在主表字段上加一個@NotFound Annotation。示例如下:
@OneToOne(optional=true )
@JoinColumn(name="UserId ",insertable=false, updatable=false)
@NotFound(action=NotFoundAction.IGNORE)
private UserId userId;
這樣,當子表中沒找到數(shù)據(jù)時,主表中對應的field就是null,而不會報錯了。
嘗試失敗,定義的表結構,根本沒有主表,子表的關聯(lián)。
補足說明:主表和子表
====
補足說明:DB2中,創(chuàng)建外鍵約束
-- 創(chuàng)建測試主表. ID 是主鍵.CREATE TABLE test_main ( ?id ? ? ?INT ? NOT NULL, ?value ? VARCHAR(10), ?PRIMARY KEY(id) ?);
-- 創(chuàng)建測試子表. CREATE TABLE test_sub ( ?id ? ? ?INT ?NOT NULL, ?main_id INT , ?value ? VARCHAR(10), ?PRIMARY KEY(id) ?)
-- 插入測試主表數(shù)據(jù).INSERT INTO test_main(id, value) VALUES (1, 'ONE');INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入測試子表數(shù)據(jù).INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
默認外鍵約束方式
db2 => ALTER TABLE test_sub ADD CONSTRAINT main_id_cons ?FOREIGN KEY (main_id) ?REFERENCES ?test_main;
?===?===?===?===?===?===?===?===
嘗試解決2:
=================================
下面的鏈接中,雖然出現(xiàn)的和我是同樣的錯誤,但是,他的錯誤應該是子表造成的。
java - OpenJPA : Cascade Delete issue - Stack Overflow
===
//Parent @Entity @Table(name = "PARENT") public class Parent implements Serializable { private static final long serialVersionUID = 1L;@Id @Column(name = "PRIMARY_ID", updatable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer primaryID;@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, targetEntity = Child.class) private List<Child> child;//Child@Entity @Table(name = "CHILD") public class Child implements Serializable {private static final long serialVersionUID = 1L;@EmbeddedId private ChildPK id;@MapsId("primaryID") //Maps to primaryID in ChildPK @ManyToOne @JoinColumn(name = "PRIMARY_ID",nullable=false) private Parent parent;public Child() { }===
public static void main(String[] args) {EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-test");EntityManager entityManager = entityManagerFactory.createEntityManager();Parent parent = entityManager.find(Parent.class, 15149);entityManager.getTransaction().begin();entityManager.remove(parent);entityManager.getTransaction().commit(); }===
下面只是一個類似的例子,我本次遇到的問題,并沒有出現(xiàn)【RollbackException】異常
Exception in thread "main" <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal store error> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back. ?See the nested exceptions for details on the errors that occurred.FailedObject: com.entity.test.Parent -15149
? ? at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:594)
? ? at com.test.Test.main(Test.java:76)
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal general error> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back. ?See the nested exceptions for details on the errors that occurred.
FailedObject: com.entity.test.Parent-15149
? ? at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2352)
? ? at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2189)
? ? at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2087)
==========================================
最終解決1:
更換了一個IT環(huán)境,問題就解決了。。。(并非徹底解決,之前的一個環(huán)境廢掉了。。。)
最終解決2:清空緩存
/xxx/yourInstallFolder/WebSphere/AppServer/profiles/yourWebSphereApplication/config/cells/YourCellName/applications/yourApplicationName
刪除:yourApplicationName? 目錄,重新啟動WebSphere的Application,問題解決
?===
5.3.org.apache.openjpa.lib.jdbc.ReportingSQLException
前言:在數(shù)據(jù)庫中,添加了幾個字段,然后新增查詢,更新處理。
===
org.apache.openjpa.lib.jdbc.ReportingSQLException: 使用されているコンテキストで、"T0.NewColumn"は無効です。. SQLCODE=-206,SQLSTATE=42703.
"NewColumn" :テーブルで、新規(guī)追加のColumn
com.ibm.db2.jcc.am.SqlException:。。。エラー関連えて戻された情報 SQLCODE=-206,SQLSTATE=42703. およびメッセージトークン "XXXXX_ID"が含まれています。.SQLCODE=-727,SQLSTATE=56098.
===
下面這篇文字也是類似的錯誤。(但是我新增的字段,都是用大寫定義的呀!)
DB2 SQLCODE=-206, SQLSTATE=42703 定義表字段問題_sqlcode -206_dearbaba_8520的博客-CSDN博客
"STATUS" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=3.53.71
?更多例外 ... An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-206", SQLSTATE "42703" and message tokens "STATUS".. SQLCODE=-727, SQLSTATE=56098, DRIVER=3.53.71
======
執(zhí)行SQL文時總是報這個錯誤,原因是:
在DB2中,默認情況下所有的名稱都可包含一下字符:A-Z(大寫) 0到9? @、#、$和_(下劃線) 名稱不能以數(shù)字和下劃線開頭。
數(shù)據(jù)庫對象的表,其命名遵循以上規(guī)則,所以即使利用命令創(chuàng)建表時,使用的是小寫,DB2仍會將其轉換為大寫。
但需要注意的是,并非db client軟件也會自動轉換,我在使用ibm data studio4或Aqua data studio等客戶端時,發(fā)現(xiàn)統(tǒng)計studio 提供的圖形界面創(chuàng)建,并不能自動轉換為大寫,
比如使用studio創(chuàng)建表時將字段定義為小寫的status,這樣再使用普通的SQL語句操作,例如:
select * from LARGE_RECEIPT where status='E' 就會報錯
解決方法:定義時用大寫字母
=====
【TODO】解決:。。。
5.4.XXX
xxx
5.5.XXX
xxx
【數(shù)據(jù)源】【データ?ソース】
?配置1
websphere環(huán)境下JPA多對多時關閉result set-百度經(jīng)驗
?配置2
xxx
========================
■6.各種目錄
6.1.緩存目錄(實際運行目錄)
/app/WebSphere/AppServer/profiles/AppSrv01/config/cells/YDZYTNode01Cell/applications/yourApplicationName
/xxx/yourInstallFolder/WebSphere/AppServer/profiles/yourWebSphereApplication/config/cells/YourCellName/applications/yourApplicationName
===
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01
===
6.2.配置文件目錄
=====
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/nodes/DefaultNode01
=======
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/nodes/DefaultNode01/servers/server1
====
6.3.啟動Log目錄
/Logs/IMB/was/YourCell/YourServer/SystemOut.log
6.4.XXX
xxx
6.5.XXX
xxx
6.6.XXX
=====
總結
以上是生活随笔為你收集整理的JPA、EJB、事物管理、WebSphere ---相关内容整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于如何画对偶图
- 下一篇: HTML——表白树动画