我正在开发一个带有JSP的小型Web应用程序,这个应用程序需要一个数据库连接,我提供了一个servlet。是否可以声明一个全局变量,以便它可以从JSP中的每个类中使用?
问题是,我希望服务器上的所有文件都可以使用这个类来访问数据库,而无需每次创建新的连接时,实际上在每个文件中我都会创建一个新的Database
对象和一个新的连接每次都会建立。
有没有办法避免这种情况,也许声明一个全局对象,如session
和request
,这样它将只被初始化一次,然后被我的所有JSP文件使用?
谢谢
我正在开发一个带有JSP的小型Web应用程序,这个应用程序需要一个数据库连接,我提供了一个servlet。是否可以声明一个全局变量,以便它可以从JSP中的每个类中使用?
问题是,我希望服务器上的所有文件都可以使用这个类来访问数据库,而无需每次创建新的连接时,实际上在每个文件中我都会创建一个新的Database
对象和一个新的连接每次都会建立。
有没有办法避免这种情况,也许声明一个全局对象,如session
和request
,这样它将只被初始化一次,然后被我的所有JSP文件使用?
谢谢
为什么要这样做?两种解决方案都是错误的方式。
这是一个坏主意,因为数据库连接不是线程安全的。创建全局对象会降低应用程序的吞吐量,因为每个用户都必须共享连接。
更好的解决方案是有一个由应用服务器维护的连接池。执行JNDI查找以检查池外的连接,在尽可能最窄的范围内使用它,并关闭该方法范围内的连接。
你的应用程序将会更好地扩展并且不会冒险线程安全。
你不需要一个全局变量,你需要一个你的上下文的功能,它将被你的应用程序使用。所以你需要使用JNDI,在Tomcat的网页上你有一个如何做到这一点,它很好的解释和易于实现。最好的祝福。
http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
你似乎是在谈论使用直接从你的JSP文件的数据库连接,不是吗?那么,这不是一个理论上正确的解决方案,因为在分离关注原则之后,您的视图 - 您的JSP文件 - 对于数据库或数据访问根本不知道任何内容。检查MVC模式的任何说明,例如这很明显;-):
但是,如果你想利用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建议你将最终与所有并发访问共享一个独特的连接。看到这为什么这是不是要走的路
我没有谈到直接使用JSP访问数据库,我使用servlet连接并执行所有操作查询 – BackSlash 2013-03-12 08:26:58
我建议研究[单例模式](http://en.wikipedia.org/wiki/Singleton_pattern)和数据库连接池...还在JSP级别处理数据库连接是我不惜一切代价尝试和避免的。 JSP应该只用于显示,恕我直言。 – ppeterka 2013-03-11 13:10:05
也许数据库连接池将是适当的? – vikingsteve 2013-03-11 13:10:06
用于数据库连接的单身对象将是一个更好的主意,请在应用程序的上下文中创建对象 – 2013-03-11 13:13:30