Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为一个或多个查询优化PreparedStatements-Java和MySQL_Java_Mysql_Prepared Statement - Fatal编程技术网

为一个或多个查询优化PreparedStatements-Java和MySQL

为一个或多个查询优化PreparedStatements-Java和MySQL,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,如果我没弄错的话,一旦连接关闭,preparedStatement就会从缓存中销毁。目前,我的应用程序已经设置好,这样我就可以根据传入的单个POJO对象从数据库中获取POJO对象。然后,我有另一个函数来获取该表中所有对象的id,在需要列表的情况下,然后在该函数的while循环中,我一次获取一个完整的对象 但是这样做并没有利用缓存查询,对吗?那么,如果是一个项目列表或单个项目,那么拥有一个可以利用缓存的preparedstatements的通用getter SQL函数的最佳方法是什么呢?在PHP中

如果我没弄错的话,一旦连接关闭,preparedStatement就会从缓存中销毁。目前,我的应用程序已经设置好,这样我就可以根据传入的单个POJO对象从数据库中获取POJO对象。然后,我有另一个函数来获取该表中所有对象的id,在需要列表的情况下,然后在该函数的while循环中,我一次获取一个完整的对象

但是这样做并没有利用缓存查询,对吗?那么,如果是一个项目列表或单个项目,那么拥有一个可以利用缓存的preparedstatements的通用getter SQL函数的最佳方法是什么呢?在PHP中,我可以通过检查传入的param是否是数组来轻松实现这一点,但Java要求您定义param对象

举个例子,比如说用户,这里是我目前拥有的:

//Get user object
public User getUser(User user) throws SQLException {
    Connection connection = connectionWrapper.getConnection();
    String query = "SELECT firstName, lastName FROM users WHERE userId = ?";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setInt(1, user.getUserId());
    ResultSet rs = statement.executeQuery();
    if (rs.next()) {
        //Get database details and set into object
    }
    rs.close();
    statement.close();
    connection.close();
}

//Get all users
public List<User> getAllUsers() throws SQLException {
    List<User> userArr = new ArrayList<User>();

    Connection connection = connectionWrapper.getConnection();
    String query = "SELECT userId FROM users";
    PreparedStatement statement = connection.prepareStatement(query);
    ResultSet rs = statement.executeQuery();
    while (rs.next()) {
        int id = rs.getInt("userId");
        User user = new User(id);
        getUser(user);
        userArr.add(user);
    }
    rs.close();
    statement.close();
    connection.close();
    return userArr;
}

如果getUser函数能够同时处理上述单独的对象情况和数组情况就更好了,在这种情况下,传入一个具有userId集合的用户对象数组,并在关闭连接之前通过数组循环以获取所有对象。有没有一种不麻烦的方法可以做到这一点,或者我应该在所有情况下都将一个用户数组传递给getUser函数,即使它只有一个?

如果您追求的是性能,那么在给定5个ID的数组的情况下执行5个查询来查找5个用户并不是最好的解决方案。您最好执行一个查询,使用

select firstName, lastName FROM users WHERE userId in (?, ?, ?, ?, ?)

类似地,getAllUsers方法效率极低。它应该执行一个查询,而不是执行一个查询来获取所有ID,然后再查询找到的每个ID。

缓存准备好的语句的想法恐怕有点夸张。如果你把精力放在其他地方,你可能会有更好的优化方法。为什么对这个问题投反对票?谢谢你的回答,但是准备好的声明与IN子句不太匹配,而且我也不知道我需要查找多少ID,也就是说,我可以查找所有女性,所有男性,所有X岁以下的用户,这将导致不同的。我知道getAllUsers不是最优的,但出于面向对象的目的,不必在对象发生更改时/如果对象发生更改,就必须进行更改。好的,您只需使用集合或数组中ID的数量构建一个带有问号的查询。你只需要一个循环。不应该太难。如果您没有准备好以正确的方式使用JDBC,那么不要期望有好的性能。如果要避免编写许多类似的SQL查询,请使用ORM。这就是他们的目的。我对Java整体来说是非常陌生的,所以我不确定错误地使用JDBC是什么意思,你能解释一下我为什么没有正确地使用JDBC吗?此外,我还读到我不应该在查询中循环并使用问号,因此我没有以这种方式实现它,对吗?您的问题表明您非常关心性能,以至于您关心预处理语句缓存。但另一方面,您已经准备好执行201个查询,每个查询都在自己的事务中,而单个查询可以执行相同的操作,只是为了避免一些代码重复。那是不连贯的。如果需要性能,请使用最合适的查询。与预处理语句缓存相比,收益要高得多。ORMs允许避免使用JDBC所隐含的大量重复,同时仍然是有效的。考虑使用一个。