Как выполнить блок SQL / PL с переменными sql в Mybatis mapper, используя аннотации - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь выполнить пакетное выполнение, вставляя записи массово и выполняя SQL оценку, к которой я прибегаю к sql переменным, как я уже писал и использовал подобные переменные SQL ранее в динамическом c запросов, использующих sql переменных, объявленных в разделах sql / pl, таких как "DECLARE ... BEGIN ... END;" ,

Запросы генерируются и вставляются, но не фиксируются. Однако через несколько секунд я получаю следующее сообщение об ошибке:

<Mar 23, 2020 4:02:11 PM EDT> <Warning> <Socket> <BEA-000449> <Closing the socket, as no data read from it on 0:0:0:0:0:0:0:1:58,508 during the configured idle timeout of 5 seconds.> 
<Mar 23, 2020 4:12:22 PM EDT> <Error> <WebLogicServer> <BEA-000337> <[STUCK] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy for "616" seconds working on the request "Http Request Information: weblogic.servlet.internal.ServletRequestImpl@2ad39f52[POST /DemoApp/fileUpload]
", which is more than the configured time (StuckThreadMaxTime) of "600" seconds in "server-failure-trigger". Stack trace:

Вот RecordsMapper. java, который имеет блок запроса sql / pl:

@Select("DECLARE " + 
        "       record_no number(8); " + 
        "       prog_no number(8); " + 
        "       BEGIN " + 
        "            select (id+1) into record_no from Keyz where id_type='REC'; " + 
        "            update Keyz set id=id+1 where id_type='REC';      " + 
        "            select (id+1) into prog_no from Keyz where id_type=upper('rec'); " + 
        "            update Keyz set id=id+1 where id_type=upper('rec'); " + 
        "       ${deleteStatement}; " + 
        "       ${insertStatement}; " + 
        "    END; ")
void ProgramUploadBatch(Map<String, String> record);

Мой класс DaoImpl имеет :

@Repository("recordsdao")
public class RecordsDaoImpl extends SqlSessionDaoSupport implements RecordsDao,Serializable {

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Override
    try(SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)){     
            RecordsMapper recordsmapper = sqlSession.getMapper(RecordsMapper.class);
            for (Map<String, String> record : recordList) {
                recordsmapper.ProgramUploadBatch(record);   
            }
            sqlSession.commit(true);
        } catch (Exception e) {
            System.out.println("Error occured while performing execution: " + e.getCause());
        }

Класс контроллера:

@Autowired
private RecordsService recordsservice;
.
.
.
@RequestMapping(value="/fileUpload")
public String demoApp(){
  recordsservice.ProgramUploadBatch(allQueries);  
}

Здесь я пытаюсь выполнить операцию удаления, вставив предварительно сгенерированный запрос на удаление в ${deleteStament}, и вставить операцию с помощью вставка новой записи в ${insertStatement}, которая также будет предварительно сгенерированным запросом со значениями. Обе переменные record_no и prog_no используются в предварительно сгенерированных запросах.

Редактировать: после разбивки запросов на запросы * stati c я заметил, что метод обновления не обновляет кортеж и застревает оттуда.

...