我目前正在开发一个C#(.NET)项目,该项目连接到MySQL社区服务器数据库并运行一些查询。目前有4个类使用自己的MySQLConnection对象(我正在使用MySQL .NET连接器),以便连接到数据库。
这是一种好的做法,还是应该使用一个'全局'(静态?)连接?使用单个连接有点违背我构造代码的习惯。不是使用一个共享静态字段的100000个对象的忠实粉丝。我敢打赌这也反对大多数程序员的观点。
我还注意到,一旦我调用connection.Close(),连接就不一定会被关闭。尝试再次打开()它会导致异常。我相信这是因为我没有在连接字符串中设置“Pooling = False”。我会试验一下。如果您对此也有任何想法,请随意将它们放在这里。
因此,简而言之,我想对如何组织我的MySQLConnections有一些看法。如果您认为所有程序类使用的单个静态MySQLConnection更好(不一定是性能方面,我更多地谈论多个MySQLConnections对数据库系统本身的影响),请让我知道您为什么这么认为
我期望最终的程序有大约10或15个类,每个类都主动查询数据库。
答案 0 :(得分:2)
我的经验法则是:
所以,不,你不应该使用一个全局静态连接。但是,您可以使用实用方法为打开的连接提供数据提取方法。然后你会做类似的事情(假设Sql
是你的实用程序类):
public IEnumerable<MyClass> GetSomeData()
{
using (var cn = Sql.GetOpenConnection())
{
//get your data here
}
}
答案 1 :(得分:0)
不要创建单个共享连接。尽可能早地开放并尽早关闭。如果您需要为多个查询使用连接,请尝试查看MARS(多个活动记录集),但我不知道MySQL连接器是否支持这种情况。
certurely让系统处理连接池。数据库连接很昂贵。
答案 2 :(得分:0)
您可以继续每班一个连接。正如您所注意到的,大多数ADO.NET提供程序都默认使用连接池。 Close
并未真正关闭连接,但会将连接返回到池中。但是,您不应该再尝试Open()
连接,而是创建一个新的连接对象。
每个类使用一个连接并且这是事务处理有一个缺点。无法通过多个连接共享事务(除非您使用TransactionScope
)。
我通常更喜欢每个“会话”一个连接,并将构造函数中的连接接收到我的存储库类。 (因为我通常使用控制容器的反转)。谷歌有点关于工作单位的实施。
答案 3 :(得分:-1)
public class DALCommon
{
public static string GetConnectionString
{
//return System.Configuration.ConfigurationManager.AppSettings["connectionInfo"];
get
{
NameValueCollection appSettings = ConfigurationManager.AppSettings;
string server = appSettings["server"];
string userid = appSettings["userid"];
string password = appSettings["password"];
return String.Format("server={0};user id={1}; password={2}; database=dbmystock; pooling=false", server, userid, password);
}
}
}