WCF service and database I have a WCF service that work with databse. The service should handle incoming message and store messagId into database. Please suggest me how can I improve it?

public class DBWorker
{
    static DBWorker instance;
    private string connectionString;
    private SqlConnection connection;

    protected DBWorker()
    {
        connectionString = GetConncetionString();
        connection = new SqlConnection(connectionString);
        connection.Open();
    }

    public static DBWorker Instance()
    {
        if (instance == null)
            instance = new DBWorker();                
        return instance;
    }

    private string GetConncetionString()
    {
        var conn = ConfigurationManager.ConnectionStrings["FsConnectionString"];
        if (conn == null | string.IsNullOrEmpty(conn.ConnectionString))
          throw new Exception("Couln't find connection string in app.config.");
        return conn.ConnectionString;
    }

    public void StoreMessage(string messageId)
    {
        SqlCommand cmd = new SqlCommand("insert into test (MessageId) values (@MessageId)", connection);
        cmd.Parameters.AddWithValue("@MessageId", messageId);
        cmd.ExecuteNonQuery();
    }

}


My WCF:

public class HostTest : IHostTest
{
    private DBWorker dbWorker;

    public HostTest()
    {
        dbWorker = DBWorker.Instance();
    }

    public Stream HandleIncomingMessage()
    {            
        var currentContext = WebOperationContext.Current;
        var request = currentContext.IncomingRequest;
        var response = currentContext.OutgoingResponse;

        string messageId = request.Headers["X-Message-Id"];

        response.StatusCode = HttpStatusCode.OK;
        response.ContentType = "text/plain";

        if (request.ContentLength == 0 )
        {
            response.StatusCode = HttpStatusCode.NoContent;
        }
        else
        {
            try
            {
                dbWorker.StoreMessage(messageId);
            }
            catch(Exception e)
            {
                response.StatusCode = HttpStatusCode.InternalServerError;
            }
        }

        return new MemoryStream(UTF8Encoding.Default.GetBytes(messageId)); ;
    }
}
SqlConnection, SqlCommand, etc. all implement IDisposable and thus they should be encapsulated in using blocks. Instead you tie SqlConnection to a singleton class, which is the opposite of that.

Here's how they should be used:

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();

    using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine("{0} {1} {2}",
            reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
        }
    }
}