gpt4 book ai didi

java - 在数据库上每秒运行多个查询的最佳方法,性能方面?

转载 作者:行者123 更新时间:2023-11-29 07:59:49 25 4
gpt4 key购买 nike

我目前正在使用 Java 每秒多次插入和更新数据。从未使用过 Java 数据库,我不确定需要什么,以及如何获得最佳性能。

我目前对于需要执行的每种类型的查询都有一个方法(例如,更新数据库中的一行)。我还有一种创建数据库连接的方法。下面是我的简化代码。

    public static void addOneForUserInChannel(String channel, String username) throws SQLException {
Connection dbConnection = null;
PreparedStatement ps = null;

String updateSQL = "UPDATE " + channel + "_count SET messages = messages + 1 WHERE username = ?";

try {
dbConnection = getDBConnection();

ps = dbConnection.prepareStatement(updateSQL);
ps.setString(1, username);
ps.executeUpdate();
} catch(SQLException e) {
System.out.println(e.getMessage());
} finally {
if(ps != null) {
ps.close();
}

if(dbConnection != null) {
dbConnection.close();
}
}
}

还有我的数据库连接

    private static Connection getDBConnection() {
Connection dbConnection = null;

try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}

try {
dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER,DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}

return dbConnection;
}

这个似乎目前工作正常,每秒大约 1-2 个查询,但我担心一旦我扩展并且它运行更多,我可能会遇到一些问题。我的问题:

  1. 有没有办法在进程的整个运行时间内保持持久的数据库连接?如果是这样,我应该这样做吗?
  2. 我还应该进行其他优化来帮助提高性能吗?

谢谢

最佳答案

我不知道应用程序其余部分的上下文是什么,但连接应该是长期存在的。在 Web 应用程序中,连接通常来自连接池。如果您正在构建独立的命令行应用程序,那么您应该考虑将连接建立为单例,然后在整个程序中使用它。同样,上下文很重要,因此您可以在此处提供有关大局的任何详细信息都会有所帮助。

一旦您对所有数据库流量使用单个连接,您可能会考虑将多个更新作为批处理的一部分执行。如果代码中某个地方有一个紧密的循环正在执行此操作,那么这绝对是获得更高性能的方法。根据我的经验,批处理后性能提高 10 - 100 倍的情况并不罕见。请参阅此处的“ExectueBatch”:http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

通过执行批处理,您可以重复使用准备好的语句,而不是每次都重新准备它。但是,请注意,在当前形式中,您存在潜在的 SQL 注入(inject)漏洞,因为您正在根据 channel 名称进行字符串插值。您可以考虑使用不同的架构结构,以便可以将 channel 名称作为值而不是表名称传递。如果这样做,查询将更加安全,并且具有在准备后很容易重复使用的副作用。

关于java - 在数据库上每秒运行多个查询的最佳方法,性能方面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24151026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com