servlet 线程的数据库连接? [复制]

Posted

技术标签:

【中文标题】servlet 线程的数据库连接? [复制]【英文标题】:Database connections for servlet threads? [duplicate] 【发布时间】:2012-10-25 10:27:58 【问题描述】:

关于 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;
    

【问题讨论】:

这完全取决于如何获得连接,但您没有显示或描述任何相关代码。 @MattBall ;添加的代码。如您所见,我在初始化 servlet 时建立了连接。 【参考方案1】:

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

是的,当然! JDBC 连接和单线程而不是线程安全的。只需在两者之间引入连接池,首先获取连接并在同一请求期间尽快关闭它。

【讨论】:

请给我的问题+1:0【参考方案2】:

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

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

【讨论】:

谢谢,这个应用程序将在某个布满灰尘的房间里的一个盒子上运行。 :)

以上是关于servlet 线程的数据库连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java Servlet 的多线程如何工作? [复制]

如何正确连接我的 servlet 和我的帖子表单? [复制]

Tomcat 连接器架构、线程池和异步 servlet

Servlet和JDBC如何配合使用请给一个例子?

Servlet(简介,请求参数,页面跳转,生命周期,创建,配置,ServletContext,线程)

Servlet编程专题5之servlet线程安全问题