2012-06-06 106 views
0

我有一个REST服务体系结构,通过此方法将请求路由到类。此方法打开数据库连接,查询值并最终关闭数据库连接。之后,从数据库值构建JSON并通过REST返回。这是通过jdbc连接和断开连接到mysql的安全方式吗?

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连接池。这足以满足现在低利用率的连接吗?

回答

3

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

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

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

  • 打开连接是非常昂贵的。通过避免不断打开和关闭连接,您可以节省大量时间
  • 池也可以将连接数量限制在合理的最大值,以防出现峰值时。它可以避免打开太多连接,并使数据库瘫痪。
+0

很高兴我在打字前扫描了答案,你从我口中取出了这些单词。请关闭与您打开它们的代码块相同的项目。隐藏DAO方法中的闭包很奇怪,有一个DAO并且不在DAO中打开它们是_even odder_。选择使用DAO还是不要,但不要使用一个。我投票赞成将公开转入DAO。 –