2012-10-04 67 views
5

我想知道哪个更安全&使用Connection变量的更好的方法如下。声明连接变量

首先:连接作为类的类的成员变量

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 
    } 
} 

注:问题不是编程语言特定的,因此我添加了J以外的标签ava也是如此。

回答

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. 
} 

对于你的选择,我认为第一个是最差的,这与类的对象一起持有引黄对象。

我想你应该更关心打开/关闭连接而不是在多个地方举行连接的对象。

3

我会选择第二个选项,稍作修改。我会将呼叫initializeFunction()更改为Singleton对象,这会产生连接。一旦你不再需要它,你就会关闭它。

1

这取决于您的连接是否将被许多方法使用。我会尽可能快地推荐和关闭它,所以option2对我来说是最好的选择。只需在需要时使用连接。您可能还对c3po库感兴趣,以便集中连接。

一般情况下,如果我在使用其他地方使用的变量,我将使用option1并使连接最终。由于这是一个数据库连接,我认为规则稍微改变了一点。

6

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

  1. 你拥有一流的连接对象和连接对象将保持活着,只要你的对象保持活着。
  2. 连接对象对于方法是本地的,并在方法返回时到期。
  3. 方法的调用者拥有连接对象。

的选择取决于:

  • 你怎么要处理的连接对象&
  • 你需要牢记的所有权的DB连接需要只开放只要需要而不是所有的时间,而且,
  • 你想连接到数据库的频率。
4

使用Connection的正确方法是始终声明Connectionusing声明:

using (var connection = InitializeConnection()) 
{ 
} 

它会处理自动关闭连接,甚至例外扔出去。

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

不要只是一味地连接长,因为它会减慢性能,而且不使用连接池

3

的并行访问我会去选择1或3,根据不同的需求。

  • 我会选择选项1,如果有更多的方法,那么使用连接定义的那个。方法1易于使用依赖注入控制反转

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

方法2是难以测试,因为没有办法,你可以定义为连接模拟对象。

此外,我建议不传递接口MyClass

+0

'我建议不要传递一个类型,而是一个接口到MyClass'你能否更详细地解释它。 –

3

这取决于您是否希望提供修改连接对象的方法以外的能力。

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

3

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

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

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

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