我使用java创建一个连接数据库的接口。每次我想调用数据库时,我都需要创建与数据库的新连接,这会使调用数据库的速度慢10倍。
为了避免每次我想调用数据库时都必须创建新连接,我运行了一个包含所有连接信息的java线程。
要从数据库写入/读取我想创建一个线程,该线程使用存储在已经运行的线程中的连接信息,使用它来执行指定的读/写函数,然后退出。
但是我无法从已经运行的线程访问此信息。什么是实现这一目标的最佳方式?
答案 0 :(得分:2)
这是一个糟糕的主意,因为java.sql.Connection不是线程安全的。
更好的想法是使用连接池。让每个线程检查一个连接,使用它并将其放回去。
答案 1 :(得分:1)
最好的方法是不要重新发明轮子。连接池有很好的开放spource实现,我建议你使用它们。
如果您已在容器中运行,则使用DataSource。查看c3p0(http://sourceforge.net/projects/c3p0/)和commons-dbcp(http://commons.apache.org/dbcp/)
答案 2 :(得分:0)
为什么你需要一个线程运行来保持你的连接打开,只需将它存储在某个地方并在需要时立即执行查询..它应该有效吗?
在任何情况下,如果你真的想要一个线程,你应该关心有一个同步的集合(检查Collections.asSynchronizedList
),可以从你的线程和其他人那里访问和管理。
要克服可见性问题,只需将其声明为static final
变量,因此从您声明的线程外部访问它时不会有任何问题。
另一个简单的解决方案(因为连接似乎不是线程安全的)不是使用线程而只使用监视器:您可以轻松管理线程的wait()
/ notify()
机制想要执行查询的人检查连接是否“免费”。如果占用显示器并在通知所有等待线程之前做任何想做的事情。
答案 3 :(得分:0)
答案 4 :(得分:0)
我建议使用通用对象池,而不是构建自己的解决方案,并建议从Apache Commons检查Commons Pool(这是一个通用对象池的API,这不是' t DBCP)。