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

Different clients using same connection mysql JSP

我有一个 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();
    }
}

您要查找的是连接池。它是一个有界的连接池,客户端可以在需要时从中获取连接,并在完成后将其放回。这使您免于开销或始终创建和销毁连接。它还确保连接数量可预测地增长。

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

如果由于某种原因您不能使用它或不想让容器负责,您可以在您的应用程序中使用一个库来帮助您自己管理连接池。 c3p0 is a popular one with many examples 在网络上。

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