Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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
优化java服务器的数据库性能_Java_Sql Server_Database_Jdbc_Connection - Fatal编程技术网

优化java服务器的数据库性能

优化java服务器的数据库性能,java,sql-server,database,jdbc,connection,Java,Sql Server,Database,Jdbc,Connection,我有一个活的java服务器。它有一个用于数据库连接、操作和关闭的DatabaseManager类。但是有很多数据库活动正在进行(甚至有50多个客户端同时连接和投票)。executeQuery方法返回一个ResultSet,因此并非每个打开的连接都会关闭,因为关闭将在返回之前清空ResultSet。有没有更好的方法来解决这个问题 public class DatabaseManager { private Connection conn; public static Logger

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

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

如果您想提高性能,共享连接绝对是个好主意。打开连接可能代价高昂,因此最好让它们保持活力

我不确定你所说的“live java server”是什么意思,如果你在一个JavaEE服务器中,应该已经有了一个在其中实现的连接池,你可以使用它

对于普通JDBC池,有很多方法,例如DBCP和C3P0是很好的选择


不太相关,但我发现您只向查询方法传递一个字符串,使用带有查询参数的预处理语句也可能会提高性能(取决于驱动程序实现和底层数据库),此外,它还可以更安全地抵御SQL注入攻击。

这不是J2EE服务器,我使用org.restlet.jar作为RESTful服务器。我指的是服务器24小时运行,所以我无法关闭连接池。在多个客户端将同时获得连接的多线程环境中,池是否安全?谢谢:)