Не удалось получить JDB C Соединение / транзакция не активны - PullRequest
0 голосов
/ 14 января 2020

Я борюсь с вызовом в мою базу данных через Spring Jdb c, ни один из вопросов о переполнении стека не работает для меня, поэтому я и задаю его.

Вот мой DAO

public class CruDao extends JdbcDaoSupport implements ICruDao{

    private final Logger LOG = LoggerFactory.getLogger(CruDao.class);

    @Override
    public String obtainCode(String codiModel) {
        String code = null;

        SimpleJdbcCall funcio = new SimpleJdbcCall(getJdbcTemplate()).withFunctionName("funcCru");
        MapSqlParameterSource parameter = new MapSqlParameterSource().addValue("id", codiModel);

        try {
            code = funcio.executeFunction(String.class, parameter);
            LOG.debug("Generated Code: " + code);

        }catch(Exception ex){
            LOG.error("Error",ex);
        }

        return codiCRU;
    }

}

Вот исключение, которое выдает при вызове строки executeFunction:

org.springframework.dao.DataAccessResourceFailureException: Error retreiving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f5796c1:d4ac:5e1c3647:9ff status: ActionStatus.ABORTED >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f5796c1:d4ac:5e1c3647:9ff status: ActionStatus.ABORTED >)

Я правильно объявил компоненты для источника данных с информацией базы данных. enter image description here

РЕДАКТИРОВАТЬ Метод, в котором я называю мой DAO, уже был @ Transactional

@Override
    @Transactional
    public byte[] obtenirModel(String codiModel) {

        byte[] genDocByteArray = null;

        codiCRU = cruDao.obtainCode(codiModel);

        if(codiCRU == null || codiCRU.length() < 1){
            log.error("Errorrr");
            return null;
        }

        ...

Чего мне не хватает? Спасибо за совет.

1 Ответ

0 голосов
/ 14 января 2020

Вы должны иметь активную транзакцию при доступе к БД. Вы определили bean-компонент менеджера транзакций в своем xml, но не используете его. Вам нужно аннотировать сервисный метод @Transactional, который вызывает этот метод obtainCode. Также обратите внимание, что аннотированный метод @Transactional должен быть опубликован c и вызван из другого компонента (из-за механизма проксирования), чтобы он работал правильно.

...