如果我尝试此代码,我的 Web 应用程序的性能会降低吗?
Will the performance of my web app decrease if i try this code?
我创建 "DataSourceConnection" class 遵循单例模式,但我想连接到多数据库,所以我编写了 "getDataSource(String driver,String url, String username,String password)" 函数,该函数将 return 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();
}
}
在此上下文中单例模式的目的是仅创建一个到数据库的连接(这是一个缓慢的操作),并在您的代码中重用该连接。
由于您想连接到多个数据库,因此每个数据库都需要一个 "singleton"。您不应该为此实现多个 class,只需一个 class 和多个静态 "shared" 连接。
是 getConnection()
比较慢,除非 DataSource
维护一个连接池。
更新示例
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 个数据源的初始化基于某个配置文件,而不是像所示那样进行硬编码。
我创建 "DataSourceConnection" class 遵循单例模式,但我想连接到多数据库,所以我编写了 "getDataSource(String driver,String url, String username,String password)" 函数,该函数将 return 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();
}
}
在此上下文中单例模式的目的是仅创建一个到数据库的连接(这是一个缓慢的操作),并在您的代码中重用该连接。
由于您想连接到多个数据库,因此每个数据库都需要一个 "singleton"。您不应该为此实现多个 class,只需一个 class 和多个静态 "shared" 连接。
是 getConnection()
比较慢,除非 DataSource
维护一个连接池。
更新示例
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 个数据源的初始化基于某个配置文件,而不是像所示那样进行硬编码。