Получение java.sql.SQLException: транзакции не поддерживаются. Ошибка при вызове Spring Boot Rest API с базой данных Informix.

Я создал простое приложение Spring для загрузки, которое может получать/отправлять данные в базу данных Informix.

Вызывая Rest API, получая ниже упомянутое сообщение об ошибке, я искал основную причину примерно того же, но не нашел никаких источников,

Ценю помощь в этом. Вот конфигурация и код, которые я создал:

application.properties

spring.datasource.url=jdbc:informix-sqli://XXXX:XXXX/localdb:INFORMIXSERVER=ol_xxxxx
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.informix.jdbc.IfxDriver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.InformixDialect
spring.jpa.hibernate.ddl-auto=update

Наряду с Spring Starter Web, Data JPA, Dev Tools, добавленными ниже дополнительной зависимости

   <dependency>
        <groupId>com.ibm.informix</groupId>
        <artifactId>jdbc</artifactId>
        <version>4.10.8.1</version>
    </dependency>

Контроллер отдыха

@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    UserRepository repository;
    
    @GetMapping("/user/{userId}")
    public void getUserDetails(@PathVariable Long countryId) {
      Optional<webCountry> country = repository.findById(countryId);
      System.out.println(country);
    }
    
    @PostMapping(path="/saveuser")
    public void saveUser(@RequestBody UserEntity user) {
        repository.save(data);
    }
}

Интерфейс репозитория

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

}

При вызове Get API из сообщения Человек получает сообщение об ошибке ниже

    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.TransactionException: JDBC begin transaction failed: ] with root cause

java.sql.SQLException: Transactions not supported
    at com.informix.util.IfxErrMsg.buildException(IfxErrMsg.java:474) ~[jdbc-4.10.8.1.jar:4.10.8.1]
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:443) ~[jdbc-4.10.8.1.jar:4.10.8.1]
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:394) ~[jdbc-4.10.8.1.jar:4.10.8.1]
    at com.informix.jdbc.IfxSqliConnect.setAutoCommit(IfxSqliConnect.java:2426) ~[jdbc-4.10.8.1.jar:4.10.8.1]
    at com.zaxxer.hikari.pool.ProxyConnection.setAutoCommit(ProxyConnection.java:414) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyConnection.setAutoCommit(HikariProxyConnection.java) ~[HikariCP-3.4.5.jar:na]
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.begin(AbstractLogicalConnectionImplementor.java:72) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final]
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:282) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:246) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final]
    at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:83) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final]
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:184) ~[spring-orm-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:402) ~[spring-orm-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400) ~[spring-tx-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) ~[spring-tx-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:574) ~[spring-tx-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:361) ~[spring-tx-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178) ~[spring-data-jpa-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) ~[spring-aop-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar:5.2.12.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.12.RELEASE.jar:5.2.12.RELEASE]

person Mahesh    schedule 13.01.2021    source источник


Ответы (3)


Это может иметь одну или несколько из следующих причин:

  • Неверный IP-адрес или имя хоста в URL-адресе JDBC.
  • Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
  • Номер порта отсутствует или указан неверно в URL-адресе JDBC.
  • Сервер БД не работает.
  • Сервер БД не принимает соединения TCP/IP.
  • Сервер БД исчерпал соединения.
person Vinayak Mittal    schedule 13.01.2021
comment
Как все это связано с исключением, указанным в заголовке вопроса: java.sql.SQLException: Transactions not supported? - person Jonathan Leffler; 18.01.2021

Informix предоставляет четыре различных типа баз данных:

  • незарегистрированный
  • Буферизованное ведение журнала
  • Небуферизованное ведение журнала
  • РЕЖИМ ведения журнала без буферизации ANSI

Незарегистрированная база данных не имеет журнала транзакций и, следовательно, не поддерживает транзакции. Все остальные типы поддерживают транзакции; различия между сортами сейчас не актуальны.

Тип базы данных по умолчанию, когда вы говорите CREATE DATABASE xyz, является нерегистрируемой базой данных. Вы должны сказать WITH LOG или WITH BUFFERED LOG или WITH LOG MODE ANSI, чтобы создать базу данных с журналом транзакций.

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

При необходимости (а это, вероятно, необходимо) DBSA (системный администратор базы данных — обычно это означает, что кто-то с привилегиями работать как пользователь informix) может изменить режим ведения журнала. Переключение на буферизованное ведение журнала, вероятно, подходит. DBSA может либо использовать ontape для изменения режима при выполнении резервного копирования сервера, либо использовать ondblog (но даже в этом случае резервное копирование — хорошая идея):

ontape -s -B xyz

ondblog buf xyz

См. раздел Управление режимом ведения журнала базы данных для более подробной информации.

При попытке запустить транзакцию в незарегистрированной базе данных Informix создается следующее сообщение об ошибке:

-256 Transaction not available.

Команда Informix finderr показывает:

$ finderr -256
-256    Transaction not available.

You cannot begin a transaction in this database because it does not
have a transaction log. In order to support transactions, you must
start a transaction log. Refer to your Administrator's Guide for
information on how to start a transaction log.

$
person Jonathan Leffler    schedule 13.01.2021
comment
Команда СОЗДАТЬ БАЗУ ДАННЫХ трамвай_des2 С БУФЕРИРОВАННЫМ ЖУРНАЛОМ; работал на мой. - person Victor Rodriguez; 21.06.2021

Как только вы можете попробовать, добавив аннотацию @Transactional в свой репозиторий. см.: https://www.baeldung.com/transaction-configuration-with-jpa-and-spring

person Ajit    schedule 14.01.2021