2015-02-10 71 views
0

我有一個JPS項目。使用相同連接的不同客戶端mysql JSP

如果我有不同的計算機使用系統,他們使用相同的MySQL連接。

當系統運行任何查詢並且客戶端嘗試發出任何mysql命令時,它將所有人放入隊列中,系統非常慢。

我希望每個客戶端都與mysql有不同的連接。

對不起,如果我不夠清楚。

package br.com.scope.model; 

import java.io.IOException; 
import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Properties; 

import org.springframework.context.annotation.Scope; 
import org.springframework.context.annotation.ScopedProxyMode; 

import br.com.scope.log.LoggerIntegrador; 

public class ConexaoMysql { 
    private static Connection connection; 
    private final static ConexaoMysql conexaoMysql = new ConexaoMysql(); 
    private static Properties prop; 
    private LoggerIntegrador logger; 

    private ConexaoMysql() { 
     super(); 
     prop = new Properties(); 
     Class<? extends ConexaoMysql> cls = this.getClass(); 
     InputStream is = cls.getResourceAsStream("db.properties"); 
     try { 
      prop.load(is); 
     } catch (IOException e) { 
      logger = LoggerIntegrador.getInstance(); 
      logger.error(e.getMessage(), e); 
     } 
    } 

    public static ConexaoMysql getConnection() throws SQLException, ClassNotFoundException, IOException { 
     if (connection == null || connection.isClosed()){ 
      conexaoMysql.abreConexao();    
     } 
     return conexaoMysql; 
    } 

    public static void beginTransaction() throws SQLException, ClassNotFoundException, IOException { 
     getConnection(); 
     connection.setAutoCommit(false); 
    } 

    public static void commit() throws SQLException { 
     connection.commit(); 
     connection.setAutoCommit(true); 
    } 

    public static String getDriver() { 
     return prop.getProperty("driver"); 
    } 

    public static String getConnectionString() { 
     return prop.getProperty("connectionstring"); 
    } 

    public static String getUser() { 
     return prop.getProperty("user"); 
    } 

    public static String getPassword() { 
     return prop.getProperty("password"); 
    } 

    private void abreConexao() throws ClassNotFoundException, SQLException, IOException{ 
     Class.forName(getDriver()); 

     connection = DriverManager.getConnection(
       getConnectionString(), 
       getUser(), 
       getPassword()); 
    } 

    public static void fechaConexao() throws SQLException { 
     if (!connection.isClosed()) { 
      connection.close();   
     } 
    } 

    public PreparedStatement getPreparedStatement(String sql) throws SQLException { 
     return connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
    } 

    public static int getId() { 
     return conexaoMysql.hashCode(); 
    } 
} 
+0

請使用像[DBCP](http://commons.apache.org/proper/commons-dbcp/)這樣的連接池,然後從中獲取連接。你需要在你的web容器上配置它。 – 2015-02-10 18:45:43

回答

1

你在找什麼是連接池。這是一個有限的連接池,客戶可以在需要時連接,並在完成後重新連接。這可以節省您的開銷或始終創建和銷燬連接。它還確保連接數量的增長可預測。

大多數容器提供這樣的設施,例如,這裏是documentation for configuring a connection pool in Tomcat。爲您的容器找到一個。

如果由於某種原因您不能使用該容器或不希望容器負責,則可以使用一個庫來幫助您在應用程序中自行管理連接池。在網絡上,c3p0是很受歡迎的許多examples

編輯: Hikari是連接池的新酷選擇。

相關問題