数据从驱动程序JDBC转换到SAP HANA数据库时出错。

2020-08-24 09:07发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)美好的一天。 当前,我们有一个...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


美好的一天。

当前,我们有一个JAVA应用程序,可从数据库中通过驱动程序JDBC ngdbc-2.4.67.jar获取数据

SAP HANA 2.00.044.00.1571081837。 在大多数情况下,当应用程序正在读取数据并且将这些格式从二进制格式转换为字符串,int或十进制格式时,会出现错误,指示数组溢出。 下一个有关此问题的细节:

原因:java.lang.ArrayIndexOutOfBoundsException:7028547

com.sap.db.util.ByteUtils.getUByte(ByteUtils.java:38)〜[ngdbc-2.4 .67.jar!/:2.4.67-3028d4615dae104ed3de580c64399b376bf8d7c4]

com.sap.db.jdbc.packet.HPart.getUByte(HPart.java:62)〜[ngdbc-2.4.67.jar! /:2.4.67-3028d4615dae104ed3de580c64399b376bf8d7c4]

在com.sap.db.jdbc.packet.HDataPart._getFieldLengthFromDataLengthIndicator(HDataPart.java:1127)〜[ngdbc-2.4.67.jar!/:2.467。 -3028d4 \

615dae104ed3de580c64399b376bf8d7c4]
在com.sap.db.jdbc.packet.HDataPart._getFieldLength(HDataPart.java:1101)〜[ngdbc-2.4.67.jar!/:: 2.4.67-3028d4615dae104ed3de580c64399 \
b376bf8d7c4]
在com.sap.db.jdbc.packet.HDataPart._nextField(HDataPart.java:1033)〜[ngdbc-2.4.67.jar !/:2.4.67-3028d4615dae104ed3de580c64399b376b \

f8d7c4]

在com.sap.db.jdbc.packet.HDataPart.nextRecord(HDataPart.java:281)〜[ngdbc-2.4。 67.jar!/:2.4.67-3028d4615dae104ed3de580c64399b376bf \

8d7c4 ]

com.sap.db.jdbc.FetchChunk.nextRow(FetchChunk.java:111)〜[ngdbc-2.4.67.jar!/:2.4.67-3028d4615dae104ed3de580c64399b376b376bf8d7c4]

在com.sap.db.jdbc.ResultSetSapDB._next(ResultSetSapDB.java:4624)〜[ngdbc-2.4.67.jar!/:2.4.67-3028d4615dae104ed3de580c64399b376bf8 \

d7c4]

> com.sap.db.jdbc.ResultSetSapDB.next(ResultSetSapDB.java:157)〜[ngdbc-2.4.67.jar!/:2.4.67-3028d4615dae104ed3de580c64399b376bf8d7 \

c4]

有人可以帮助我解决这个问题吗?

问候。

10条回答
天桥码农
2020-08-24 09:35

Lars美好的一天。

不幸的是,我无法设置有关该信息的详细信息,因此该信息是机密的。 但是,我可以共享一些有关代码的细节,特别是我使用的技术以及如何连接到数据库。 详细信息是:

1- Java 1.8

2- Spring Boot 1.5.16,Spring JDBC模板4.3.19

3-驱动程序JDBC ngdbc.2.4.67

应用程序获取数据库中存在的记录总数。 此后,应用程序计算将引发查询以获取所有信息的次数。 代码中最重要的部分是下一部分:

1-在应用程序中将信息从数据库映射到CustomObject的映射器。

公共CustomObject mapRow(ResultSet rs,int rowNum)抛出SQLException {CustomObject co = null;
    尝试{
 co = new CustomObject();
       idRecord = rs.getNString(" Field1");
       co.setField1(idRecord);
       co.setField2(rs.getNString(" Field2"));
       ...
       co.setField3(rs.getDouble(" Field3")); 
} catch(异常e){

       logger.error("错误[{}]。无法读取ID为[{}]的记录。",e,idRecord);

    }
    返回t
 } 

2-引发查询并获取信息的逻辑。

 @自动连线
 public void setJdbcTemplate(final JdbcTemplate jdbcTemplate){
     this.jdbcTemplate = jdbcTemplate;
 } 
 private int bloquesPorFetch = 4; 
公共静态最终字符串QUERY_SELECT =" SELECT ...."; 
公共DataPage Obtener(最终DataPage dp){
    尝试{
//要查询的参数。
       List  parametrosTemp =(List )dp.getParametros()。get(" params");

      //要在每个查询中获取的记录总数。
       parametrosTemp.add(dp.getPageSize());

      //要在查询中偏移的值。
       parametrosTemp.add(((dp.getPage()-1)* dp.getPageSize()); 
 
//pageSize =一百万条记录,此记录设置在应用程序的另一层中。
       jdbcTemplate.setFetchSize(dp.getPageSize()/bloquesPorFetch);
       List 记录= jdbcTemplate.query(
 QUERY_SELECT,parametrosTemp.toArray(),新的CustomObjectMapper());

       logger.info("正在获取[{}]条记录。",records.size());

       DataPage dpTemp =新的DataPage();
       dpTemp.setTotalRegistros(dp.getTotalRegistros());
       dpTemp.setPageSize(dp.getPageSize());
       dpTemp.setTotalPaginas(dp.getTotalPaginas());
       dpTemp.setResultado(records);

       返回dpTemp; 
} catch(DataAccessException e){
//包装原始异常原因并提供业务消息。
       抛出新的ServicioNoDisponibleException("数据库不可用。",e);
    } catch(异常e){
//包装原始异常原因并提供业务消息。
       抛出新的ServicioNoDisponibleException("无法处理该请求。",e);

    }

 } 

另一方面,我实现了一些测试,以尝试找出导致问题的记录块。 但是,信息化似乎不是问题。 实现的活动是:

-首先,我加载了大约一百万条记录,但我找不到错误。

-第二,我再加载一百万,我的意思是,加载了两百万条记录,我可以得到此错误。 此外,我还确定了可能导致问题的数据块。

-第三,我删除了所有信息,并刚刚加载了似乎引起问题的数据块

-最后,我再次执行了测试,但是我没有解决问题。

据此,我认为数据不是问题。

您能提供一些建议以尝试解决问题吗?

致谢。

一周热门 更多>