不同的客户端使用相同的连接mysql JSP

时间:2015-02-10 18:41:33

标签: java mysql jsp session connection

我有一个JPS项目。

如果我有不同的计算机使用该系统,他们使用相同的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();
    }
}

1 个答案:

答案 0 :(得分:1)

您正在寻找的是连接池。它是一个有界连接池,客户端可以在需要时建立连接,并在完成后将其重新连接。这样可以节省开销,或者始终创建和销毁连接。它还确保连接数量可预测地增长。

大多数容器都提供这样的设施,例如这里是documentation for configuring a connection pool in Tomcat。找到容器的那个。

如果由于某种原因您不能使用它或者不希望容器负责,您可以使用一个库来帮助您自己在应用程序中管理连接池。 c3p0是一个很受欢迎的广告,网络上有很多examples

编辑: Hikari是连接池的新酷选择。