Java 在处理BLOB字段时,如何提高EclipseLink的性能?
由于每个实体都有BLOB字段,我的Java应用程序变得非常慢。此字段通常用于存储PDF文件,每当我必须列出所有对象时,持久性提供程序需要花费相当长的时间才能完成其工作。我在寻找如何处理此类数据的答案,但其中一些人谈到将BLOB存储在单独的表中,然后使用FetchType.LAZY。是否有任何方法仅在需要时获取此字段,而不必创建另一个表?如果不是,创建另一个表是否是最合适的解决方案 实体代码Java 在处理BLOB字段时,如何提高EclipseLink的性能?,java,jpa,oracle11g,eclipselink,Java,Jpa,Oracle11g,Eclipselink,由于每个实体都有BLOB字段,我的Java应用程序变得非常慢。此字段通常用于存储PDF文件,每当我必须列出所有对象时,持久性提供程序需要花费相当长的时间才能完成其工作。我在寻找如何处理此类数据的答案,但其中一些人谈到将BLOB存储在单独的表中,然后使用FetchType.LAZY。是否有任何方法仅在需要时获取此字段,而不必创建另一个表?如果不是,创建另一个表是否是最合适的解决方案 实体代码 @Cache(alwaysRefresh = true) public class ScdDocument
@Cache(alwaysRefresh = true)
public class ScdDocumento implements Serializable, MultipleSelector {
@Transient
public static final String QUERY_RELATORIO_DOC_LOC = "consultas/ctrl_docs/consulta_relatorio_doc_local.txt";
@Transient
public static final String QUERY_RELATORIO_DOC_GRUPO = "consultas/ctrl_docs/consulta_relatorio_doc_grupo.txt";
@Id
@Column(name = "nome", length = 50)
private String nome;
@Column(name = "revisao")
private int revisao;
@Column(name = "id_tipo")
private int id_tipo;
@Column(name = "situacao", length = 1)
private String situacao;
@Column(name = "doc_blob_nome", length = 50)
private String doc_blob_nome;
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "documento_blob", nullable = false)
private byte[] documento_blob; //The field that impacts the application perfomance
@Column(name = "abrangencia_geral")
private int abrangencia_geral;
@ManyToMany
@JoinTable(name = "SCD_DOC_GRUPO", joinColumns = {@JoinColumn(name = "id_doc")},
inverseJoinColumns = {@JoinColumn(name = "id_grupo")})
private Set<SosGrupo> grupos;
@ManyToOne
@JoinColumn(name = "id_tipo", insertable = false, updatable = false)
private ScdTipo tipo;
@ManyToMany
@JoinTable(name = "SCD_REFERENCIA", joinColumns = {@JoinColumn(name = "doc_pai")},
inverseJoinColumns = {@JoinColumn(name = "doc_filho")})
private Set<ScdDocumento> referencias;
@ManyToMany
@JoinTable(name = "SCD_REFERENCIA", joinColumns = {@JoinColumn(name = "doc_filho")},
inverseJoinColumns = {@JoinColumn(name = "doc_pai")})
private Set<ScdDocumento> referenciadoPor;
@ManyToMany
@JoinTable(name = "SCD_PALAVRA_REFERENCIA", joinColumns = {@JoinColumn(name = "documento")},
inverseJoinColumns = {@JoinColumn(name = "palavra")})
private Set<ScdPalavraChave> palavrasChaves;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "documento")
private Set<ScdOrdem> ordens;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "documento")
private Set<ScdArquivoOs> arquivosOs;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "documento")
private Set<ScdArquivoHistorico> arquivosHistorico;
@ManyToMany(cascade = {CascadeType.REFRESH, CascadeType.MERGE})
@JoinTable(name = "SCD_LOCAL_DOC", joinColumns = {@JoinColumn(name = "id_doc")},
inverseJoinColumns = {@JoinColumn(name = "id_local")})
private Set<ScdLocal> locais;
@Override
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getRevisao() {
return revisao;
}
public void setRevisao(int revisao) {
this.revisao = revisao;
}
public int getIdTipo() {
return id_tipo;
}
public void setIdTipo(int id_tipo) {
this.id_tipo = id_tipo;
}
public String getSituacao() {
return situacao;
}
public void setSituacao(String situacao) {
this.situacao = situacao;
}
public String getDocBlobNome() {
return doc_blob_nome;
}
public void setDocBlobNome(String doc_blob_nome) {
this.doc_blob_nome = doc_blob_nome;
}
public byte[] getDocumentoBlob() {
return documento_blob;
}
public void setDocumentoBlob(byte[] documento_blob) {
this.documento_blob = documento_blob;
}
public int getAbrangenciaGeral() {
return abrangencia_geral;
}
public void setAbrangenciaGeral(int abrangencia_geral) {
this.abrangencia_geral = abrangencia_geral;
}
public Set<SosGrupo> getGrupos() {
return grupos;
}
public void setGrupos(Set<SosGrupo> grupo) {
this.grupos = grupo;
}
public ScdTipo getTipo() {
return tipo;
}
public void setTipo(ScdTipo tipo) {
this.tipo = tipo;
}
public Set<ScdDocumento> getReferencias() {
return referencias;
}
public void setReferencias(Set<ScdDocumento> referencias) {
this.referencias = referencias;
}
public Set<ScdDocumento> getReferenciadoPor() {
return referenciadoPor;
}
public void setReferenciadoPor(Set<ScdDocumento> referenciadoPor) {
this.referenciadoPor = referenciadoPor;
}
public Set<ScdPalavraChave> getPalavrasChaves() {
return palavrasChaves;
}
public void setPalavrasChaves(Set<ScdPalavraChave> palavrasChaves) {
this.palavrasChaves = palavrasChaves;
}
public Set<ScdOrdem> getOrdens() {
return ordens;
}
public void setOrdens(Set<ScdOrdem> ordens) {
this.ordens = ordens;
}
public Set<ScdArquivoOs> getArquivosOs() {
return arquivosOs;
}
public void setArquivosOs(Set<ScdArquivoOs> arquivosOs) {
this.arquivosOs = arquivosOs;
}
public Set<ScdArquivoHistorico> getArquivosHistorico() {
return arquivosHistorico;
}
public void setArquivosHistorico(Set<ScdArquivoHistorico> arquivosHistorico) {
this.arquivosHistorico = arquivosHistorico;
}
public Set<ScdLocal> getLocais() {
return locais;
}
public void setLocais(Set<ScdLocal> locais) {
this.locais = locais;
}
@Override
public String getIdRef() {
return nome;
}
@Override
public String getDesc() {
return tipo.getNome();
}
}
@缓存(alwaysRefresh=true)
公共类ScdDocumento实现可序列化的多选择器{
@短暂的
公共静态最终字符串查询\u RELATORIO\u DOC\u LOC=“consultas/ctrl\u docs/consulta\u RELATORIO\u DOC\u local.txt”;
@短暂的
公共静态最终字符串查询\u RELATORIO\u DOC\u GRUPO=“consultas/ctrl\u docs/consulta\u RELATORIO\u DOC\u GRUPO.txt”;
@身份证
@列(name=“nome”,长度=50)
私有字符串名称;
@列(name=“revisao”)
里瓦索私人酒店;
@列(name=“id\u tipo”)
私人国际机场;
@列(name=“situacao”,长度=1)
私用串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串;
@列(name=“doc\u blob\u nome”,长度=50)
私有字符串doc_blob_nome;
@高球
@基本(fetch=FetchType.LAZY)
@列(name=“documento\u blob”,null=false)
私有字节[]documento_blob;//影响应用程序性能的字段
@列(name=“abrangencia_geral”)
abrangencia_geral私人酒店;
@许多
@JoinTable(name=“SCD\u DOC\u GRUPO”,joinColumns={@JoinColumn(name=“id\u DOC”)},
inverseJoinColumns={@JoinColumn(name=“id\u grupo”)})
专用grupos;
@许多酮
@JoinColumn(name=“id\u tipo”,insertable=false,updateable=false)
私人ScdTipo tipo;
@许多
@JoinTable(name=“SCD_referencea”,joinColumns={@JoinColumn(name=“doc_pai”)},
inverseJoinColumns={@JoinColumn(name=“doc_filho”)})
私有集引用;
@许多
@JoinTable(name=“SCD_referencea”,joinColumns={@JoinColumn(name=“doc_filho”)},
inverseJoinColumns={@JoinColumn(name=“doc_”)})
私有集引用器;
@许多
@JoinTable(name=“SCD\u PALAVRA\u REFERENCIA”,joinColumns={@JoinColumn(name=“documento”)},
inverseJoinColumns={@JoinColumn(name=“palavra”)})
私人设置的宫殿;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“documento”)
私人设定命令;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“documento”)
私有集arquivosOs;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“documento”)
私有集arquivosHistorico;
@ManyToMany(cascade={CascadeType.REFRESH,CascadeType.MERGE})
@JoinTable(name=“SCD\u LOCAL\u DOC”,joinColumns={@JoinColumn(name=“id\u DOC”)},
inverseJoinColumns={@JoinColumn(name=“id_local”)})
私家车;
@凌驾
公共字符串getNome(){
返回nome;
}
公共无效集合名称(字符串名称){
this.nome=nome;
}
公共int getRevisao(){
返回revisao;
}
公共无效setRevisao(int revisao){
this.revisao=revisao;
}
public int getIdTipo(){
返回id_tipo;
}
公共无效setIdTipo(内部id_tipo){
this.id_tipo=id_tipo;
}
公共字符串getSituacao(){
还司吐曹;
}
公共无效setSituacao(字符串situacao){
this.situacao=situacao;
}
公共字符串getDocBlobName(){
返回单据的名称;
}
public void setDocBlobName(字符串doc\u blob\u nome){
this.doc\u blob\u nome=doc\u blob\u nome;
}
公共字节[]getDocumentoBlob(){
返回文档o_blob;
}
public void setDocumentoBlob(字节[]documento_blob){
this.documento_blob=documento_blob;
}
公共int getAbrangenciaGeral(){
返回abrangencia_geral;
}
公共无效设置区域(内部区域){
this.abrangencia_geral=abrangencia_geral;
}
公共集getGrupos(){
返回grupos;
}
公共无效设置grupo(设置grupo){
this.grupos=grupo;
}
公共ScdTipo getIPO(){
返回提坡;
}
公共无效setTipo(ScdTipo tipo){
this.tipo=tipo;
}
公共集getReferenceas(){
返回引用;
}
公共无效集合引用(集合引用){
this.referenceas=referenceas;
}
公共集GetReferenceAddor(){
返回参考值;
}
public void setreferenceadop(Set referenceadop){
this.referenceadop=referenceadop;
}
公共集getPalavrasChaves(){
返回宫殿;
}
公共无效设置palavrasChaves(设置palavrasChaves){
this.palavrasChaves=palavrasChaves;
}
公共集合getOrdens(){
返回命令;
}
公共无效设定值(设定值){
这个。奥登斯=奥登斯;
}
公共集getArquivosOs(){
返回arquivosOs;
}
公共无效集合arquivosOs(集合arquivosOs){
this.arquivosOs=arquivosOs;
}
公共集getArquivosHistorico(){
返回arquivosHistorico;
}
公共无效setArquivosHistorico(Set arquivosHistorico){
this.arquivosHistorico=arquivosHistorico;
}
公共集getLocais(){
返回地点;
}
公共无效设置locais(设置locais){
this.locais=locais;
}
@凌驾
公共字符串getIdRef(){
返回nome;
}
@凌驾
公共字符串getDesc(){
返回tipo.getNome();
}
}
导致问题的方法
桂
private void loadDocumentTable(字符串situacao){
mapaDocumentos=newtreemap();
modelDocumentos.s
private void loadDocumentTable(String situacao) {
mapaDocumentos = new TreeMap<>();
modelDocumentos.setRowCount(0);
docdao.getCriteria("situacao", situacao).forEach((e) -> {
mapaDocumentos.put(e.getNome(), e);
});
mapaDocumentos.entrySet().forEach((e) -> {
String desc = e.getValue().getDocBlobNome();
modelDocumentos.addRow(new Object[]{e.getKey(), desc.substring(0, desc.length() - 3), e.getValue().getRevisao()});
});
}
@Override
public List<T> getCriteria(String column, Object value){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(clazz);
Root<T> root = cq.from(clazz);
EntityType<T> ent = root.getModel();
cq.where(cb.equal(root.get(ent.getSingularAttribute(column)), value.toString()));
return em.createQuery(cq).getResultList();
}
<plugin>
<groupId>de.empulse.eclipselink</groupId>
<artifactId>staticweave-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>weave</goal>
</goals>
<configuration>
<persistenceXMLLocation>META-INF/persistence.xml</persistenceXMLLocation>
<logLevel>FINE</logLevel>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
</plugin>