2013-03-11 102 views
0

我正在开发一个带有JSP的小型Web应用程序,这个应用程序需要一个数据库连接,我提供了一个servlet。是否可以声明一个全局变量,以便它可以从JSP中的每个类中使用?

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

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

谢谢

+0

我建议研究[单例模式](http://en.wikipedia.org/wiki/Singleton_pattern)和数据库连接池...还在JSP级别处理数据库连接是我不惜一切代价尝试和避免的。 JSP应该只用于显示,恕我直言。 – ppeterka 2013-03-11 13:10:05

+2

也许数据库连接池将是适当的? – vikingsteve 2013-03-11 13:10:06

+0

用于数据库连接的单身对象将是一个更好的主意,请在应用程序的上下文中创建对象 – 2013-03-11 13:13:30

回答

4

为什么要这样做?两种解决方案都是错误的方式。

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

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

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

+0

什么是图书馆你建议我使用?我看到DBPool,你是否建议使用其他库? – BackSlash 2013-03-11 14:00:54

+0

Apache Commons数据库连接池常用:http://commons.apache.org/proper/commons-dbcp// – duffymo 2013-03-11 14:11:52

0

你似乎是在谈论使用直接从你的JSP文件的数据库连接,不是吗?那么,这不是一个理论上正确的解决方案,因为在分离关注原则之后,您的视图 - 您的JSP文件 - 对于数据库或数据访问根本不知道任何内容。检查MVC模式的任何说明,例如这很明显;-):

Wikipedia on MVC pattern

但是,如果你想利用shorcut,有你的观点意识到你的数据库,你有,在我看来,有两个选项,它们都涉及到之前在您的应用中定义的数据源的JNDI查找,如Marcelo Tataje已经说过的。

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

http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-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> 

Is java.sql.Connection thread safe?

其他稍微好一点的解决方案是,在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); 
    } 

之后从存储的数据源,以获得您所需要这样

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

数据库连接任何Servlet使用请不要直接使用Connection类。这非常原始和过时。现在没有人在严肃的工作环境中处理这种连接。如果你做了什么AmitG建议你将最终与所有并发访问共享一个独特的连接。看到这为什么这是不是要走的路

+0

我没有谈到直接使用JSP访问数据库,我使用servlet连接并执行所有操作查询 – BackSlash 2013-03-12 08:26:58