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

标签 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 连接池。这是否足以暂时回收使用率较低的连接?

最佳答案

我没有发现您的代码有任何根本性错误,只是关闭结果集和连接而不是语句有点奇怪。

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

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

  • 打开连接的成本非常高。通过避免不断地打开和关闭连接,您可以节省大量时间
  • 池还可以在高峰使用情况下将连接数量限制在合理的最大值。它可以避免打开太多连接,并使数据库崩溃。

关于java - 这是通过 jdbc 连接和断开 mysql 的安全方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10920856/

相关文章:

php - 在两列中显示来自mysql的数据

mysql - 进行数据同步时检查已删除项目的最佳方法?

mysql - Elasticsearch river,将经度纬度转换为geo_point

java - 如何在 Java 中执行 Oracle PLSQL block

java - PostgreSQL JDBC SSL

java - 如何使用 Twitter API 获取登录后的用户数据

Java - Arraylist 实现存疑

mysql - 如何在sequel pro中查询具体值?

java - 在屏幕上刷新数据表中的数据(jsp)

java - 调用没有对象或传递值的函数