mysql invalid driver_MYSQL连接无效的问题

Throwable occurred: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 50,123,505 milliseconds ago.  The last packet sent successfully to the server was 50,123,505 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

这主要是由两个原因引起来的:

1.mysql 会自动关闭长时间不用的connection,一个连接如果处于sleep状态达到mysql的参数wait_timeout指定的时间(默认为8小时),就是自动关闭这个连接

2.common pool中没有指定相应的连接检查参数

解决办法:从common pool的配置参数来解决:

${db.driver}

${db.url}

${db.user}

${db.password}

100

50

10000

3600000

true

select 1 from dual

使用上述的三个红色的参数,就可以避免这个问题.这三个参数的意义:

timeBetweenEvictionRunsMillis:启动connection校验定时器,定时器运行时间间隔就是timeBetweenEvictionRunsMillis的值.默认为-1,表示不启动定时器,这里设定为1小时,只要小于mysql的wait_timeout就可以了

testWhileIdle: true,表示检查idle的connection,false为不检查

validationQuery:用于检查connection的sql语句.

这只是一种方法,另外的几种方法:

timeBetweenEvictionRunsMillis+minEvictableIdleTimeMillis:这种方式不检查Connection的有效性,而是检查连接的空闲时间,大于minEvictableIdleTimeMillis就清除.

3600000

120000

如果不喜欢用定时器,也可以配置testOnBorrow+validationQuery参数:每次从连接池取参数都会校验连接的有效性.实际上这种方式性能会比定时器差些.

true

select 1 from dual

另外,也可以用testOnReturn+validationQuery,不过未必会解决问题:这表示每次使用完连接,归还连接池的时候检查连接的有效性,这有可能导致使用一次无效的连接,最好不要用.

上面的几种方法可以合并使用,只是检查的点多了,未必是好事

另外,也可以使用Abandoned的那几个参数,来删除连接池中的连接.也能达到效果.我没测试.

转自 http://www.blogjava.net/super/archive/2006/01/13.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Eclipse中连接MySQL数据库并实现登录功能,需要进行以下步骤: 1. 下载并安装MySQL数据库,并创建一个新的数据库以存储用户信息。 2. 在Eclipse中创建一个Java Web项目,并导入MySQL的JDBC驱动程序。 3. 创建一个名为"DBConnection"的Java类,用于连接MySQL数据库和执行SQL查询。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBConnection { private static final String DB_DRIVER = "com.mysql.jdbc.Driver"; private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String DB_USERNAME = "root"; private static final String DB_PASSWORD = "password"; public static Connection getConnection() throws SQLException { try { Class.forName(DB_DRIVER); } catch (ClassNotFoundException e) { System.out.println("Could not load database driver."); e.printStackTrace(); } return DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); } public static void closeConnection(Connection connection, Statement statement, ResultSet resultSet) { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { System.out.println("Failed to close database connection."); e.printStackTrace(); } } } ``` 4. 创建一个名为"Login"的Servlet,用于处理用户登录请求。 ```java import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Login extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { connection = DBConnection.getConnection(); statement = connection.createStatement(); String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"; resultSet = statement.executeQuery(query); if (resultSet.next()) { // 登录成功,跳转到主页 response.sendRedirect("index.jsp"); } else { // 登录失败,返回登录页面并显示错误信息 request.setAttribute("error", "Invalid username or password."); request.getRequestDispatcher("login.jsp").forward(request, response); } } catch (SQLException e) { e.printStackTrace(); } finally { DBConnection.closeConnection(connection, statement, resultSet); } } } ``` 5. 创建一个名为"login.jsp"的JSP页面,包含一个表单用于输入用户名和密码。 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form action="Login" method="post"> <label for="username">Username:</label> <input type="text" name="username" id="username"><br><br> <label for="password">Password:</label> <input type="password" name="password" id="password"><br><br> <input type="submit" value="Login"> </form> <c:if test="${not empty error}"> <p style="color: red">${error}</p> </c:if> </body> </html> ``` 上述代码中,${not empty error}和${error}是JSTL表达式,用于在页面上显示登录失败时的错误信息。 6. 创建一个名为"index.jsp"的JSP页面,用于显示登录成功后的内容。 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Home</title> </head> <body> <h1>Welcome!</h1> <p>You have successfully logged in.</p> </body> </html> ``` 至此,我们完成了在Eclipse中连接MySQL数据库并实现登录功能的所有步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值