【杂谈\Java\数据库】SpringMVC 连接MySQL超时问题解决方案

当SpringMVC项目在服务器上运行时遇到MySQL连接超时问题,可以通过分析错误日志发现是由于wait_timeout导致的连接断开。MySQL的wait_timeout参数表示非交互连接在多久后会被关闭。解决方案是在数据库配置中启用验证查询和测试机制,如在DBCP的bean.xml配置文件中设置validationQuery和testOnBorrow等属性,确保连接池中的连接在使用前进行验证和测试,保持连接活跃。
摘要由CSDN通过智能技术生成

      这几天一直在烦恼这个问题!关于SpringMVC&Spring&MySQL项目上传到服务器上时,超过一定时间以后就没法再访问的问题而且还有一点就是,我在排查故障的时候发现,Tomcat服务器和MySQL服务压根就没关闭过!下面是报错的内容:

PS:很长!!可以直接翻到最后去看,这里主要是看看大伙儿有木有通过下面的报错信息得到和我一样的答案,有的话证明!你很厉害!我找这个错误可花了3天的时间。。。

HTTP Status 500 - Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:

type Exception report

message Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed: 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    cn.com.dnyy.web.SystemContextFilter.doFilter(SystemContextFilter.java:32)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed: 
    org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:596)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:334)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    com.sun.proxy.$Proxy23.list(Unknown Source)
    cn.com.dnyy.web.MainController.index(MainController.java:99)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    cn.com.dnyy.web.SystemContextFilter.doFilter(SystemContextFilter.java:32)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause

org.hibernate.TransactionException: JDBC begin failed: 
    org.hibernate.transaction.JDBCTransact
### 回答1: 要在Spring MVC连接MySQL数据库,您需要首先在项目的pom.xml文件中添加MySQL的驱动依赖。然后,在Spring配置文件中配置数据源并建立与数据库连接。最后,使用标准的JDBC代码执行数据库操作。 ### 回答2: Spring MVC是一个基于MVC架构模式的Web框架,支持与多种数据源交互,其中包括MySQL数据库。在Spring MVC连接MySQL数据库,需要进行以下步骤: 1. 导入MySQL驱动 在项目pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>{version}</version> </dependency> ``` 其中version为MySQL驱动版本。 2. 配置数据源 在Spring MVC项目中,可以通过配置文件或Java代码的方式配置数据源。以下以配置文件的方式为例: 在项目src/main/resources目录下创建datasource.properties文件,配置数据源相关属性,例如: ```properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test?useSSL=false jdbc.username=root jdbc.password=123456 ``` 其中jdbc.driver为MySQL驱动类名,jdbc.url为数据库连接地址,其中test为数据库名,useSSL=false表示关闭SSL连接加密,jdbc.username和jdbc.password为连接数据库的用户名和密码。 3. 使用JdbcTemplate操作MySQL JdbcTemplate是Spring Framework提供的基于JDBC的操作数据库的工具类,常用于执行SQL语句和处理结果集。在Spring MVC中,可以通过注入JdbcTemplate的方式,连接MySQL数据库进行操作。 在Web项目中,可以通过在配置文件或Java类中定义JdbcTemplate的bean对象来进行注入。以下是在Java类中定义的代码示例: ```java @Configuration public class DataSourceConfig { @Value("${jdbc.driver}") private String jdbcDriver; @Value("${jdbc.url}") private String jdbcUrl; @Value("${jdbc.username}") private String jdbcUsername; @Value("${jdbc.password}") private String jdbcPassword; @Bean public JdbcTemplate jdbcTemplate() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(jdbcDriver); dataSource.setUrl(jdbcUrl); dataSource.setUsername(jdbcUsername); dataSource.setPassword(jdbcPassword); return new JdbcTemplate(dataSource); } } ``` 在上述代码中,使用了@Configuration注解,表示该类为配置类。@Value注解用于引用datasource.properties文件中的属性值。在@Bean注解中定义了JdbcTemplate的bean对象,在创建bean时,新建了一个DriverManagerDataSource的实例,设置了MySQL数据源相关属性,然后将这个数据源对象注入到JdbcTemplate对象中。 现在,我们可以在Controller中使用JdbcTemplate对MySQL数据库进行操作。以下是部分代码示例: ```java @Controller public class UserController { @Autowired private JdbcTemplate jdbcTemplate; @RequestMapping("/user/list") public ModelAndView userList() { ModelAndView mv = new ModelAndView(); List<Map<String, Object>> userList = jdbcTemplate.queryForList("SELECT * FROM user"); mv.addObject("userList", userList); mv.setViewName("user/list"); return mv; } } ``` 在上述代码中,使用@Autowired注解将JdbcTemplate对象注入到UserController中。在userList方法中,使用JdbcTemplate的queryForList方法查询数据库中user表中的所有记录,并将查询结果添加到ModelAndView中,然后返回视图url。 以上是Spring MVC连接MySQL数据库的过程。这种方式可以快速、便捷地连接和操作MySQL数据库,实现数据的持久化。 ### 回答3: Spring MVC 是一个非常流行的Web框架,它提供了一个强大的MVC架构,结合了Spring框架的核心功能,使得我们可以轻松创建Web应用程序。而MySQL是一种关系型数据库,与Spring MVC结合使用能够实现数据存储和管理。下面是Spring MVC连接MySQL数据库的过程: 1. 首先要确保已经在项目中添加了MySQL的依赖,如: ``` <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> ``` 2. 接着在Spring MVC的配置文件中(applicationContext.xml)添加连接MySQL数据库的配置: ``` <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> ``` 以上配置设置了MySQL的驱动、url、用户名和密码。其中,serverTimezone是设置时区,一定要根据自己所在的时区进行设置,否则可能会引起时间错误。mydb是自己创建的数据库名,这里可以进行修改。 3. 在DAO类中使用Spring框架提供的JdbcTemplate对数据库进行操作: ``` @Repository public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public User getUserById(int id) { String sql = "SELECT * FROM user WHERE id=?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class)); } //省略其他方法.... } ``` 在上述代码中,通过@Autowired注解将JdbcTemplate注入到DAO类中。而getUserById方法则是使用JdbcTemplate来查询数据库中的用户信息,queryForObject方法是查询单条记录的方法,其中BeanPropertyRowMapper会自动将数据库查询结果封装为一个User对象。 以上就是Spring MVC使用MySQL连接数据库的过程。通过这种方式,我们可以非常方便地对MySQL数据库进行操作。同时,Spring MVCMySQL之间的配合使用,还能够实现数据的交互,实现数据的存储和读取,让开发人员轻松打造出效且能力强大的Web应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值