2
我有一個活的java服務器。它有一個用於數據庫連接,操作和關閉的DatabaseManager類。但是有很多數據庫活動正在進行(甚至超過50個客戶端同時連接和投票)。 executeQuery方法返回一個ResultSet,所以並不是每個打開的連接都關閉,因爲在返回之前關閉將會清空ResultSet。有沒有更好的方法來解決這個問題?爲java服務器優化數據庫性能
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.");
}
}
}
由於有很多創建和關閉連接,資源和時間消耗。有什麼方法可以提高性能嗎?連接池是否是此服務器的不錯選擇?什麼是實現這種服務器的最有效的方式?
它不是J2EE服務器,我對RESTful服務器使用org.restlet.jar。現場直播我的意思是服務器運行24小時,所以我無法關閉連接池。對於多線程環境,多個客戶端將同時獲取連接,是否可以安全地共享池?謝謝:) –
是的,連接池是線程安全的 – Guillaume