기본적으로 나는 SqlServer 데이터베이스에서 일부 데이터를 삽입 및 검색하는 Soap webservice가 있습니다.데이터베이스 액세스 비누 WebService
웹 서비스는 DB 항목을 담당하는 싱글 톤을 사용합니다.
public class Service : System.Web.Services.WebService
{
private DBAccess dbaccess;
public Service()
{
dbaccess = DBAccessLocalhost.GetInstance();
}
[WebMethod]
public List<Profile> XXX(Guid a, uint b, DateTime c)
{
return dbaccess.XXX(a, b, c);
}
...
}
데이터베이스에 액세스하는 싱글 톤. 기본적으로 이렇게하는 방법이 많이 있습니다.
public class DBAccessLocalhost : DBAccess
{
private static DBAccess instance = null;
private string connectionString;
public static DBAccess GetInstance()
{
if (instance == null)
instance = new DBAccessLocalhost();
return instance;
}
private DBAccessLocalhost()
{
connectionString = "Data Source=localhost;Initial Catalog=DBName;Integrated Security=True;Max Pool Size=2000;Pooling=false";
}
public override void XXX(Guid a, uint b, DateTime c)
{
SqlCommand cmd;
SqlDataReader dr;
string strSql = "SP_Name";
SqlConnection conn;
conn = new SqlConnection(connectionString);
try
{
conn.Open();
cmd = new SqlCommand(strSql, conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@a", a.ToString());
cmd.Parameters.AddWithValue("@b", (int)b);
cmd.Parameters.AddWithValue("@c", c);
dr = cmd.ExecuteReader();
while (dr.Read() && dr.HasRows)
{
//Do stuff...
}
dr.Close();
}catch (Exception ex)
{
throw new DBError("Errors: " + ex.Message);
}
finally
{
conn.Close();
}
}
두 번째 버전 :
public class DBAccessLocalhost : DBAccess
{
private static DBAccess instance = null;
private string connectionString;
public static DBAccess GetInstance()
{
if (instance == null)
instance = new DBAccessLocalhost();
return instance;
}
private DBAccessLocalhost()
{
connectionString = "Data Source=localhost;Initial Catalog=DBName;Integrated Security=True;Max Pool Size=2000;Pooling=true";
}
public override void XXX(Guid a, uint b, DateTime c)
{
string strSql = "SP_Name";
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(strSql, conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@a", a.ToString());
cmd.Parameters.AddWithValue("@b", (int)b);
cmd.Parameters.AddWithValue("@c", c);
try
{
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
//....
}
}
}
catch (Exception ex)
{
throw new DBError("Error: " + ex.Message);
}
finally
{
conn.Close();
}
}
}
문제는 가끔이 예외를 얻을 수 있습니다 :
DBAccessWebSerice,System.ServiceModel.FaultException: Server was unable to process
request. ---> Errors: ExecuteNonQuery requires an open and available
Connection. The connection's current state is closed (Sometimes says connecting).
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime
operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,
ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage
methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
받는 동시에 많은 연결에 있기 때문에 문제가 될 수있다 데이터 베이스?
아마도 이것이 최선의 방법은 아닙니다. 그러나 더 나은 방법이 있거나이 문제에 대한 해결책이 있다면 말하십시오.
ASMX는 기존 기술이므로 새로운 개발에 사용해서는 안됩니다. WCF는 웹 서비스 클라이언트 및 서버의 모든 새로운 개발에 사용해야합니다. 한 가지 힌트 : Microsoft는 MSDN에서 [ASMX 포럼] (http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)을 퇴역 시켰습니다. –
또한 새 예외를 throw 할 때 항상 원래 예외가 포함됩니다. 'throw new DBException (message, ex);' –