声明数据库访问的实例变量

时间:2017-11-03 10:32:59

标签: java thread-safety database-connection

在BalusC回答this question时,他说

  

你根本不应该将Connection,Statement和ResultSet声明为实例变量(主要的线程安全问题!)

我认为他指的是当你创建一个实例然后在两个不同的线程中使用它时的情况,但如果你不这样做并且你运行的每个方法/线程都创建了自己的实例,我看不到问题......但是BalusC似乎对此非常明确。

我通常使用实例变量DBaccess创建一个类conn,我在类的构造函数中初始化(例如),然后在此{{的所有数据库调用期间重用1}}实例。我找不到线程安全问题,因为DBaccess变量不是静态的,而是在conn的每个实例中创建的。我一直不愿意为每个数据库查询创建DBaccess变量,因为这将每次从池请求连接,而我一直认为获得连接并执行2或3个数据库查询更有效我连续做,无需获得2或3个不同的连接。

有人可以解释一下我对BalusC警告的理解是否正确,如果使用他的建议不会因为每个数据库访问的连接请求而产生更多的重载?

1 个答案:

答案 0 :(得分:0)

在BalusC的回答中,他谈到的是单例类负责数据库访问的情况。所有线程都将使用此类,并且必须使实例变量成为线程安全的。 您正在讨论的情况是,您将为每个数据库访问实例化一个DBAccess类。在这种情况下,实例变量是线程安全的。但这可能不是一个有效的解决方案。在大多数情况下,为db请求提供单例服务是最佳选择,这就是他之所以这样提到的原因。

在许多成熟的解决方案中,应用程序不直接处理连接,并将其委托给内部获取和关闭底层连接池连接的框架。