用JDBC加速postgresql上的sql插件?

时间:2015-06-25 16:01:52

标签: java postgresql jdbc

我有两种方法可以检查匹配是否在数据库中,如果没有则调用insert方法。我的程序必须经历数千行,这需要很长时间。我做错了吗?我可以做些什么来显着加快速度?

public Boolean isMatchIdInDatabase(String matchId) throws SQLException
{
    Connection conn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    Boolean exists = false;

    try
    {
        Class.forName("org.postgresql.Driver");
        conn = DriverManager.getConnection(url, props);
        pst = conn.prepareStatement("SELECT COUNT(*) FROM match where match_id = ?");
        pst.setString(1, matchId);

        rs = pst.executeQuery();
        while (rs.next())
        {
            exists = rs.getBoolean(1);
        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        pst.close();
        rs.close();
        conn.close();
    }

    return exists;
}

public Boolean insertMatchId(String matchId, String name, Timestamp birthdate, String bio, String accountId) throws SQLException, ClassNotFoundException
{
    Connection conn = null;
    PreparedStatement pst = null;
    Boolean exists = false;

    try
    {
        Class.forName("org.postgresql.Driver");
        conn = DriverManager.getConnection(url, props);
        pst = conn.prepareStatement("INSERT INTO match (match_id, name, birthdate, bio, account_id) values(?, ? , ?, ?, ?)");
        pst.setString(1, matchId);
        pst.setString(2, name);
        pst.setTimestamp(3, birthdate);
        pst.setString(4, bio);
        pst.setString(5, accountId);

        pst.executeUpdate();

    }
    finally
    {
        pst.close();
        conn.close();
    }

    return exists;
}

2 个答案:

答案 0 :(得分:2)

您是否先拨打#include <iostream> #include <cmath> using namespace std; int main() { long double n; cin >> n; long double first_part = 0.0, second_part = 0.0, pi = 0.0; for(int i = 0; i <= n; i++) { first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1)); second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1)); } pi = (first_part * 16) - (second_part * 4); cout << pi << endl; return 0; } 然后isMatchIdInDatabase拨打许多记录? 可能重复:Efficient way to do batch INSERTS with JDBC

打开单个记录的连接和查询是一项昂贵的操作。如果你这样做了数千次,它会变得很慢。您应该尝试重新构建查询,以便只使用一个insertMatchId。然后,您可以收集必须插入的记录并使用批量插入执行此操作。

答案 1 :(得分:0)

您可以尝试更改仅在数据库中的行不是instanceof时才插入行的SQL查询。 这篇文章似乎是相关的 - 我知道MySQL而不是PostgreSQL,但原则应该是相同的。 MySQL Conditional Insert