我会有一个数据库对象,可以从多个线程以及从主线程访问。我不希望他们同时访问底层的数据库对象,所以我会编写一系列可以从多个线程访问的线程安全公共方法。可以使用Control.Invoke而不是使用锁吗?
我的第一个想法是围绕我的连接使用lock
,例如lock(oleDbConnection)
,但问题是我必须锁定主线程,因为它是一个可以访问它的线程。这将意味着重写大量的代码。
但是,由于这些线程和主线程不会经常访问数据库,所以每次我从另一个线程调用任何数据库方法时,只需使用我的控件的一些(可能是主窗体的)方法Invoke
方法。这样,据我所知,这些方法将永远不会同时调用,我不需要担心主线程。我想唯一的问题会降低性能一点点,但正如我所说,数据库不经常访问;我使用线程的原因并不是它们可以同时访问数据库,而是可以同时执行其他操作。
这听起来像个好主意吗?我错过了什么吗?听起来有点太容易,所以我很怀疑。
如何在C#上使用连接池? – Juan
您可以创建一个连接字符串,例如'Server = myAddress:myPortNumber; Database = myDataBase; UID = myUsername; PWD = myPassword; Max Pool Size = 100; Min Pool Size = 10;'然后在每个方法中创建并关闭连接。如果池中有可用的连接,您将从那里获得连接(在这种情况下不会创建新的连接,并且close将连接返回到池) –