使用相同连接的不同客户端 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 是连接池的新酷选择。
我有一个 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 是连接池的新酷选择。