是否有可能声明一个全局变量,以便JSP中的每个类都可以使用它?



我正在用JSP开发一个小的web应用程序,这个应用程序需要一个数据库连接,我提供了一个servlet。

问题是,我希望服务器上的所有文件都可以使用这个类访问数据库,而不需要每次创建一个新的连接,事实上,在每个文件中,我都会创建一个新的Database对象,并且每次都会建立一个新的连接。

是否有一种方法来避免这种情况,也许声明一个全局对象,如sessionrequest,这样它将只初始化一次,然后由我所有的JSP文件使用?

谢谢

你为什么要这样做?这两种方法都是错误的。

这是一个坏主意,因为数据库连接不是线程安全的。创建全局对象会降低应用程序的吞吐量,因为每个用户都必须共享连接。

一个更好的解决方案是有一个连接池,由应用服务器维护。执行JNDI查找以检查池外的连接,在尽可能小的范围内使用它,并在该方法范围内关闭连接。

你的应用程序将更好地扩展,不会冒线程安全风险。

您不需要全局变量,您需要的是上下文的功能,它将被您的应用程序使用。所以你需要使用JNDI,在Tomcat的网页上你有一个怎么做的,它很好地解释和容易实现。致以最亲切的问候。

http://tomcat.apache.org/tomcat - 7.0 - doc/jndi数据源实例howto.html

您似乎在谈论从JSP文件直接使用数据库连接,是吗?但是,这在理论上并不是一个正确的解决方案,因为按照关注点分离原则,视图(JSP文件)不应该知道任何关于数据库或数据访问的信息。检查MVC模式的任何描述,例如这个非常明显的;-):

维基百科上的MVC模式

但是,如果您想采取捷径并让视图知道您的数据库,那么在我看来,您有两个选择,它们都涉及对先前在应用程序中定义的数据源的JNDI查找,正如Marcelo Tataje已经说过的。

关于如何在Tomcat上基于连接池定义JNDI数据源:

http://tomcat.apache.org/tomcat - 6.0 - doc/jndi数据源实例howto.html

在同一页面中,您可以看到如何使用此连接池直接从JSP发出查询(我认为这也是非常不可取的)

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<sql:query var="rs" dataSource="jdbc/TestDB">
select id, foo, bar from testdata
</sql:query>
<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>
  <h2>Results</h2>
<c:forEach var="row" items="${rs.rows}">
    Foo ${row.foo}<br/>
    Bar ${row.bar}<br/>
</c:forEach>
  </body>
</html>

java.sql.Connection线程安全吗?

另一个稍微好一点的解决方案是,在java代码中,JNDI像这样从上下文侦听器查找数据源:

    public void contextInitialized(ServletContextEvent contextEvent) {
        // JNDI Datasource lookup   
        InitialContext context = new InitialContext();
        DataSource dataSource = (DataSource) context
                .lookup("jdbc/DataSource");
        // Storing datasource in application context
        contextEvent.getServletContext().setAttribute("datasource",dataSource);
   }

,然后从任何servlet使用该存储的数据源获得所需的数据库连接,如下所示

((DataSource)contextEvent.getServletContext().getAttribute("datasource")).getConnection()

不要直接使用Connection类。这是非常原始和过时的。如今,在严肃的工作环境中,没有人会处理这样的关系。如果您按照AmitG建议的那样做,您将得到一个由所有并发访问共享的唯一连接。看看为什么不能这么做

相关内容

最新更新