声明连接变量

Declare Connection Variable

本文关键字:变量 连接 声明      更新时间:2023-10-16

我想知道哪个是安全的&使用以下连接变量的更好方法。

第一:连接作为类的类成员变量

class MyClass
{
Connection conn;
public MyClass(Connection conn) {
this.conn = conn;
}
public void myMethod(){
//Do some DB operations using conn
}
}

第二:初始化方法中的连接

class MyClass
{       
public MyClass() {      
}
public void myMethod(){
Connection conn= initializeFunction(); //Initialize Connection
//Do some DB operations using conn
}
}

第三:将连接作为参数发送到函数

class MyClass
{       
public MyClass() {      
}
public void myMethod(Connection conn){
//Do some DB operations using conn
}
}

注意:这个问题不是特定于编程语言的,因此我也添加了Java以外的标记。

所有三种方法都提供不同的功能:

  1. 您的类拥有连接对象,只要您的对象保持活动状态,连接对象就会保持活动状态
  2. 连接对象是该方法的本地对象,并且在该方法返回后过期
  3. 方法的调用方拥有连接对象

选择取决于:

  • 您希望如何处理连接对象的所有权
  • 您需要记住,DB连接只需要在需要的时候打开,而不是一直打开,同时
  • 您希望多久连接一次数据库

对于数据库连接对象,最好是:尽可能晚地打开,尽可能早地关闭

在C#中有一个using语句,它与实现IDisposable接口的对象一起工作。using语句的工作原理类似于try/finaly代码块。IMO处理连接的一般做法应该是:

try
{
connection = new Connection();
connection.Open(); // open the connection
//work with the connection, DB CRUD operations
}
finally
{
if(connection != null)
connection.Close(); // close the connection in finally block
// so that even if the exception occurs, connection gets closed. 
}

对于您的选项,我认为第一个选项是最糟糕的,它将connetion对象与类的对象一起保存。

我认为您应该更加关心打开/关闭连接,而不是将连接的对象放在多个位置。

使用Connection的正确方法始终是在using语句中声明Connection

using (var connection = InitializeConnection())
{
}

即使抛出异常,它也会自动处理关闭连接。

幸运的是,在后台ADO.NET使用连接池为您自动管理和优化到数据库的连接,因此您不需要太在意应用程序中打开了多少连接。它们只是逻辑连接

不要只是保持连接很长时间,因为这会降低性能,并且没有利用连接池的并行访问

根据需要,我会选择选项1或3。

  • 如果有比使用连接定义的方法更多的方法,我会选择选项1。使用方法1,可以很容易地使用依赖注入控制反转

  • 如果我的类上的那个方法是唯一使用连接的方法,我会选择选项3。

方法2很难测试,因为无法为连接定义mock对象。

此外,我建议不要向MyClass传递类型,而是传递接口

这取决于您是否希望提供在方法之外修改Connection对象的能力。

就我个人而言,我会选择方案1或2。Option 1,如果MyClass是一个具有多个关联方法的数据库容器,即连接到数据库、SharePoint、运行存储过程等。Option 2,如果Connection对象仅在短时间内使用,即打开连接并在其他地方处理数据。Option 3,我不喜欢将Connection对象传递给方法,但这只是个人偏好。

首选的解决方案完全取决于编程环境。对于Java或任何其他长时间运行的进程来说是正确的,对于PHP和类似的每次请求执行来说是错误的。

在Java中,通常有一个DB连接池可供使用,它用于限制与数据库的并发连接数量,因为大多数时候它们都是空闲的。平均而言,您不需要像代码中的查询那样多的连接。但另一方面,如果只在必须执行第一个查询时才连接到数据库,那将是浪费时间。Java程序一直在运行,为什么不在statup上打开适当数量的DB连接呢?然后他们在需要的时候就做好了准备。

在PHP中,当脚本结束时,所有内容都会被遗忘并在内存中删除。根本没有地方存储正在进行的活动DB连接。因此,最好的方法是在您确信必须发送查询的那一刻连接到数据库。另一方面,我不同意PHP中的"尽早关闭它",因为它会在脚本结束时关闭,这很快就可以了。过早关闭连接可能意味着您必须重新打开它以进行另一个查询。

我还反对在PHP中为DB连接使用singletons的想法(Java可能是另一种游戏)。是的,您通常只有一个数据库,但如果没有呢?singleton阻止您使用两个数据库,不要从它开始。如果您使用相同的连接参数(服务器、用户名、密码),mysqli_connect()将使用现有的连接,并且对您来说就像一个singleton,因此无需在PHP中再次这样做。

我会选择第二个选项,并做一些小的修改。我会将对initializeFunction()的调用更改为Singleton对象,这将产生一个连接。当你不再需要它的时候,你就会关闭它。

这取决于您的连接是否会被许多方法使用。我建议尽快打开和关闭它,所以选项2对我来说是最好的。只需在需要时使用连接即可。您可能还对用于共享连接的c3po库感兴趣。

一般来说,如果我对类中其他地方使用的变量进行建模,我会使用option1并将Connection设置为final。由于这是一个数据库连接,我认为规则略有改变。