代码之家  ›  专栏  ›  技术社区  ›  hypercube

MySQL-使用单例模式还是连接池连接?

  •  2
  • hypercube  · 技术社区  · 16 年前

    演出 , 实施


    场景1-单例模式


      static Connection connection;
      private Statement stmt = null;
    
      connection = createConnection(...)
      stmt = connection.createStatement();
    

      stmt.execute();
    


    场景2-带PreparedStatement的单例模式


    正如一些人在这里建议的那样,我引入了用于执行查询的PreparedStatement,基本上我已经放弃了 声明 变量,我使用以下表达式:

    PreparedStatement pStmt= getConnection().prepareStatement(query);
    pStmt.execute();
    

    可能无法关闭,这是真的,因为我无法在这里关闭它,也无法指示调用者关闭它。这种方法会导致下一个场景。


    场景3-具有静态PreparedStatement的单例模式


    private static PreparedStatement preparedStmt = null;
    

    setPreparedStmt(getConnection().prepareStatement(query));
    getPreparedStmt().execute();
    

    这种方法很容易理解,呼叫者必须关闭 PreparedStatement 他们自己(没问题,但关闭 预处理语句 也将关闭 ResultSet 如果是这样的话?).然而,不知何故,我觉得重复使用这个预编译的语句在数据库的事务方面并不那么安全。这里有什么危险吗?


    场景4-使用连接池


    这方面需要进一步研究,但我得到了主要观点。我无法详细介绍这种做法,但这里也有一些问题:

    Statement 预处理语句 当从池中获取一个连接并使用它来执行某些查询时?

    4.3据我所知,使用此策略,我必须在他的任务完成后关闭连接。但是,如果由于某些原因,连接未能关闭怎么办?如果会,出于某种原因,重复次数等于连接池大小。我们注定要失败。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Kaleb Brasee    16 年前

    至于安全性,对于任何需要用户输入参数的查询,请使用准备好的语句。这样,用户输入就永远不会允许SQL注入攻击。

    关于你的问题:

    4.1 :理想情况下,每个页面请求将使用1个连接。因此,为了计算出你需要多少总池连接,你必须计算出平均查询时间(比如每秒请求数)会收到多少请求。除非这个数字很高,否则大多数连接池提供的默认连接数就足够了(据我所知,通常为20)。

    4.2 :您可以使用从池中获取的连接中的语句或预处理语句。在大多数情况下(包括在查询中使用用户输入的任何情况),您应该使用PreparedStatements。

    4.3 :如果你将连接关闭代码放在try语句的finally块中,并记住每次访问数据库时都这样做,那么你就永远不会遇到连接不足的问题。

    推荐文章