在我的Windows应用程序中,我正在使用Access数据库。应用程序启动时应该打开连接。我使用连接字符串来调用过程/存储的查询并访问数据。连接应该打开,直到应用程序退出。
我被要求使用singleton
课程。请帮我看看如何使用singleton类进行数据库连接。
答案 0 :(得分:2)
要直接使用单例,您必须从连接对象继承,这对于OleDbConnection是不可能的(因为它是密封的)。因此,您必须编写一个类,其公共属性公开连接本身,并使该包装类成为单例。
然而,唯一的目标是拥有一个连接实例,你可以使用'Lazy'结构,这是线程安全的(就此而言,即使在单例中,我也会使用Lazy或LazyInitializer为线程做好准备)
public static class Data
{
public static readonly Lazy<OleDbConnection> Connection = new Lazy<OleDbConnection>(CreateConnection); //(using System.Threading)
static OleDbConnection CreateConnection()
{
var conn = new OleDbConnection("YourConnectionString");
//etc
conn.Open();
return conn;
}
}
获得连接将是这样的:
var conn = Data.Connection.Value;
然后,再次,如果你要包含一个封装所有连接调用的类,那对于单例来说就是一个完美的例子
* edit **使用单一连接的示例,带有reset *
public static class Data
{
static OleDbConnection conn;
public static OleDbConnection Connection
{
get
{
if (conn == null)
LazyInitializer.EnsureInitialized(ref conn, CreateConnection);
return conn;
}
}
static OleDbConnection CreateConnection()
{
if (strDataFilePath == null)
throw new Exception("Datafile paths is not set");
//build connection, using strDataFilePath
var conn = new OleDbConnection("YourConnectionStringWithDataFilePath");
//other settings
//open
conn.Open();
return conn;
}
static string strDataFilePath;
public static string DataFilePath
{
get { return strDataFilePath; }
set
{
if(strDataFilePath==value)return;
strDataFilePath = value;
if(conn!=null){
conn.Close(); //NB, no checks were added if the connection is being used, but if the value is only set on startup or idle moments, this should be ok for the example.
conn.Dispose();
conn=null; //conn is reset, and (re)created the next time Connection is called
}
}
}
}
初始化:
Data.DataFilePath = ".....";
使用连接:
var conn = Data.Connection; //Connection is created and opened on first call