2013-03-11 106 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