声明连接变量

时间:2012-10-04 07:37:00

标签: c# java php c++

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

首先:连接作为类

的类成员变量
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以外的标签。

8 个答案:

答案 0 :(得分:6)

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

在C#中有一个using语句,它与实现IDisposable接口的对象一起使用。 using语句的作用类似于try / finally代码块。 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. 
}

对于你的选择,我相信第一个是最差的,它将连接对象与类的对象一起保存。

我认为你应该更关心打开/关闭连接,而不是在多个地方持有连接的对象。

答案 1 :(得分:6)

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

  1. 您的类拥有连接对象,只要您的对象保持活动状态,连接对象就会保持活动状态。
  2. 连接对象是方法的本地对象,一旦方法返回就会过期。
  3. 该方法的调用者拥有连接对象。
  4. 选择取决于:

    • 您希望如何处理连接对象的所有权&
    • 您需要记住,数据库连接只需要在需要时打开,而不是一直打开,同时,
    • 您希望连接数据库的频率。

答案 2 :(得分:4)

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

using (var connection = InitializeConnection())
{
}

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

幸运的是,在幕后ADO.NET使用 Connection Pool 来自动管理和优化与数据库的连接,因此您无需关心应用程序中打开了多少个连接。它们只是逻辑连接

不要只是保持连接长,因为它会降低性能并且不会使用连接池的并行访问

答案 3 :(得分:3)

我会选择第二个选项,稍作修改。我会将对initializeFunction()的调用更改为Singleton对象,这将产生连接。然后,您将在不再需要它时关闭它。

答案 4 :(得分:3)

我会选择选项1或3,具体取决于要求。

  • 如果有更多方法,那么我会选择选项1,然后使用连接定义方法。使用方法1,可以轻松使用依赖注入控制反转

  • 如果我班上的方法是使用连接的唯一方法,我会选择选项3.

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

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

答案 5 :(得分:3)

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

我个人会选择选项1或2. Option 1如果MyClass是一个数据库容器,其中包含多个与之关联的方法,即连接数据库,SharePoint,运行存储过程等Option 2,如果Connection对象仅用于短时间,即打开连接并在其他地方处理数据。 Option 3,我不希望将Connection对象传递给方法,但这只是个人偏好。

答案 6 :(得分:3)

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

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

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

我也反对在PHP中用于数据库连接的单例的想法(Java可能是一个不同的游戏)。是的,你通常只有一个数据库,但如果没有呢?单身人士阻止你使用两个数据库,不要从它开始。如果您使用相同的连接参数(服务器,用户名,密码),mysqli_connect()使用现有连接,并且对您来说就像单身一样,因此不需要在PHP中再次执行此操作。

答案 7 :(得分:1)

这取决于您的连接是否会被许多方法使用。我会建议尽可能快地打开和关闭它,因此option2对我来说是最好的。只需在需要时使用连接即可。您可能还对c3po库感兴趣,以便汇集您的连接。

通常,如果我要使用类中其他地方使用的变量,我将使用option1并使Connection成为最终。由于这是一个数据库连接,我认为规则稍有改变。