如何为每个请求设置一个数据库连接的Tomcat

时间:2018-02-19 06:57:14

标签: mysql tomcat sql2o

我有一个我在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);
    }
}

1 个答案:

答案 0 :(得分:1)

如果您依靠Tomcat为您提供连接:它来自池。如果您不喜欢,只需使用普通的旧JDBC并自行打开该连接(并确保关闭它)。

对于你的问题的回答,这封信很多。现在的精神:来自游泳池的连接没有任何问题。在所有情况下,您有责任正确处理它:获取连接并在完成后将其释放(close)。如果连接来自池或已手动创建,则没有区别。

正如您所说,性能不是问题:请注意,创建连接可能需要一些时间,因此即使计算机很大程度上处于空闲状态,每个请求创建一个新连接也可能会对性能产生显着影响。您的服务器不会过热,但可能会在请求周转时间内添加一两秒。

检查池的配置 - 例如validationQuery(用于检测通信故障)或每个连接的使用限制。并确保您不会因为代码中的错误而遇到这些问题。无论如何,您都需要处理通信错误。而且,无论您是否使用游泳池,处理都没有区别。

编辑:最后:您是否更加确定没有通信链接失败?喜欢:每天晚上拔掉数据库或路由器以连接真空吸尘器? (没有双关语),防火墙丢弃/重置连接等?