Servlet线程的数据库连接?

3

关于Servlet默认情况下是多线程的问题,每个Servlet是否实例化一个数据库连接,还是连接在该Servlet的所有线程之间共享?

我正在使用JDBC作为Servlet和Oracle数据库之间的接口。

如果数据库连接在所有线程之间共享,这是否意味着我应该使用连接池连接到数据库?

/** Open the connection here **/
public void init() {
    String url = "server";
    String username = "pwd";
    String password = "usr";
    try {
        Class.forName("oracle.jdbc.OracleDriver");
        conn = DriverManager.getConnection(url, username, password);
    } catch (Exception e) {
        System.err.println("Error making pool: " + e);
        conn = null;
    }
}

这完全取决于连接是如何获取的,但您还没有展示或描述任何相关代码。 - Matt Ball
@MattBall; 代码已添加。正如您所看到的,我在servlet初始化时建立连接。 - tomaytotomato
2个回答

4
如果一个数据库连接在所有线程之间共享,这是否意味着我应该使用数据库连接池?
是的,当然!JDBC连接是单线程的而且不是线程安全的。只需在它们之间引入连接池,在同一请求期间先获取连接,尽快关闭它。

请为我的问题点赞 +1,谢谢! - tomaytotomato

1

根据您编写连接的方式,它可以是每个servlet(实例变量)或全局(静态变量 - 假设您不在集群环境中并且管理并发,否则将成为严重瓶颈)。

然而,如果您想使系统高效、可靠、可扩展、更易于维护,并且不必实现更高级的功能,例如在链接失败的情况下重新连接(我认为这是考虑到您的后端是Oracle的情况),您应该查看应用程序服务器连接池机制。


谢谢,这个应用程序将在某个尘土飞扬的房间里的单个盒子上运行。 :) - tomaytotomato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接