2010-07-13 86 views
1

我正在使用java创建一个连接到数据库的接口。每次我想调用数据库时,都需要创建与数据库的新连接,这会使调用数据库的速度减慢10倍。跨线程访问变量和方法

为了避免每次我想调用数据库时都要创建新的连接,我有一个运行java的线程来保存所有的连接信息。

要从数据库写入/读取我想要创建一个线程,该线程使用存储在已运行的线程中的连接信息,使用它来执行指定的读/写功能,然后退出。

但是我无法从已经运行的线程访问这些信息。什么是实现这一目标的最佳方式?

回答

0

为什么你需要一个运行的线程来保持你的连接打开,只需将它存储在某个地方,并在你需要的时候立即执行查询。它应该工作吗?

无论如何,如果你真的想要一个线程,你应该关心有一个同步收集(检查Collections.asSynchronizedList),可以从你的线程和其他人访问和管理。

为了克服可见性问题,只需将其声明为static final变量,所以从声明它的线程外部访问它时不会有任何问题。

另一个简单的解决方案(因为连接似乎不是线程安全的)不是使用一个线程,而是使用一个监视器:您可以轻松管理想要执行查询的线程检查其机制的wait()/notify()机制如果连接是“免费的”。如果在通知所有正在等待的线程之前占用显示器并执行任何想要的操作。

+0

没有可变的静力学!当你有'synchronizedList'时,你认为你会做什么?我的猜测是外部同步或更可能的竞争条件。 – 2010-07-14 09:41:56

2

这是一个可怕的想法,因为java.sql.Connection不是线程安全的。

一个更好的主意是使用连接池。让每个线程检查一个连接,使用它并放回。

+0

我没有使用java.sql.Connection或任何其他java sql实现 – 2010-07-13 23:30:20

+0

您是否使用数据库API编写了自己的代码?哪个数据库?如果你让它安全,我会撤回我的评论。如果你甚至没有考虑过它,或者不知道这意味着什么,我的评论依然存在。 – duffymo 2010-07-13 23:32:00

+0

我正在为我自己的API开发一个小文本文件数据库系统,我也在研究。 我占线程安全。 这是一个有趣的项目。 – 2010-07-13 23:40:34

0

你为什么要这样做?有一些框架,比如Spring或者其他类似的框架,可以为你管理你的连接。不要重新发明轮子....

+0

重新发明车轮?金先生甚至不想使用JDBC访问数据库。 – duffymo 2010-07-13 23:37:45

+0

@duffymo;)有些人喜欢这样做是为了学习...我想我觉得有足够的困惑不做这样的事情...生病接受我可以得到的帮助,关于框架... – hvgotcodes 2010-07-13 23:49:43

0

我会建议使用通用对象池,而不是建立自己的解决方案,并建议从Apache的百科全书(这是通用对象的API检查Commons Pool合并,这不是DBCP)。