Java 如果我尝试此代码,我的web应用程序的性能会下降吗?

Java 如果我尝试此代码,我的web应用程序的性能会下降吗?,java,connection-pooling,apache-commons-dbcp,Java,Connection Pooling,Apache Commons Dbcp,我按照单例模式创建了“DataSourceConnection”类,但我想连接到多个数据库,所以我编写了“getDataSource(字符串驱动程序、字符串url、字符串用户名、字符串密码)”函数,该函数将返回BasicDataSource变量。我将这个变量保存到ServletContext的属性中,当我需要连接到哪个数据库时,我从ServletContext获取它。我应该尝试使用这个解决方案吗 import java.io.Serializable; import java.sql.Conne

我按照单例模式创建了“DataSourceConnection”类,但我想连接到多个数据库,所以我编写了“getDataSource(字符串驱动程序、字符串url、字符串用户名、字符串密码)”函数,该函数将返回BasicDataSource变量。我将这个变量保存到ServletContext的属性中,当我需要连接到哪个数据库时,我从ServletContext获取它。我应该尝试使用这个解决方案吗

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;

public class DataSourceConnection implements Cloneable, Serializable {

    private static final long serialVersionUID = 1L;

    private BasicDataSource dataSource;

    private static class DataSourceConnectionHolder {
        private static DataSourceConnection INSTANCE = new CustomerDataSourceConnection();
    }

    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException();
    }

    private DataSourceConnection() {
    }

    public static DataSourceConnection getInstance() {
        return DataSourceConnectionHolder.INSTANCE;
    }

    public DataSource getDataSource(String driver, String url, String username, String password) {
        dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

在此上下文中,单例模式的目的是只创建一个到数据库的连接(这是一个缓慢的操作),并在代码中重用该连接

由于要连接到多个数据库,因此每个数据库都需要一个“单例”。您不应该为此实现多个类,而应该实现具有多个静态“共享”连接的单个类

除非
DataSource
维护连接池,否则
getConnection()
的速度很慢

用示例更新

public final class DataSourceConnection {
    // This defines an instance of the class
    private BasicDataSource dataSource;
    private DataSourceConnection(String driver, String url, String username, String password) {
        this.dataSource = new BasicDataSource();
        this.dataSource.setDriverClassName(driver);
        this.dataSource.setUrl(url);
        this.dataSource.setUsername(username);
        this.dataSource.setPassword(password);
    }
    public Connection getConnection() throws SQLException {
        return this.dataSource.getConnection();
    }
    // This defines the "shared"/"multiple singleton" instances
    public static final DataSourceConnection DATABASE1 = new DataSourceConnection("...", "...", "...", "...");
    public static final DataSourceConnection DATABASE2 = new DataSourceConnection("...", "...", "...", "...");
    public static final DataSourceConnection DATABASE3 = new DataSourceConnection("...", "...", "...", "...");
}
你可以这样使用它:

try (Connection conn = DataSourceConnection.DATABASE2.getConnection()) {
    // Access database #2 here
}

当然,实际上,您希望3个数据源的初始化基于一些配置文件,而不是如图所示的硬编码。

我建议您对其进行分析并查看。如果你最近做了这件事,可能会有很多事情比你现在看到的更重要。谢谢彼得,我正在尝试。如果你不测量,你就是在猜测。即使是代码优化方面的专家,当他们试图猜测这是为什么唯一的方法是有一些措施给你一个提示时,也经常会出错。当你说:“一个具有多个静态“共享”连接的单一类时,我不明白。你能用代码解释它吗?