我正在開發一個帶有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