我有一个我在Tomcat服务器上部署的Sparkjava应用程序。它使用SQL2O与MySQL数据库连接。一段时间后,我开始无法连接到数据库。我尝试直接从SQL2O连接,通过HikariCP连接并通过JNDI连接。在我开始Communications link failure
之前,他们都工作了大约一天。这个应用程序最多每天都会受到几次攻击,因此性能完全没有问题。我想将应用程序配置为每个请求使用一个数据库连接。我该怎么做?
之后,应用程序不会再次联机,直到我重新部署它(再次覆盖ROOT.war)。重启tomcat或整个服务器什么都不做。
目前,每个请求都会创建一个新的Sql2o
对象,并使用withConnection
执行查询。如果我泄漏了任何关系,我会非常惊讶。
这是一些示例代码(简化)。
public class UserRepositry {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
protected Sql2o sql2o = new Sql2o("jdbc:mysql://mysql.server.name/dbname?serverTimezone=UTC", "username", "password");
public List<Users> getUsers() {
return sql2o.withConnection((c, o) -> {
return c.createQuery(
"SELECT\n" +
" id,\n" +
" name\n" +
"FROM users"
)
.executeAndFetch(User.class);
});
}
}
public class Main {
public static void main(String[] args) {
val gson = new Gson();
port(8080);
get("/users", (req, res) -> {
return new UserRepository().getUsers();
}, gson::toJson);
}
}
答案 0 :(得分:1)
如果您依靠Tomcat为您提供连接:它来自池。如果您不喜欢,只需使用普通的旧JDBC并自行打开该连接(并确保关闭它)。
对于你的问题的回答,这封信很多。现在的精神:来自游泳池的连接没有任何问题。在所有情况下,您有责任正确处理它:获取连接并在完成后将其释放(close
)。如果连接来自池或已手动创建,则没有区别。
正如您所说,性能不是问题:请注意,创建连接可能需要一些时间,因此即使计算机很大程度上处于空闲状态,每个请求创建一个新连接也可能会对性能产生显着影响。您的服务器不会过热,但可能会在请求周转时间内添加一两秒。
检查池的配置 - 例如validationQuery
(用于检测通信故障)或每个连接的使用限制。并确保您不会因为代码中的错误而遇到这些问题。无论如何,您都需要处理通信错误。而且,无论您是否使用游泳池,处理都没有区别。
编辑:最后:您是否更加确定没有通信链接失败?喜欢:每天晚上拔掉数据库或路由器以连接真空吸尘器? (没有双关语),防火墙丢弃/重置连接等?