我有一个数据库连接的类实现。现在,这不是标准的SQL数据库。
我需要知道以下是否是一个好的实现,如果没有 - 为什么。
我需要一个带参数的单例类,这就是我设计它的方式。
class Connection
{
private string param1;
private string param2;
private static readonly IList<Connection> connections = new List<Connection>();
private Connection()
{
//Prevent instantiation
}
private Connection(string param1, string param2)
{
this.param1 = param1;
this.param2 = param2;
}
public static Connection getInstance(string param1, string param2)
{
foreach(Connection c in connections)
{
if(c.param1 = param1 && c.param2 == param2)
return c;
}
Connection new_conn = new Connection(param1, param2);
connections.Add(new_conn);
return new_conn;
}
}
将按如下方式使用:
Connection c = Connection.getInstance(abc, xyz);
Connection d = Conn
class Connection
{
private string param1;
private string param2;
private static readonly ConcurrentDictionary<Tuple<string, string, string>, Connection> connections
= new ConcurrentDictionary<Tuple<string, string>, Connection>();
private Connection()
{
//Prevent instantiation
}
private Connection(string param1, string param2)
{
this.param1 = param1;
this.param2 = param2;
}
public static Connection getInstance(string param1, string param2)
{
Connection conn = activeConnections.GetOrAdd(new Tuple<string, string>
param1,param2), new Connection (param1, param2));
return conn;
}
}
答案 0 :(得分:7)
不,它不是线程安全的 - 您在没有任何同步的情况下修改List<T>
,并且List<T>
不是线程安全的。
此外,如果两个调用同时进入,两个调用都会查看所有现有连接,然后两个都创建一个新连接,最终可能会有两个具有相同参数的连接。
我建议您使用ConcurrentDictionary
,并使用两个参数的元组键。除此之外,这也会更有效率。
您需要致电GetOrAdd
以获取现有连接或创建并添加新连接。
答案 1 :(得分:1)
这甚至不会编译,因为你的集合“连接”是非静态的?
也许这会好一点:
class Connection
{
private readonly string param1;
private readonly string param2;
private static readonly IList<Connection> connections = new List<Connection>();
private Connection()
{
//Prevent instantiation
}
private Connection(string param1, string param2)
{
this.param1 = param1;
this.param2 = param2;
}
public static Connection getInstance(string param1, string param2)
{
lock (connections)
{
var connection = connections.FirstOrDefault(c => c.param1.Equals(param1) && c.param2.Equals(param2));
if (connection != null)
{
return connection;
}
else
{
var new_conn = new Connection(param1, param2);
connections.Add(new_conn);
return new_conn;
}
}
}
}
但是在Connection类中保持Connection类型列表对我来说似乎有些奇怪...