Hibernate 并发用户在插入记录时出现死锁

Hibernate 并发用户在插入记录时出现死锁,hibernate,spring-boot,Hibernate,Spring Boot,我正在使用jmeter进行测试,当超过5个用户登录并使用hibernate插入记录时,我的原因是: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 登录后,我使用userId、username创建令牌,并按创建日期从令牌中获取userId,并使用此userId插入记录 代币 i

我正在使用jmeter进行测试,当超过5个用户登录并使用hibernate插入记录时,我的原因是:

com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
登录后,我使用
userId、usernam
e创建令牌,并按创建日期从令牌中获取userId,并使用此userId插入记录

代币

if (authToken != null) {
            String userName = tokenUtils.getUsernameFromToken(authToken);
            beanConfig.setConfig(authToken);
            /*Set<String> roles = tokenUtils.getUserRoleFromToken(authToken);
            CustomSecurityContext.setUserRoleSet(roles);*/
            UserDTO userDto = new UserDTO();
            userDto.setUsername(userName);
            if (userName != null && tokenUtils.validateToken(authToken, userDto).booleanValue()) {
                logger.info("token validate....:" + userName);
                filterChain.doFilter(request, response);
                return;

            } else {
                // Removing entry for token in TokenIdleTimeMap used for
                // tracking idle time expiration date
                tokenUtils.removeEntryFromTokenIdleTimeMap(authToken);
                logger.info("Token Expired or session time out please login again>>>>>>>");
                httpResponse.setContentType("application/json");
                httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                httpResponse.getWriter().write(sendApiResponse());
                return;
            }

        }
        filterChain.doFilter(request, response);
        return;
    } 
我在.xml文件中进行所有配置,因此下面是web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>PAMS</display-name>
   <welcome-file-list>
    <welcome-file>/</welcome-file>
  </welcome-file-list>
  <context-param>
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/springConfig-servlet.xml,/WEB-INF/PAMSSecurity.xml,/WEB-INF/spring-beans.xml</param-value>
  </context-param>
  <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param> 
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

   <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>
      org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
  </listener>
  <filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>com.vl.pam.filter.CorsFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Below is security.xml 

<beans:bean id="concurrencyFilter"
        class="org.springframework.security.web.session.ConcurrentSessionFilter">
        <beans:property name="sessionRegistry" ref="sessionRegistry" />
        <beans:property name="expiredUrl" value="/session-expired.htm" />
    </beans:bean>


    <beans:bean id="sas"
        class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
        <beans:constructor-arg name="sessionRegistry"
            ref="sessionRegistry" />
        <beans:property name="maximumSessions" value="1" />
    </beans:bean>

    <!-- Successful Authentication Handler -->

    <beans:bean id="sessionRegistry"
        class="org.springframework.security.core.session.SessionRegistryImpl" />

    <!-- Request Filters -->
    <http auto-config="true" use-expressions="true" 
        authentication-manager-ref="authenticationManager">

        <custom-filter ref="authenticationTokenProcessingFilter"
            position="PRE_AUTH_FILTER" />
        <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
        <intercept-url pattern="/logout" access="permitAll" />
        <session-management
            session-authentication-strategy-ref="sas" />

    </http>


    <authentication-manager id="authenticationManager"/>
         <!-- <authentication-provider user-service-ref="customUserDetailsService">
        </authentication-provider> 
    </authentication-manager>

    <beans:bean id="customUserDetailsService"
        class="com.vl.pam.service.CustomUserDetailsServiceImpl">
    </beans:bean>   -->

    <beans:bean id="authenticationTokenProcessingFilter"
        class="com.vl.pam.authentication.AuthenticationTokenProcessingFilter"></beans:bean>

    <beans:bean id="passwordEncoder"
        class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
    </beans:bean>

<!--    <beans:bean id="unauthorizedEntryPoint"
        class="com.vl.pam.authentication.UnauthorizedEntryPoint"></beans:bean> -->

</beans:beans>

帕姆斯
/
上下文配置位置
/WEB-INF/springConfig servlet.xml、/WEB-INF/PAMSSecurity.xml、/WEB-INF/spring-beans.xml
springDispatcherServlet
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
1.
springDispatcherServlet
/
org.springframework.web.context.ContextLoaderListener
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
org.springframework.security.web.session.HttpSessionEventPublisher
克斯菲尔特
com.vl.pam.filter.CorsFilter
克斯菲尔特
/*
下面是security.xml
下面是springConfig-servlet.xml

 <mvc:annotation-driven />
    <mvc:view-controller path="/" view-name="index" />
    <context:component-scan base-package="com.vl.pam"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
            <value>classpath:application.properties</value>
                    <!-- <value>file:#{systemProperties.propertiesFilePath}/application.properties</value> -->
            </list>
        </property>
    </bean>


    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="20971520" />
    </bean>



    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <!-- <property name="dataSource" ref="dataSource" /> -->
        <property name="hibernateProperties">   
        <props>
                <!-- <prop key="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</prop> -->
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                <!-- <prop key="hibernate.connection.url"> jdbc:sqlserver://10.10.52.195:1433;databaseName=pamsvaluelabs_erpportal</prop> -->
                <prop key="hibernate.connection.url"> jdbc:mysql://10.10.53.221:3306/PAMS_DEV</prop>
                <!-- <prop key="hibernate.connection.username">pamstestuser</prop>
                <prop key="hibernate.connection.password">Value*123</prop> -->
                <prop key="hibernate.connection.username">root</prop>
                <prop key="hibernate.connection.password">Secure@789</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>  
                <!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.timeout">300</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_period">3000</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.c3p0.acquire_increment">1</prop>
                <prop key="hibernate.c3p0.numHelperThreads">6</prop> 

            </props>            
        </property>

        <property name="mappingJarLocations">
            <list>
            </list>
        </property>

        <property name="packagesToScan">
            <list>
            <value>com.vl.pam.model</value>
            </list>
        </property>

    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

     <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="edit*" propagation="REQUIRED" />
            <tx:method name="saveOrUpdate*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="upload*" propagation="REQUIRED" />
            <tx:method name="roleEdit*" propagation="REQUIRED" />


            <tx:method name="post*" propagation="REQUIRED" read-only="true" />
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />
            <tx:method name="search*" propagation="REQUIRED" read-only="true" />
            <tx:method name="datagrid*" propagation="REQUIRED"  read-only="true" />

            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice> 


     <aop:config>
        <aop:pointcut id="transactionPointcut"
            expression="execution(* com.vl.pam.service.*.*(..)) || execution(* com.vl.pam.*.service.*.*(..))|| execution(* com.vl.pam.*.*(..)) || execution(* com.vl.pam.*.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut"
            advice-ref="transactionAdvice" />
    </aop:config>  



     <bean id="httpComponentsClientHttpRequestFactory"
        class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory" />

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="httpComponentsClientHttpRequestFactory" />
    </bean>
</beans>

/WEB-INF/views/
.jsp
类路径:application.properties
com.mysql.jdbc.Driver
jdbc:mysql://10.10.53.221:3306/PAMS_DEV
根
Secure@789
更新
org.hibernate.dialogue.mysqldialogue
5.
20
300
50
3000
假的
1.
6.
com.vl.pam.model

发布一些代码和更多配置。假设您使用的是ASpring引导配置数据源,
hibernate.connection
hibernate.c3p0
属性是无用的。我提醒您,您没有使用Spring Boot配置的数据源,而是使用普通的hibernate,您可能有配置错误的地方。编辑问题。。使用一些配置文件。您发布的代码片段使您无法获得完整信息。如前所述,您的
hibernate.connection
hibernate.c3p0
属性是无用的。您在我们的应用程序中也有重复的事务管理。为什么您既有
tx:annotation-driven
又有
,您通常不需要这两者。发布所有.xml配置文件,但不发布控制器和服务层。
 <mvc:annotation-driven />
    <mvc:view-controller path="/" view-name="index" />
    <context:component-scan base-package="com.vl.pam"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
            <value>classpath:application.properties</value>
                    <!-- <value>file:#{systemProperties.propertiesFilePath}/application.properties</value> -->
            </list>
        </property>
    </bean>


    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="20971520" />
    </bean>



    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <!-- <property name="dataSource" ref="dataSource" /> -->
        <property name="hibernateProperties">   
        <props>
                <!-- <prop key="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</prop> -->
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                <!-- <prop key="hibernate.connection.url"> jdbc:sqlserver://10.10.52.195:1433;databaseName=pamsvaluelabs_erpportal</prop> -->
                <prop key="hibernate.connection.url"> jdbc:mysql://10.10.53.221:3306/PAMS_DEV</prop>
                <!-- <prop key="hibernate.connection.username">pamstestuser</prop>
                <prop key="hibernate.connection.password">Value*123</prop> -->
                <prop key="hibernate.connection.username">root</prop>
                <prop key="hibernate.connection.password">Secure@789</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>  
                <!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.timeout">300</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_period">3000</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.c3p0.acquire_increment">1</prop>
                <prop key="hibernate.c3p0.numHelperThreads">6</prop> 

            </props>            
        </property>

        <property name="mappingJarLocations">
            <list>
            </list>
        </property>

        <property name="packagesToScan">
            <list>
            <value>com.vl.pam.model</value>
            </list>
        </property>

    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

     <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="edit*" propagation="REQUIRED" />
            <tx:method name="saveOrUpdate*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="upload*" propagation="REQUIRED" />
            <tx:method name="roleEdit*" propagation="REQUIRED" />


            <tx:method name="post*" propagation="REQUIRED" read-only="true" />
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />
            <tx:method name="search*" propagation="REQUIRED" read-only="true" />
            <tx:method name="datagrid*" propagation="REQUIRED"  read-only="true" />

            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice> 


     <aop:config>
        <aop:pointcut id="transactionPointcut"
            expression="execution(* com.vl.pam.service.*.*(..)) || execution(* com.vl.pam.*.service.*.*(..))|| execution(* com.vl.pam.*.*(..)) || execution(* com.vl.pam.*.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut"
            advice-ref="transactionAdvice" />
    </aop:config>  



     <bean id="httpComponentsClientHttpRequestFactory"
        class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory" />

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="httpComponentsClientHttpRequestFactory" />
    </bean>
</beans>