重用sqlconnection的最佳实践

iswrvxsc  于 2021-07-26  发布在  Java
关注(0)|答案(5)|浏览(285)

我有java的经验,正在尝试从c开始。我已经阅读了sqlconnection sqlcommand sqldatareader idisposable,我可以理解连接到db的最佳实践是 Package SqlConnection , SqlCommand 以及 SqlDataReader 以他们自己的方式 using 阻止。
但是在java中,我们使用的是将连接封装到工厂方法中,只创建一次,并将其重用于所有查询,甚至多线程查询。只为每个查询创建语句和结果集,并尽快关闭。
不是在创造一个新的 SqlConnection 每次询问都有点过分?不能重复使用吗?

wlwcrazw

wlwcrazw1#

创建类的新示例 SqlConnection 不创建到sql server的新网络连接,但租用现有连接(或创建新连接)。net为您处理物理连接池。
当您完成连接(通过它可以发送多个查询)后,只需 Close() 或者 Dispose() (或使用 using{} 最好是块)。
不需要缓存 SqlConnection 班级。

jobtbby3

jobtbby32#

mssqlserver在自己的连接池中管理连接,而这些连接实际上并没有被释放。但是它们是关闭的,所以您可以最小化网络流量并释放到服务器的可用连接。
另外,您应该注意,如果您使用的是linqtosql,那么在释放连接之前,数据上下文不会释放连接,因此我建议您只使用已经在工作的代码,不要尝试自己对其进行优化。

fafcakar

fafcakar3#

正如vmatm所说,.net自己将连接池化,因此完全可以重新创建它们。因此,我通常会为整个过程编写一个 Package 器,就像这样。

public static void RunWithOpenSqlConnection(string connectionString, Action<SqlConnection> connectionCallBack)
    {
        SqlConnection conn = null;
        try
        {
            conn = new SqlConnection(connectionString);
            connectionCallBack(conn);
        }
        catch (Exception ex)
        {
            //Log Error Here
        }
        finally
        {
            if (conn != null)
                conn.Dispose(); //will close the connection
        }
    }

    public static void ExecuteSqlDataReader(string connectionString, string sqlCommand, Action<SqlDataReader> readerCallBack)
    {
        RunWithOpenSqlConnection(connectionString, delegate(SqlConnection conn)
        {
            SqlCommand cmd = null;
            SqlDataReader reader = null;
            try
            {
                cmd = new SqlCommand(sqlCommand, conn);
                reader = cmd.ExecuteReader();
                readerCallBack(reader);
            }
            catch (Exception ex)
            {
                //Log Error Here
            }
            finally
            {
                if (reader != null)
                    reader.Dispose();
                if (cmd != null)
                    cmd.Dispose();
            }
        });
    }

//Example calling these
            ExecuteSqlDataReader(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString, "Select EmployeeID FROM Employees;", delegate(SqlDataReader reader)
        {
            List<string> employeeIds = new List<string>();
            if (reader.HasRows)
            {
                while(reader.Read())
                {
                    employeeIds.Add((string)reader[0]);
                }
            }
        });
jdg4fx2g

jdg4fx2g4#

要回答您的特定问题,可以重用 SqlConnection 对于每个查询。请确保关闭当前查询( SqlDataReader 等)然后再运行另一个 using 阻碍。

8oomwypt

8oomwypt5#

是的,您可以创建一个全局sqlconnection示例。在我的例子中,我使用sqlconnection作为通过singleton访问的datacontext的成员。

public class DatabaseDataContext : DataContext
{
    private static DatabaseDataContext instance;
    private SqlConnection sqlConnection;        
    private SqlTransaction sqlTransaction;

    //...

    public static DatabaseDataContext Instance
    {
        get
        {
            return instance ?? (instance = new DatabaseDataContext(connectionString));
        }
        set
        {
            instance = value;
        }
    }
}

您可以通过关闭和打开此连接来封装事务,即:

DatabaseDataContext.Instance.sqlConnection.Open();

// your transactions...

sqlConnection.Close();

或者您可以保持连接处于打开状态,但具体来说是开始和结束事务:

DatabaseDataContext.Instance.sqlConnection.Open();

sqlTransaction = sqlConnection.BeginTransaction("Example Insert users");

try{
    // ...your first transaction

    sqlTransaction.Commit();
}
catch{sqlTransaction.Rollback();}

sqlTransaction = sqlConnection.BeginTransaction("Update baked breads");

try{
    // ...your second transaction

    sqlTransaction.Commit();
}
catch{sqlTransaction.Rollback();}

// Close the connection at some point
sqlConnection.Close();

相关问题