У вас уже есть связанное управляемое соединение (с использованием parallelStream (). Foreach ()) - PullRequest
0 голосов
/ 16 апреля 2020

javax.persistence.PersistenceException: org.hibernate.TransactionException: У вас уже есть связанное управляемое соединение. Вызвано: org.hibernate.TransactionException: У меня уже есть связанное управляемое соединение

Я использую parallelStream (). Foreach () Работает над концепцией многопоточности:

private void loadHcpDataIntoCassandra(ResultSet srcHcpData) throws SQLException {
    List<Map<String, Object>> hcpDataList = resultSetToList(srcHcpData);
    Cluster cluster = HcpDao.getCassandraConnection();
    List<String> tblSpecs = HcpDao.getTableSpecs();
    Session session = cluster.connect(tblSpecs.get(0));

    //Call prepareHcpAndLoad() method :-
    hcpDataList.parallelStream().forEach(hcpMap -> prepareHcpAndLoad(hcpMap, session));
    cluster.close();
}

Я упомянул выше исключение, и я заменяю ParallelsStream (). ForEach на

for (Map<String,Object> hcpMap : hcpDataList) {
    prepareHcpAndLoad(hcpMap, session);
}

Улучшение для l oop отлично работает для меня. Но мне нужна многопоточная концепция. Как решить эту проблему, даже если я использую parallelStream (). Foreach ()

private static void prepareHcpAndLoad(Map<String, Object> hcpMap, Session session) {

    String hcpHceId = "";
    for (Map.Entry<String, Object> entry : hcpMap.entrySet()) {
        String colName = entry.getKey();
        Object hcpTableRow = entry.getValue();

        hcpMasterData.setHcpHceId(hcpTableRow.toString());
        hcpHceId = hcpTableRow.toString();

    }

    /** Get MDM_id */
    MdmId mdm = new MdmId();
    mdm.setHcpHceId(hcpHceId);
    String mdmId = getMdmId(mdm);
    /** update mdmId */
    hcpMasterData.setMdmId(mdmId);

    mapper.save(hcpMasterData);
}

//@PersistenceContext
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
private static EntityManager em = getEntityManager();
public static String getMdmId(MdmId mdm) {

    if(em == null) {
        em = getEntityManager();
    }
    String mdmId = "";
    EntityTransaction tr = em.getTransaction();

    try {
        tr.begin(); //Error Line
        em.persist(mdm);
        em.flush();
        mdmId = Long.toString(mdm.getId());
        tr.commit();
    } catch (Exception error) {
        logger.error(error.getMessage());
        error.printStackTrace();
    }

    return mdmId;
}

private  static EntityManager getEntityManager() {
    return Persistence.createEntityManagerFactory("sql-connection").createEntityManager();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...