我想知道哪个是安全的&更好的方法来使用以下的连接变量。
首先:连接作为类
的类成员变量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以外的标签。
答案 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)
这三种方法都提供不同的功能:
选择取决于:
答案 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成为最终。由于这是一个数据库连接,我认为规则稍有改变。