这是通过jdbc连接和断开mysql的安全方法吗?

时间:2012-06-06 19:28:27

标签: java mysql jdbc connection-pooling

我有一个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连接池。这足以回收连接,现在使用率低吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

  • 打开连接非常昂贵。通过避免不断打开和关闭连接,您可以节省大量时间
  • 如果使用高峰,则池也允许将连接数限制为合理的最大值。它允许避免打开太多连接,并使数据库陷入困境。