2013-05-15 35 views
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."); 
     } 
    } 
} 

由於有很多創建和關閉連接,資源和時間消耗。有什麼方法可以提高性能嗎?連接池是否是此服務器的不錯選擇?什麼是實現這種服務器的最有效的方式?

回答

2

如果您嘗試提高性能,聯合連接絕對是一個好主意。打開連接可能是昂貴的,所以最好讓它們活着。

我不確定你的意思是「活着的java服務器」,如果你在一個Java EE服務器上,應該已經有一個連接池實現了,你可以使用它。

對於普通JDBC池有很多,例如DBCP和C3P0是很好的選擇。

沒有真正的相關性,但我看到你只向你的查詢方法傳遞一個字符串,使用帶查詢參數的預準備語句也可以提高性能(取決於驅動程序實現和底層數據庫),再加上它更安全地防範SQL注入攻擊。

+0

它不是J2EE服務器,我對RESTful服務器使用org.restlet.jar。現場直播我的意思是服務器運行24小時,所以我無法關閉連接池。對於多線程環境,多個客戶端將同時獲取連接,是否可以安全地共享池?謝謝:) –

+0

是的,連接池是線程安全的 – Guillaume