C#和#x2B;MySQL连接
我目前正在从事一个C#(.NET)项目,该项目连接到MySQL社区服务器数据库并运行一些查询。目前有4个类使用自己的MySQLConnection对象(我使用的是MySQL.NET连接器)来连接数据库 这是一种良好的做法,还是应该使用一个“全局”(静态)连接?使用单个连接有点违背我构建代码的习惯。不太喜欢100000个对象在一个共享静态场中工作。我打赌这也违背了大多数程序员的观点 我还注意到,一旦调用connection.Close(),连接就不一定会关闭。再次尝试.Open()将导致异常。我相信这是因为我没有在连接字符串中设置“Pooling=False”。我来试试看。如果你对这一点也有任何想法,请随意把它们放在这里 所以,简而言之,我想听听关于如何组织我的MySQL连接的一些意见。如果您认为所有程序类都使用一个静态MySQLConnection更好(不一定是性能方面的,我将更多地讨论多个MySQLConnection对数据库系统本身的影响),请告诉我您为什么这么认为 我预计最终的程序将有大约10或15个类,每个类都会主动查询数据库。我的经验法则是:C#和#x2B;MySQL连接,c#,mysql,C#,Mysql,我目前正在从事一个C#(.NET)项目,该项目连接到MySQL社区服务器数据库并运行一些查询。目前有4个类使用自己的MySQLConnection对象(我使用的是MySQL.NET连接器)来连接数据库 这是一种良好的做法,还是应该使用一个“全局”(静态)连接?使用单个连接有点违背我构建代码的习惯。不太喜欢100000个对象在一个共享静态场中工作。我打赌这也违背了大多数程序员的观点 我还注意到,一旦调用connection.Close(),连接就不一定会关闭。再次尝试.Open()将导致异常。我相
- 保持连接尽可能短的时间开放
- 让ADO.NET为您处理连接池
- 仅当流程一起参与事务时共享连接
Sql
是您的实用程序类):
public IEnumerable GetSomeData()
{
使用(var cn=Sql.GetOpenConnection())
{
//在这里获取您的数据
}
}
不要创建单个共享连接。尽可能晚开,早关。如果您需要为多个查询使用连接,请尝试查看MARS(多个活动记录集),但我不知道MySQL连接器是否支持该功能
一定要让系统处理连接池。数据库连接很昂贵。您可以继续使用每个类一个连接。正如您所注意到的,大多数ADO.NET提供程序在默认情况下使用连接池
Close
不会真正关闭连接,而是将连接返回到池。但是,不应再次尝试Open()
连接,而应创建一个新的连接对象
每个类使用一个连接有一个缺点,那就是事务处理。无法通过多个连接共享事务(除非您使用的是TransactionScope
)
我通常希望每个“会话”有一个连接,并在构造函数中接受到我的存储库类的连接。(因为我通常使用控制容器的反转)。谷歌有一点关于工作单元的实现。该死,我只能选择一个答案。虽然这三个都很棒。然后,每个类有一个连接。尽快关闭它,并在需要新连接时创建新对象。感谢您提供有关工作单位和火星的提示。
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);
}
}
}
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);
}
}
}