0

我写了一个数据库查询的包装,需要从不同的线程访问它。因此,我的应用程序创建该助手类的一个实例,并通过getter返回它。同步本地变量,比同步方法更好?

DbConnection dbc = app.getDatabaseConnection(); 
synchronized (dbc) { 
    dbc.doSomething(); 
} 

此代码是否安全?如here所述,它应该工作,尽管在局部变量上同步。只要对象实例保证相同,这是否正确?

DbConnection的所有受影响的实例方法是否是同步更好的方法?

+0

如果可能,你应该让'dbc'为'private',更重要的是'final'。 – Gray

回答

2

这不是很好的设计。

而不是通过在必要时使其方法/块同步,使您的DBConnection类具有固有线程安全性,而是强制此类的所有客户端在每次需要时都明确同步。因此,不要将线程安全封装在单一的,标识良好的课程中,而是将这种责任分配给班级的所有客户,使整个事情变得非常脆弱,并且可能发现一个极难找到的潜在错误。

也就是说,从多个线程使用单个数据库连接本身并不是一个好主意。

+0

它是一个锁定数据库连接,只能有一个连接。我知道同步在这里有缺点,但是当应用程序传输少量数据时,这应该不成问题。 –

+0

因此,假设底层数据库连接是线程安全的(这已经是疯狂的猜测),让我们假设线程A启动一个事务,然后不相关的线程B也尝试启动一个事务。你打算如何做这项工作?为什么不使用连接池,如果真的需要,甚至可以减少到1个连接。这至少会确保两个线程不会同时使用相同的连接。 –

+0

数据库的流量确实很少。如果所有事务都由提供同步方法的适配器(DbConnection)执行,它不应该工作吗?如果这是一个愚蠢的问题,我很抱歉,但过去我没有太多数据库和线程安全方面的工作。 (我同意,类名是误导性的,在某些提交中会改变它。) –

1

如果您的所有DbConnection实例方法都需要同步,则使所有方法同步。不要看你写的代码量,只看正确性。如果您同步每种方法,那么您现在就没有机会回过头几年并调用getDatabaseConnection,然后忘记同步。