0

我有一个 REST 服务架构,它使用这种方法将请求路由到一个类。此方法打开数据库连接,查询值,最后关闭数据库连接。之后,从数据库值构造 JSON 并通过 REST 返回。

  public HashMap<Integer, Artifact> queryDBValues(String userNo) {

    DAO dao = getDAO(DB1);
    Connection connection = dao.instantiateConnection();

    ResultSet resultSet = null;
    Statement statement = null;

    HashMap<Integer, Artifact> artifacts = new HashMap<Integer, Artifact>();

    try {
        statement = connection.createStatement();

        String stmntStr = "select * from myTable";

        resultSet = statement.executeQuery(stmntStr);
        int i = 0;
        while (resultSet.next()) {

            Artifact artifact = new Artifact();
            artifact.setArtifactId(resultSet.getString("id"));

            artifacts.put(i, artifact);

        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        dao.closeSQLComponents(resultSet, connection);
    }

    return artifacts;
}

DAO 是一个抽象类,它基于 getDAO() 中传递的值进行实例化。我这样做是因为我连接到多个数据库,并且与扩展此类的类连接和断开连接。

连接后我从 mysql 数据库收到错误消息:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多”

连接最终被关闭。从长远来看,我计划使用 c3p0 连接池。这是否足以在使用率低的情况下暂时回收连接?

4

1 回答 1

3

我认为您的代码没有任何根本性的错误,除了关闭结果集和连接有点奇怪,但不是语句。

另一个奇怪的事情是,DAO 应该是一个封装数据访问代码的对象。应该包含 JDBC 逻辑的是 DAO。

也就是说,你为什么不现在做正确的事情,而不是等待有 100,000 行代码来重构?尽快使用连接池。它将有两个巨大的优势:

  • 打开连接的成本非常高。通过避免不断打开和关闭连接,您将节省大量时间
  • 在使用高峰的情况下,池还允许将连接数限制在合理的最大值。它允许避免打开过多的连接,并使数据库陷入瘫痪。
于 2012-06-06T21:23:34.093 回答