2

我有一个实时的 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.");
        }
    }
}

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

4

1 回答 1

2

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

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

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

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

于 2013-05-15T05:29:00.793 回答