【问题标题】:Optimizing database performance for java server优化 Java 服务器的数据库性能
【发布时间】:2026-01-08 04:10:02
【问题描述】:

我有一个实时的 java 服务器。它有一个用于数据库连接、操作和关闭的 DatabaseManager 类。但是有很多数据库活动正在进行(甚至超过 50 个客户端同时连接和投票)。 executeQuery 方法返回一个 ResultSet,因此并非每个打开的连接都关闭,因为关闭会在返回之前清空 ResultSet。有没有更好的方法来解决这个问题?

public class DatabaseManager {
    private Connection conn;
    public static Logger logger;
    public static String user = "root";
    public static String pass = "";
    public DatabaseManager() {
        logger = LoggerFactory.getLogger("Utilities.DatabaseManager");

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            logger.error(e.getMessage());
        }
    }   
    public void startConnection() {
        try {
            conn = DriverManager.getConnection("jdbc:mysql:///youspinvotes",
                    user, pass);
            logger.debug("Database connected");
        } catch (SQLException e) {
            logger.error("Unable to connect to Database");
            logger.error(e.getMessage());
        }
    }
    public ResultSet exececuteQuery(final String query) {
        logger.debug("Executing query:" + query);
        ResultSet resultSet = null;
        try {
            final Statement stmt = conn.createStatement();
            resultSet = stmt.executeQuery(query);
            logger.debug("Query executed");
        } catch (Exception e) {
            logger.error("Unable to execute query."+e.getLocalizedMessage());
            resultSet = null;
        }
        return resultSet;
    }

    public int executeUpdate(final String query) {
        logger.debug("Executing update query:" + query);
        int rowsAffected = -1;
        try {
            final Statement stmt = conn.createStatement();
            rowsAffected = stmt.executeUpdate(query);
            stmt.close();
            logger.debug("Update performed with "+rowsAffected+" rows changed.");
        } catch (Exception e) {
            logger.error(query + ": Unable to execute query. \n"+ e.getMessage());
        }
        return rowsAffected;
    }
    public void endConnection() {
        logger.debug("Closing database connection");

        try {
            conn.close();
        } catch (Exception e) {
            logger.error("There was a problem closing the database connection.");
        }
    }
}

由于有很多创建和关闭连接,因此会消耗资源和时间。有什么办法可以提高性能吗?连接池是此服务器的好选择吗?实现这种服务器的最有效方法是什么?

【问题讨论】:

    标签: java sql-server database jdbc connection


    【解决方案1】:

    如果您想提高性能,池化连接绝对是一个好主意。打开连接的成本可能很高,因此最好让它们保持活动状态。

    我不确定您所说的“实时 Java 服务器”是什么意思,如果您在 Java EE 服务器中,应该已经有一个在其中实现的连接池并且您可以使用它。

    普通的 JDBC 池有很多,例如 DBCP 和 C3P0 是不错的选择。

    并不真正相关,但我看到您只将一个字符串传递给您的查询方法,使用带有查询参数的准备好的语句也可能会提高性能(取决于驱动程序实现和底层数据库),而且它对 SQL 注入攻击更安全。

    【讨论】:

    • 它不是 J2EE 服务器,我使用 org.restlet.jar 作为 RESTful 服务器。实时我的意思是服务器运行 24 小时,所以我将无法关闭连接池。对于多个客户端将同时获取连接的多线程环境,池化是否安全?谢谢:)