Время отклика выше, когда я вызываю процедуру в oracle через простой вызов Jdbc по сравнению с локальной средой - PullRequest
0 голосов
/ 05 февраля 2019

Я написал API, используя spring для вызова хранимой процедуры с типом таблицы в качестве входного параметра paremter и number out.Когда я называю это API, это занимает около 2 минут, чтобы получить результаты.Но когда я запускаю эту процедуру в среде оракула, она занимает не более 2 секунд.Я заметил, что на рукопожатие тратится больше времени.

Есть ли лучший способ улучшить мое решение и сократить время отклика API.

Примечание: размер orderList в моем случае не более 5.

Java Code

public class getOrders(ApprovalAction approvalActionObj)
{ 
List<Orders> orderList= approvalActionObj.getApprovalQsType();

    SimpleJdbcCall jdbcCall = new 
    SimpleJdbcCall(jdbcTemplate).withProcedureName("XX_PROCEDURE")
    .withCatalogName("XX_PACKAGE").withoutProcedureColumnMetaDataAccess()
    .declareParameters(
    new SqlParameter("P_ORDER_ROLLUP", Types.ARRAY,"ALG_ORDER_TAB"),
    new SqlOutParameter("O_ERROR_MESSAGE", Types.NUMBER));
//Edited
jdbcCall.getJdbcTemplate().setNativeJdbcExtractor(new 
OracleJdbc4NativeJdbcExtractor());
Object[][] orderArray = new Object[ordersList.size()][2];   

for(int actionIndex = 0; actionIndex < ordersList.size(); actionIndex++) 
{

   ordersArray[actionIndex][0] = orderList.get(actionIndex).getId();
   ordersArray[actionIndex][1] = orderList.get(actionIndex).getType();
}
  Map<String, Object> orderResult=jdbcCall.execute(new 
  MapSqlParameterSource().addValue("P_ORDER_ROLLUP", new 
  SqlArrayValue(orderArray)));

Integer errorMsg = (String) orderResult.get("O_ERROR_MESSAGE"); 
}

DabaseConfigClass

@Configuration
public class DataBaseConfig {
  private static final Log LOGGER = LogFactory.getLog(DataBaseConfig.class);
  @Autowired
  private Environment environment;
  @Bean(name = "jdbcTemplate")
  public JdbcTemplate jdbcTemplate() throws SQLException {
    OracleDataSource dataSource = new OracleDataSource();

    String url = environment.getProperty("spring.db.jdbc.url");
    String userName = environment.getProperty("spring.db.username");
    String password = environment.getProperty("spring.db.password");
    String driver = environment.getProperty("spring.db.driver-classname");

    dataSource.setUser(userName);
    dataSource.setPassword(password);
    dataSource.setURL(url);
    dataSource.setDriverType(driver);
    return new JdbcTemplate(dataSource);
    }
}

РЕДАКТИРОВАТЬ 1:

При реализации пула соединений со следующим DataBaseConfig выдается ошибка.

@Configuration public class DataBaseConfig { 
  @Bean 
  public HikariDataSource getDataSource() { 

     HikariConfig config = new HikariConfig(); 
     HikariDataSource ds; 
     config.setDriverClassName(className); 
     config.setJdbcUrl(Url); 
     config.setUsername(userName); 
     config.setPassword(passWord); 
     config.addDataSourceProperty("cachePrepStmts", "true"); 
     config.addDataSourceProperty("prepStmtCacheSize", "250"); 
     config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); ds = new 
     HikariDataSource(config);  
     return ds; 
    } 
  }

ОШИБКА:

java.lang.ClassCastException: com.zaxxer.hikari.pool.HikariProxyConnection cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.TypeDescriptor.setPhysicalConnectionOf(TypeDescriptor.java:817) ~[ojdbc6-11.2.0.3.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"]
at oracle.sql.TypeDescriptor.<init>(TypeDescriptor.java:604) ~[ojdbc6-11.2.0.3.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"]
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:272) ~[ojdbc6-11.2.0.3.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"]
at org.springframework.data.jdbc.support.oracle.SqlArrayValue.createTypeValue(SqlArrayValue.java:90) ~[spring-data-oracle-1.2.1.RELEASE.jar:na]
at org.springframework.jdbc.core.support.AbstractSqlTypeValue.setTypeValue(AbstractSqlTypeValue.java:60) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:293) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:232) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:209) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1090) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1146) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:413) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:373) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:197) ~[spring-jdbc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at com.springjdbc.example.springjdbc.Dao.EmployeeDao.uploadRecords(EmployeeDao.java:145) ~[classes/:na]
at com.springjdbc.example.springjdbc.Controller.EmployeeController.getEmployeeList(EmployeeController.java:31) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_201]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_201]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_201]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.14.jar:9.0.14]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_201]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.14.jar:9.0.14]
at java.lang.Thread.run(Unknown Source) [na:1.8.0_201]

РЕДАКТИРОВАТЬ 2:

uploadCall.getJdbcTemplate().setNativeJdbcExtractor(new 
OracleJdbc4NativeJdbcExtractor());

Необходимо добавить этот кусок кода для ошибки приведения.

1 Ответ

0 голосов
/ 01 марта 2019

Наконец-то, после многих поисков и реализации нескольких сценариев.Я нашел одну вещь, которая должна быть реализована для повышения производительности при использовании типа таблицы;

1) Нам нужно использовать дескриптор массива и дескриптор структуры для создания типа таблицы вместо массива объектов.

OracleConnection connection = uploadCall.getJdbcTemplate().getDataSource().getConnection().unwrap(OracleConnection.class);
StructDescriptor desc1=StructDescriptor.createDescriptor("XX_TYP",connection);
ArrayDescriptor desc2=ArrayDescriptor.createDescriptor("XX_TAB",connection);
Object[] p1arrobj = new Object [uploadList.size()];
for(int i=0;i<orderList.size();i++)
{
    Object [] p1recobj = {orderList.get(i).getId(),orderList.get(i).getType()};
    STRUCT p1struct = new STRUCT(desc1,connection,p1recobj);
    p1arrobj[i]=p1struct;
}
ARRAY p1arr = new ARRAY(desc2,connection,p1arrobj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...