Spring-boot Web 项目无法插入/保存/更新 Wildfly 容器的数据库查询,但适用于 Tomcat 容器

Posted

技术标签:

【中文标题】Spring-boot Web 项目无法插入/保存/更新 Wildfly 容器的数据库查询,但适用于 Tomcat 容器【英文标题】:Spring-boot web project can't insert/save/update DB query for Wildfly container but work for Tomcat container 【发布时间】:2021-05-27 01:48:55 【问题描述】:

我正在使用

wildfly-21.0.0 spring boot-2.4.0 mysql-8.0.23

依赖(pom.xml)

<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

配置

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
    import org.springframework.orm.jpa.JpaVendorAdapter;
    import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;
    
    import javax.sql.DataSource;
    import java.util.Properties;
    
    @Configuration
    public class SessionFactoryConfig 
    
        @Autowired
        DataSource dataSource;
    
        @Autowired
        JpaVendorAdapter jpaVendorAdapter;
    
    
        @Bean
        public LocalSessionFactoryBean sessionFactory() 
            LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
            sessionFactory.setPackagesToScan("com.example.abc");
            sessionFactory.setDataSource(dataSource);
            sessionFactory.setHibernateProperties(hibernateProperties());
    
    
            return sessionFactory;
        
    
    private Properties hibernateProperties() 
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.ddl.auto", "none");
        hibernateProperties.setProperty("hibernate.connection.autocommit", "true");
        hibernateProperties.setProperty("hibernate.connection.release_mode", "auto");  
        hibernateProperties.setProperty("hibernate.show_sql", "true");
        hibernateProperties.setProperty("hibernate.format_sql", "true");
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
        hibernateProperties.setProperty("hibernate.current_session_context_class", 
        "org.springframework.orm.hibernate5.SpringSessionContext");        
        return hibernateProperties;
    
    

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.maximum-pool-size=100


spring.datasource.tomcat.max-active=80
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.initial-size=20
spring.datasource.tomcat.time-between-eviction-runs-millis=60005
spring.datasource.tomcat.validation-query:"SELECT 1"

spring.datasource.dbcp2.test-on-borrow=true
spring.datasource.dbcp2.remove-abandoned-on-borrow=true
spring.datasource.dbcp2.remove-abandoned-timeout=30
 

不适用于 wildfly,但适用于 Tomcat

public class entityDao
    @Autowired
    SessionFactory sessionFactory;
    public  void update(Entity1 entity1)

      this.sessionFactory.getCurrentSession().update(entity1);
    


 

如果我替换

this.sessionFactory.getCurrentSession().update(entity1);

this.sessionFactory.getCurrentSession().getTransction.begin();
this.sessionFactory.getCurrentSession().update(entity1);
this.sessionFactory.getCurrentSession().getTransction.commit();

然后它在wildfly中工作正常。

所有 SELECT 查询在两个容器中都可以正常工作。更新/插入查询中的唯一问题。

【问题讨论】:

@Transactional 添加到您的 dao 或服务中,没有它您正在运行。此外,您对数据源的 application.properties 配置没有任何意义。我也会放弃SessionFactory,而只使用Spring配置的EntityManager 我给了`@Transactional`,但它不起作用。 仅添加它是行不通的,因为您还需要事务管理器。您正在使用 Spring Boot,所以我建议放弃休眠配置,而改用自动配置的 JPA 实体管理器。 【参考方案1】:

我得到了这个解决方案。

删除 SessionFactoryConfig.java

在 Application.java 文件中使用 @EnableJpaAuditing。

【讨论】:

以上是关于Spring-boot Web 项目无法插入/保存/更新 Wildfly 容器的数据库查询,但适用于 Tomcat 容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot,无法使用 spring-data JPA 在 MySql 中保存 unicode 字符串

如何将 Spring-Boot Web 服务转换为 Docker 映像?

Spring-Boot快速搭建web项目详细总结

spring-boot 项目启动过慢问题

我应该将jsp文件放在spring-boot项目中的位置

Spring-Boot,无法使用spring-data JPA在MySql中保存unicode字符串