目前我正在开发一个使用多个数据库的应用程序。为了维护单一责任原则,我创建了一个数据mapper-ish结构,将SQL与其他代码分开。但是,虽然我喜欢这种结构,但我遇到了一些性能问题。我希望有人可以通过改进我的结构或其他一些我不了解的解决方案来提高应用程序的性能。
当前结构
我有两个类处理与我的(多个)数据库的联系:Repository和ConnectionFactory。类Repository是在我的其他代码中创建的,ConnectionFactory是由Repository在其构造函数中创建的
例如,假设我有一个Person类,具有ID,名称,地址,电话号码等属性。在这个类中,如果我想根据ID查询名称,我会执行以下操作:
int exampleID = 1;
Repository rep = new Repository()
String name = rep.getNameByID(exampleID)
Repository类包含我的所有SQL代码。它包含一系列方法,如:
public String getNameByID(int id)
{
string conString = savedConnectionString; //this conString may vary
string queryString = "SELECT name FROM customers WHERE customerid = ?";
OdbcCommand command = new OdbcCommand(queryString);
command.Parameters.Add("@customerid", OdbcType.Int).Value = id;
return factory.executeScalarCommandString(conString, command);
}
然后,我的类ConnectionFactory处理连接并执行命令。它包含select-commands(取决于其结果类型),插入,更新和删除的方法。这些方法如下所示:
public String executeScalarCommandString(String conString, OdbcCommand command)
{
String result = "";
using (OdbcConnection connection = new OdbcConnection(conString))
{
try
{
command.Connection = connection;
command.CommandType = CommandType.Text;
connection.Open();
result = command.ExecuteScalar().ToString();
connection.Close();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
}
return result;
}
问题
最初,这种结构似乎完美无缺。但是,当我启动程序时,我需要从多个数据库加载大量数据。我创建了存储库(创建了ConnectionFactory),并执行了很多方法来查询我的数据(数量级为100+)。并且由于Repository中的每个方法都在ConnectionFactory中调用一个方法,并且每个ConnectionFactory方法打开一个连接,执行一个查询并关闭连接,我打开并关闭所有方法的连接。这导致我的数据的初始加载需要大约17秒,这太长了。
解决方案?
由于我查询了不同的数据库,因此我无法在ConnectionFactory的构造函数中打开连接,并通过该连接抛出所有查询。但是,我认为低性能是由于连接的不断打开和关闭(如果我错了,请纠正我。)
有没有人知道如何提高我的应用程序的性能?如果需要,我很乐意改变我的结构,但我喜欢将SQL与其他代码分开(因为从长远来看,我想替换数据库)。
提前多多感谢!