我有一个不使用连接池的Spring Boot应用程序,并且我们不想在每个请求都打开数据库连接
因此,这是一个名为MySQLService
的类,该类具有用于DB查询的方法:
@Autowired
@Qualifier("mysqlDB")
private Connection connection;
此connection
对象始终在所有查询方法中使用。
在MySQLConnection类中,
@Bean(name = "mysqlDB")
public Connection getConnection() {
Connection connection = null;
try {
Class.forName(mysqlDriver);
LOGGER.debug("get mysql connection...");
connection = DriverManager
.getConnection(jdbcUrl,
user, password);
} catch (Exception exception) {
LOGGER.error("ERROR :: {}", exception);
}
return connection;
}
}
因此,我们从来没有真正关闭过连接,它是由spring上下文管理的,但是由于我们没有使用JDBCTemplates,所以它不会关闭。我们在连接字符串中将autoreconnect
设置为true
。
在一两天内,我们会得到一个例外:
com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 61,183,452 milliseconds ago.
我了解这是因为SQL Server设置了连接生存期,因此它会使连接过期,但是在不使用连接池的情况下如何处理该问题
答案 0 :(得分:1)
每6个小时左右对MySQL服务器执行一次ping操作,执行以下查询:select 1 from dual
。为此,您需要启用计划:
@Configuration
@EnableScheduling
public class SpringConfig {
//...
}
然后:
@Scheduled(cron = "0 */6 * * *")
public void schedulePingMySQL() {
// execute `select 1 from dual`
}
无论如何,建议使用连接池。这种情况下的代码可能类似于:
@Autowired
private DataSource dataSource;
public void save (Dto dto) {
Connection con = dataSource.getConnection();
// finally, close the connection
}