java - ojdbc14 到 ojdbc6 升级中对象反序列化失败

标签 java serialization jdbc oracle11g ojdbc

升级 Oracle 数据库的 jdbc 驱动程序后,应用程序中 BLOB 数据类型的对象反序列化失败。

在我们的应用程序中,过去几年我们一直使用 ojdbc14,没有出现任何问题。然而最近我们决定 将其升级到 ojdbc6。升级到这个新版本后,当我们尝试执行以下操作时,我们会收到以下错误 从数据库读取(反序列化)BLOB 对象。这些对象被旧版本的ojdbc(14)序列化并保存在数据库中。 这里我们尝试使用新版本的 ojdbc(6) 来读取它们。

Caused by: java.io.InvalidClassException: oracle.sql.DatumWithConnection; local class incompatible: stream classdesc serialVersionUID = 491462912477014233, local class serialVersionUID = -5786207790829127167

根据错误日志,我觉得他们已经更新了 oracle.sql.DatumWithConnection 类中的“serialVersionUID”。 所以当新版本的ojdbc可用时,反序列化失败。

所以我的问题是

  1. 有没有办法可以解决这个问题而不需要回到旧版本?
  2. 此次升级后,我们还应该注意其他类似类型的问题吗?

完整的错误堆栈

15:33:14,460 INFO  [STDOUT] ERROR [http-10.10.10.117-8080-2] (CommonsLogger.java:38) - Exception occurred during processing request: org.apache.struts2.json.JSONException: org.hibernate.type.SerializationException: could not deserialize
org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.type.SerializationException: could not deserialize
    at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246)
    at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178)
    at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168)
    at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
    at org.apache.struts2.json.JSONWriter.write(JSONWriter.java:102)
    at org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:116)
    at org.apache.struts2.json.JSONResult.createJSONString(JSONResult.java:197)
    at org.apache.struts2.json.JSONResult.execute(JSONResult.java:171)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:367)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:271)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at com.____._____.s2.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:40)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:544)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.custom.spring.plugin.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:199)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.struts2.json.JSONException: org.hibernate.type.SerializationException: could not deserialize
    at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246)
    at org.apache.struts2.json.JSONWriter.processCustom(JSONWrit
15:33:14,460 INFO  [STDOUT] er.java:178)
    at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168)
    at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
    at org.apache.struts2.json.JSONWriter.array(JSONWriter.java:481)
    at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:158)
    at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
    at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390)
    at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231)
    ... 79 more
Caused by: org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:217)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:240)
    at org.hibernate.type.SerializableToBlobType.fromBytes(SerializableToBlobType.java:69)
    at org.hibernate.type.SerializableToBlobType.get(SerializableToBlobType.java:61)
    at org.hibernate.type.AbstractLobType.nullSafeGet(AbstractLobType.java:46)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2096)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
    at org.hibernate.loader.Loader.getRow(Loader.java:1206)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
    at org.hibernate.loader.Loader.doQuery(Loader.java:701)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
    at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
    at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:158)
    at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134)
    at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390)
    at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231)
    ... 87 more
Caused by: java.io.InvalidClassException: oracle.sql.DatumWithConnection; local class incompatible: stream classdesc serialVersionUID = 491462912477014233, local class serialVersionUID = -5786207790829127167
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:210)
    ... 111 more

数据库中序列化的 Java 对象

package com._____.aixis.domain;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import oracle.sql.BLOB;

import com._____._____.domain.interfaces.ICostFactorItem;
import com._____._____.domain.interfaces.ITariffTypeCategory;

@Entity
@Table(name="______Docs")
public class Document extends DomainDefault implements Serializable,ITariffTypeCategory , ICostFactorItem {


    private static final long serialVersionUID = 5425465600991463936L;

    private Integer id;
    private String documentName;
    private DocumentType  documentType;
    private String docComment;
    private BLOB blobDoc;
    private String extension;
    private MasterData service;
    private DocumentInvoiceType documentInvoiceType;

    public Document() {
        super();
    }

    public Document(String documentName, DocumentType documentType, String docComment, BLOB blobDoc, String extension,
            MasterData service, Employee employee, Date createdDate) {
        super();
        this.documentName = documentName;
        this.documentType = documentType;
        this.docComment = docComment;
        this.blobDoc = blobDoc;
        this.extension = extension;
        this.service = service;
        if(employee != null){
            this.setCreatedBy(employee.getAccount().getUsername());
            this.setCreatedByUser(employee);
        }
        this.setCreatedDate(createdDate);
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDocumentName() {
        return documentName;
    }

    public void setDocumentName(String doumentName) {
        this.documentName = doumentName;
    }

    public DocumentType getDocumentType() {
        return documentType;
    }

    public void setDocumentType(DocumentType documentType) {
        this.documentType = documentType;
    }

    public String getDocComment() {
        return docComment;
    }

    public void setDocComment(String docComment) {
        this.docComment = docComment;
    }

    public String getExtension() {
        return extension;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

    @Transient
    public String getCommonName() {
        return this.documentName +"-[" + this.documentType+"]";
    }

    @Transient
    public String getItemName() {
        return this.documentName +"-[" + this.documentType+"]";
    }

    @Lob
    public BLOB getBlobDoc() {
        return blobDoc;
    }

    public void setBlobDoc(BLOB blobDoc) {
        this.blobDoc = blobDoc;
    }

    @Override
    public String getCreatedBy() {
        return createdBy;
    }

    @Override
    public Date getCreatedDate() {
        return createdDate;
    }

    @Override
    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    @Override
    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    @Override
    public String getModifiedBy() {
        return modifiedBy;
    }

    @Override
    public Date getModifiedDate() {
        return modifiedDate;
    }

    @Override
    public void setModifiedBy(String modifiedBy) {
       this.modifiedBy = modifiedBy;
    }

    @Override
    public void setModifiedDate(Date modifiedDate) {
        this.modifiedDate = modifiedDate;
    }

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE },fetch=FetchType.LAZY)
    public MasterData getService() {
        return service;
    }

    public void setService(MasterData service) {
        this.service = service;
    }

    public DocumentInvoiceType getDocumentInvoiceType() {
        return documentInvoiceType;
    }

    public void setDocumentInvoiceType(DocumentInvoiceType documentInvoiceType) {
        this.documentInvoiceType = documentInvoiceType;
    }

    @Override
    @OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
    public Person getCreatedByUser() {
        return createdByUser;
    }

    @Override
    public void setCreatedByUser(Person createdBy) {
        this.createdByUser = createdBy;
    }

    @Override
    @OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
    public Person getModifiedByUser() {
        return modifiedByUser;
    }

    @Override
    public void setModifiedByUser(Person modifiedBy) {
        this.modifiedByUser = modifiedBy;
    }

}

最佳答案

** 如果您赶时间,只需下载定制的 ojdbc6.jar 文件并使用即可。您无需执行任何其他操作。

https://drive.google.com/open?id=0Bz2PT96Cb0tSRk5XNGU3TUdHS1U

我的回答摘要

  1. 首先,反编译下面提到的类。

    • oracle.sql.DatumWithConnection.class

    • oracle.sql.BLOB.class

  2. 然后将旧版本的serialVersionUID添加到这些类中。(旧版本id可在错误日志中找到)

  3. 然后重新编译类。
  4. 最后,使用新类更新 ojdbc6.jar 以升级和自定义 ojdbc 库。就是这样。
<小时/>

如果您想手动构建 JAR,请阅读并遵循下面提到的说明。

如何构建定制的 JAR

  1. 首先反编译ojdbc6.jar文件中的以下类。

    • oracle.sql.DatumWithConnection.class

    • oracle.sql.BLOB.class

    要反编译,您可以使用“Java Decompiler” http://jd.benow.ca/

(从数据库读取保存的 BLOB 对象时,这些类会带来麻烦。)

  • 在 Eclipse 中创建一个简单的 Java 项目(文件--> 新建--> JavaProject)或使用 Simple project我已经创建了。
  • 如果您正在创建一个新项目,请添加具有正确打包结构的反编译java文件(oracle.sql)。 此外,您还必须将 ojdbc6.jar 文件添加到该项目的构建路径中。

  • 然后将旧的serialVersionUID添加到这些反编译的java文件中。 (编译这些java文件还需要进行额外的更改。请参阅下面更新的java文件)

     DatumWithConnection.java ->    private static final long serialVersionUID = 491462912477014233L;
    
     BLOB.java          ->  private static final long serialVersionUID = 2160152488501369185L;
    
  • 之后,构建项目并获取重新编译的类。

  • 最后使用新类更新 ojdbc6.jar 以升级和自定义 ojdbc 库。就是这样

    5.1 创建一个名为“Updated JAR”的新文件夹。

    5.2 将 ojdbc6.jar 文件复制到该文件夹​​中。 D:\JARS\更新的 JAR\ojdbc.jar

    5.3 在该文件夹下创建两个新文件夹来构建类文件的包结构(\oracle\sql)

    5.4 将两个类文件添加到“sql”文件夹中。

     D:\JARS\Updated JAR\oracle\sql\DatumWithConnection.class
    
     D:\JARS\Updated JAR\oracle\sql\BLOB.class
    

    5.5 打开一个新的命令行并将目录(cd)更改为jar文件所在的位置。

    >cd D:\JARS\Updated JAR
    

    5.6 要使用新的类文件更新 jar 文件,请在命令行中使用下面提到的命令。

    >jar uf ojdbc6.jar oracle\sql\DatumWithConnection.class
    
    >jar uf ojdbc6.jar oracle\sql\BLOB.class
    

    5.7 现在您有了一个自定义的 ojdbc6.jar 文件,该文件可与使用 ojdbc14.jar 序列化并保存的 BLOB 对象一起使用

  • <小时/>

    更新了 java 类。

    DatumWithConnection.java

        package oracle.sql;
    
    
        import java.sql.Connection;
        import java.sql.SQLException;
        import oracle.jdbc.driver.DatabaseError;
        import oracle.jdbc.driver.OracleDriver;
        import oracle.jdbc.internal.OracleDatumWithConnection;
    
        public abstract class DatumWithConnection
          extends Datum
          implements OracleDatumWithConnection
        {
    
        private static final long serialVersionUID = 491462912477014233L;
    
        private oracle.jdbc.internal.OracleConnection physicalConnection = null;
    
          oracle.jdbc.internal.OracleConnection getPhysicalConnection()
          {
            if (this.physicalConnection == null) {
              try
              {
                this.physicalConnection = ((oracle.jdbc.internal.OracleConnection)new OracleDriver().defaultConnection());
              }
              catch (SQLException localSQLException) {}
            }
            return this.physicalConnection;
          }
    
          public DatumWithConnection(byte[] paramArrayOfByte)
            throws SQLException
          {
            super(paramArrayOfByte);
          }
    
          public DatumWithConnection() {}
    
          public static void assertNotNull(Connection paramConnection)
            throws SQLException
          {
            if (paramConnection == null)
            {
              SQLException localSQLException = DatabaseError.createSqlException(null, 68, "Connection is null");
              localSQLException.fillInStackTrace();
              throw localSQLException;
            }
          }
    
          public static void assertNotNull(TypeDescriptor paramTypeDescriptor)
            throws SQLException
          {
            if (paramTypeDescriptor == null)
            {
              SQLException localSQLException = DatabaseError.createSqlException(null, 61);
              localSQLException.fillInStackTrace();
              throw localSQLException;
            }
          }
    
          public void setPhysicalConnectionOf(Connection paramConnection)
          {
            this.physicalConnection = ((oracle.jdbc.OracleConnection)paramConnection).physicalConnectionWithin();
          }
    
          public Connection getJavaSqlConnection()
            throws SQLException
          {
            return getPhysicalConnection().getWrapper();
          }
    
          public oracle.jdbc.OracleConnection getOracleConnection()
            throws SQLException
          {
            return getPhysicalConnection().getWrapper();
          }
    
          public oracle.jdbc.internal.OracleConnection getInternalConnection()
            throws SQLException
          {
            return getPhysicalConnection();
          }
    
          /**
           * @deprecated
           */
          public oracle.jdbc.driver.OracleConnection getConnection()
            throws SQLException
          {
            oracle.jdbc.driver.OracleConnection localOracleConnection = null;
            try
            {
              localOracleConnection = (oracle.jdbc.driver.OracleConnection)((oracle.jdbc.driver.OracleConnection)this.physicalConnection).getWrapper();
            }
            catch (ClassCastException localClassCastException)
            {
              SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 103);
              localSQLException.fillInStackTrace();
              throw localSQLException;
            }
            return localOracleConnection;
          }
    
          protected oracle.jdbc.internal.OracleConnection getConnectionDuringExceptionHandling()
          {
            return this.physicalConnection;
          }
    
          private static final String _Copyright_2007_Oracle_All_Rights_Reserved_ = null;
          public static final boolean TRACE = false;
        }
    

    BLOB.java

        package oracle.sql;
    
        import java.io.ByteArrayInputStream;
        import java.io.InputStream;
        import java.io.OutputStream;
        import java.io.Reader;
        import java.sql.Blob;
        import java.sql.Connection;
        import java.sql.SQLException;
        import oracle.jdbc.LargeObjectAccessMode;
        import oracle.jdbc.driver.DatabaseError;
        import oracle.jdbc.internal.OracleBlob;
    
        public class BLOB extends DatumWithConnection implements OracleBlob {
    
            private static final long serialVersionUID = 2160152488501369185L;
    
            public static final int MAX_CHUNK_SIZE = 32768;
            public static final int DURATION_SESSION = 10;
            public static final int DURATION_CALL = 12;
            static final int OLD_WRONG_DURATION_SESSION = 1;
            static final int OLD_WRONG_DURATION_CALL = 2;
            public static final int MODE_READONLY = 0;
            public static final int MODE_READWRITE = 1;
            BlobDBAccess dbaccess;
            int dbChunkSize;
            boolean isFree;
            boolean fromObject;
            private long cachedLobLength;
            private byte[] prefetchData;
            private int prefetchDataSize;
            private boolean activePrefetch;
            static final int KDLCTLSIZE = 16;
            static final int KDF_FLAG = 88;
            static final int KDLIDDAT = 8;
            private static final String _Copyright_2007_Oracle_All_Rights_Reserved_ = null;
            public static final boolean TRACE = false;
            public static Object localObject;
    
    
            protected BLOB() {
                this.dbChunkSize = -1;
                this.isFree = false;
    
                this.fromObject = false;
    
                this.cachedLobLength = -1L;
    
                this.prefetchDataSize = 0;
                this.activePrefetch = false;
            }
    
            public BLOB(oracle.jdbc.OracleConnection paramOracleConnection) throws SQLException {
                this(paramOracleConnection, null);
            }
    
            public BLOB(oracle.jdbc.OracleConnection paramOracleConnection, byte[] paramArrayOfByte, boolean paramBoolean)
                    throws SQLException {
                this(paramOracleConnection, paramArrayOfByte);
    
                this.fromObject = paramBoolean;
            }
    
            public BLOB(oracle.jdbc.OracleConnection paramOracleConnection, byte[] paramArrayOfByte) throws SQLException {
                super(paramArrayOfByte);
    
                this.dbChunkSize = -1;
                this.isFree = false;
    
                this.fromObject = false;
    
                this.cachedLobLength = -1L;
    
                this.prefetchDataSize = 0;
                this.activePrefetch = false;
    
                assertNotNull(paramOracleConnection);
                setPhysicalConnectionOf(paramOracleConnection);
    
                this.dbaccess = getPhysicalConnection().createBlobDBAccess();
    
                this.dbaccess.incrementTempLobReferenceCount(paramArrayOfByte);
            }
    
            public long length() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                long l = -1L;
    
                if ((this.activePrefetch) && (this.cachedLobLength != -1L))
                    l = this.cachedLobLength;
                else if (canReadBasicLobDataInLocator())
                    l = dilLength();
                else
                    l = getDBAccess().length(this);
                return l;
            }
    
            public byte[] getBytes(long paramLong, int paramInt) throws SQLException {
                if (this.isFree) {
                    localObject = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 192);
                    ((SQLException) localObject).fillInStackTrace();
                    throw ((SQLException) localObject);
                }
                if ((paramInt < 0) || (paramLong < 1L)) {
                    localObject = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 68, "getBytes()");
                    ((SQLException) localObject).fillInStackTrace();
                    throw ((SQLException) localObject);
                }
    
                if (canReadBasicLobDataInLocator()) {
                    return dilGetBytes(paramLong, paramInt);
                }
    
                Object localObject = null;
    
                if (paramInt == 0) {
                    return new byte[0];
                }
                if ((this.activePrefetch) && (((this.cachedLobLength == 0L)
                        || ((this.cachedLobLength > 0L) && (paramLong - 1L >= this.cachedLobLength))))) {
                    localObject = null;
                } else {
                    long l = 0L;
                    byte[] arrayOfByte;
                    if ((this.activePrefetch) && (this.cachedLobLength != -1L))
                        arrayOfByte = new byte[Math.min((int) this.cachedLobLength, paramInt)];
                    else {
                        arrayOfByte = new byte[paramInt];
                    }
    
                    l = getBytes(paramLong, paramInt, arrayOfByte);
    
                    if (l > 0L) {
                        if (l == paramInt) {
                            localObject = arrayOfByte;
                        } else {
                            localObject = new byte[(int) l];
    
                            System.arraycopy(arrayOfByte, 0, localObject, 0, (int) l);
                        }
                    }
                }
    
                return ((byte[])localObject);
            }
    
            public InputStream getBinaryStream() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                if (canReadBasicLobDataInLocator()) {
                    return dilGetBinaryStream(1L);
                }
                return getDBAccess().newInputStream(this, getBufferSize(), 0L);
            }
    
            public long position(byte[] paramArrayOfByte, long paramLong) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().position(this, paramArrayOfByte, paramLong);
            }
    
            public long position(Blob paramBlob, long paramLong) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().position(this, (BLOB) paramBlob, paramLong);
            }
    
            public int getBytes(long paramLong, int paramInt, byte[] paramArrayOfByte) throws SQLException {
                SQLException localSQLException;
                if (this.isFree) {
                    localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                if ((paramInt < 0) || (paramLong < 0L)) {
                    localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 68,
                            "getBytes()");
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
    
                if (paramArrayOfByte.length < paramInt) {
                    paramInt = paramArrayOfByte.length;
                }
                return getDBAccess().getBytes(this, paramLong, paramInt, paramArrayOfByte);
            }
    
            public int putBytes(long paramLong, byte[] paramArrayOfByte) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return setBytes(paramLong, paramArrayOfByte);
            }
    
            public int putBytes(long paramLong, byte[] paramArrayOfByte, int paramInt) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return setBytes(paramLong, paramArrayOfByte, 0, paramInt);
            }
    
            public OutputStream getBinaryOutputStream() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return setBinaryStream(1L);
            }
    
            public byte[] getLocator() {
                return getBytes();
            }
    
            public void setLocator(byte[] paramArrayOfByte) {
                setBytes(paramArrayOfByte);
            }
    
            public int getChunkSize() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                if (this.dbChunkSize <= 0) {
                    this.dbChunkSize = getDBAccess().getChunkSize(this);
                }
    
                return this.dbChunkSize;
            }
    
            public int getBufferSize() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                int i = getChunkSize();
                int j = i;
    
                if ((i >= 32768) || (i <= 0)) {
                    j = 32768;
                } else {
                    j = 32768 / i * i;
                }
    
                return j;
            }
    
            public static BLOB empty_lob() throws SQLException {
                return getEmptyBLOB();
            }
    
            public static BLOB getEmptyBLOB() throws SQLException {
                byte[] arrayOfByte = new byte[86];
    
                arrayOfByte[1] = 84;
                arrayOfByte[5] = 24;
    
                BLOB localBLOB = new BLOB();
    
                localBLOB.setShareBytes(arrayOfByte);
    
                return localBLOB;
            }
    
            public boolean isEmptyLob() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                boolean bool = (shareBytes()[5] & 0x10) != 0;
    
                return bool;
            }
    
            public boolean isSecureFile() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                boolean bool = (shareBytes()[7] & 0xFFFFFF80) != 0;
                return bool;
            }
    
            public OutputStream getBinaryOutputStream(long paramLong) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().newOutputStream(this, getBufferSize(), paramLong, false);
            }
    
            public InputStream getBinaryStream(long paramLong) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                if (canReadBasicLobDataInLocator()) {
                    return dilGetBinaryStream(paramLong);
                }
                return getDBAccess().newInputStream(this, getBufferSize(), paramLong);
            }
    
            public void trim(long paramLong) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                truncate(paramLong);
            }
    
            public static BLOB createTemporary(Connection paramConnection, boolean paramBoolean, int paramInt)
                    throws SQLException {
                int i = paramInt;
    
                if (paramInt == 1) {
                    i = 10;
                }
                if (paramInt == 2) {
                    i = 12;
                }
                if ((paramConnection == null) || ((i != 10) && (i != 12))) {
                    localObject = DatabaseError.createSqlException(null, 68,
                            "'conn' should not be null and 'duration' should either be equal to DURATION_SESSION or to DURATION_CALL");
    
                    ((SQLException) localObject).fillInStackTrace();
                    throw ((SQLException) localObject);
                }
    
                Object localObject = ((oracle.jdbc.OracleConnection) paramConnection).physicalConnectionWithin();
    
                return ((BLOB) getDBAccess((Connection) localObject).createTemporaryBlob((Connection) localObject, paramBoolean,
                        i));
            }
    
            public static void freeTemporary(BLOB paramBLOB) throws SQLException {
                if (paramBLOB == null) {
                    return;
                }
                paramBLOB.freeTemporary();
            }
    
            public static boolean isTemporary(BLOB paramBLOB) throws SQLException {
                if (paramBLOB == null) {
                    return false;
                }
                return paramBLOB.isTemporary();
            }
    
            public void freeTemporary() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
    
                int i = getDBAccess().decrementTempLobReferenceCount(shareBytes());
    
                if (i == 0)
                    getDBAccess().freeTemporary(this, this.fromObject);
            }
    
            public boolean isTemporary() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().isTemporary(this);
            }
    
            public void open(LargeObjectAccessMode paramLargeObjectAccessMode) throws SQLException {
                open(paramLargeObjectAccessMode.getCode());
            }
    
            public void open(int paramInt) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                getDBAccess().open(this, paramInt);
            }
    
            public void close() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                getDBAccess().close(this);
            }
    
            public boolean isOpen() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().isOpen(this);
            }
    
            public int setBytes(long paramLong, byte[] paramArrayOfByte) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
    
                return getDBAccess().putBytes(this, paramLong, paramArrayOfByte, 0,
                        (paramArrayOfByte != null) ? paramArrayOfByte.length : 0);
            }
    
            public int setBytes(long paramLong, byte[] paramArrayOfByte, int paramInt1, int paramInt2) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().putBytes(this, paramLong, paramArrayOfByte, paramInt1, paramInt2);
            }
    
            public OutputStream setBinaryStream(long paramLong) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return getDBAccess().newOutputStream(this, getBufferSize(), paramLong, true);
            }
    
            public void truncate(long paramLong) throws SQLException {
                SQLException localSQLException;
                if (this.isFree) {
                    localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                if (paramLong < 0L) {
                    localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 68,
                            "'len' should be >= 0. ");
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
    
                getDBAccess().trim(this, paramLong);
            }
    
            public Object toJdbc() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return this;
            }
    
            public boolean isConvertibleTo(Class paramClass) {
                String str = paramClass.getName();
    
                return ((str.compareTo("java.io.InputStream") == 0) || (str.compareTo("java.io.Reader") == 0));
            }
    
            public Reader characterStreamValue() throws SQLException {
                getInternalConnection();
                return getDBAccess().newConversionReader(this, 8);
            }
    
            public InputStream asciiStreamValue() throws SQLException {
                getInternalConnection();
                return getDBAccess().newConversionInputStream(this, 2);
            }
    
            public InputStream binaryStreamValue() throws SQLException {
                return getBinaryStream();
            }
    
            public Object makeJdbcArray(int paramInt) {
                return new BLOB[paramInt];
            }
    
            public BlobDBAccess getDBAccess() throws SQLException {
                SQLException localSQLException;
                if (this.dbaccess == null) {
                    if (isEmptyLob()) {
                        localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 98);
                        localSQLException.fillInStackTrace();
                        throw localSQLException;
                    }
    
                    this.dbaccess = getInternalConnection().createBlobDBAccess();
                }
    
                if (getPhysicalConnection().isClosed()) {
                    localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
    
                return this.dbaccess;
            }
    
            public static BlobDBAccess getDBAccess(Connection paramConnection) throws SQLException {
                return ((oracle.jdbc.OracleConnection) paramConnection).physicalConnectionWithin().createBlobDBAccess();
            }
    
            public Connection getJavaSqlConnection() throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException.fillInStackTrace();
                    throw localSQLException;
                }
                return super.getJavaSqlConnection();
            }
    
            public final void setLength(long paramLong) {
                this.cachedLobLength = paramLong;
            }
    
            public final void setChunkSize(int paramInt) {
                this.dbChunkSize = paramInt;
            }
    
            public final void setPrefetchedData(byte[] paramArrayOfByte) {
                if (paramArrayOfByte == null)
                    setPrefetchedData(null, 0);
                else
                    setPrefetchedData(paramArrayOfByte, paramArrayOfByte.length);
            }
    
            public final void setPrefetchedData(byte[] paramArrayOfByte, int paramInt) {
                this.prefetchData = paramArrayOfByte;
                this.prefetchDataSize = paramInt;
            }
    
            public final byte[] getPrefetchedData() {
                return this.prefetchData;
            }
    
            public final int getPrefetchedDataSize() {
                return this.prefetchDataSize;
            }
    
            public final void setActivePrefetch(boolean paramBoolean) {
                if ((this.activePrefetch) && (!(paramBoolean)))
                    clearCachedData();
                this.activePrefetch = paramBoolean;
            }
    
            public final void clearCachedData() {
                this.cachedLobLength = -1L;
                this.prefetchData = null;
            }
    
            public final boolean isActivePrefetch() {
                return this.activePrefetch;
            }
    
            boolean canReadBasicLobDataInLocator() throws SQLException {
                byte[] arrayOfByte = shareBytes();
                if ((arrayOfByte == null) || (arrayOfByte.length < 102)) {
                  return false;
                }
                if (!getPhysicalConnection().isDataInLocatorEnabled()) {
                  return false;
                }
                int i = arrayOfByte[6] & 0xFF;
                int j = arrayOfByte[7] & 0xFF;
                int k = (i & 0x8) == 8 ? 1 : 0;
                int m = (j & 0xFFFFFF80) == -128 ? 1 : 0;
                int n = 0;
                if ((k != 0) && (m == 0))
                {
                  n = ((arrayOfByte[88] & 0xFF) & 0x8) == 8 ? 1 : 0;
                }
                return (k != 0) && (m == 0) && (n != 0);
            }
    
            int dilLength() {
                return (shareBytes().length - 86 - 16);
            }
    
            byte[] dilGetBytes(long paramLong, int paramInt) throws SQLException {
                if (paramInt == 0) {
                    return new byte[0];
                }
    
                if (dilLength() == 0) {
                    return null;
                }
                int i = (int) Math.min(paramInt, dilLength() - (paramLong - 1L));
    
                if (i <= 0) {
                    return null;
                }
    
                byte[] arrayOfByte = new byte[i];
                System.arraycopy(shareBytes(), (int) (paramLong - 1L) + 86 + 16, arrayOfByte, 0, i);
                return arrayOfByte;
            }
    
            InputStream dilGetBinaryStream(long paramLong) throws SQLException {
                if (paramLong < 0L) {
                    throw new IllegalArgumentException("Illegal Arguments");
                }
    
                byte[] arrayOfByte = dilGetBytes(paramLong, dilLength());
    
                if (arrayOfByte == null) {
                    arrayOfByte = new byte[0];
                }
    
                return new ByteArrayInputStream(arrayOfByte);
            }
    
            public void free() throws SQLException {
                if (this.isFree)
                    return;
                if (isOpen())
                    close();
                if (isTemporary())
                    freeTemporary();
                this.isFree = true;
                this.dbaccess = null;
            }
    
            public InputStream getBinaryStream(long paramLong1, long paramLong2) throws SQLException {
                if (this.isFree) {
                    SQLException localSQLException1 = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            192);
                    localSQLException1.fillInStackTrace();
                    throw localSQLException1;
                }
                if (canReadBasicLobDataInLocator()) {
                    return dilGetBinaryStream(paramLong1, paramLong2);
                }
                long l = length();
                if ((paramLong1 < 1L) || (paramLong2 < 0L) || (paramLong1 > l) || (paramLong1 - 1L + paramLong2 > l)) {
                    SQLException localSQLException2 = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(),
                            68);
                    localSQLException2.fillInStackTrace();
                    throw localSQLException2;
                }
                return getDBAccess().newInputStream(this, getChunkSize(), paramLong1, paramLong2);
            }
    
            InputStream dilGetBinaryStream(long paramLong1, long paramLong2) throws SQLException {
                int i = dilLength();
                if ((paramLong1 < 1L) || (paramLong2 < 0L) || (paramLong1 > i) || (paramLong1 - 1L + paramLong2 > i)) {
                    localObject = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 68);
                    ((SQLException) localObject).fillInStackTrace();
                    throw ((SQLException) localObject);
                }
                byte[] localObject = dilGetBytes(paramLong1, i - (int) (paramLong1 - 1L));
                return ((InputStream) new ByteArrayInputStream(localObject, 0, (int) paramLong2));
            }
        }
    

    关于java - ojdbc14 到 ojdbc6 升级中对象反序列化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46543694/

    相关文章:

    在 jsp 中的两个不同表单上使用两个提交按钮时出现 Java 错误

    java - 使用递归查找句子中最长的单词(Java)

    java - 对 List 对象内的 List 进行排序

    java - JDBC Oracle 查询。使用 setInt() 而不是 setObject() 执行时速度慢

    java - 错误: Cannot create PoolableConnectionFactory (isValid() returned false)

    c# - 网络服务 : Want to Return Serializable Dictionary But It Shows DataSet

    c# - 将 XML 文件反序列化为 .Net 对象

    java - LocalDate 序列化错误

    java - jsp 文件中无法建立 jdbc 连接

    java - 遍历数据库结果集