2015-05-15 113 views
1

到DB的連接數超出了允許的限制。在Struts2中維護多個JDBC連接

這是我到目前爲止所嘗試的。

當用戶成功登錄我添加一個連接對象到會話:

Connection conn = DatabaseConnectionManager.getConnection(); 
sessionMap.put("Connection", conn); 

然後,每當我需要一個數據庫連接,我從會話獲取它:

Map<String, Object> sessionMap = (Map<String, Object>) ActionContext.getContext().get("session"); 
Connection conn = (Connection) sessionMap.get("Connection"); 

在我打印方法被調用的次數的getConnection()方法。 因此,儘管我從會話中獲取Connection對象,爲什麼連接數超過了50的允許限制?

JNDI代碼:

Connection conn = null;   
try { 
    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
    DataSource ds = (DataSource) envCtx.lookup("jdbc/MySqdb"); 
    conn = ds.getConnection(); 

} 
catch (NamingException ex) { 
    Logger.getLogger(DatabaseConnectionManager.class.getName()).log(Level.SEVERE, null, ex); 
} 
catch (SQLException sqle) { 
    sqle.printStackTrace(); 
} 
System.out.println("connection: "+connection++); 
return conn; 

我已經使用JNDI。連接數量在允許的限制範圍內。我不確定這是否正確,請告知。

+0

樣你知道網絡的應用程序的生命週期和客戶端/服務器編程雙面??? JDBC連接池是服務器的屬性,我認爲它不應該通過httpSession傳播。 – Sarz

+0

我想我知道。我期待downvote。只要它引導我走向正確的方向,我就會接受批評。 – wib

+1

使用一些連接池。 –

回答

2

每個用戶的一個連接並不是一個好的解決方案。如前所述,您必須使用一些連接輪詢,並且如果您想簡單地使用https://commons.apache.org/proper/commons-dbcp/。 由於有提到:

創建每個用戶的新的連接可以是耗時(通常 需要的時鐘時間倍數秒)中,爲了執行可能採取毫秒 數據庫事務。在同時使用的用戶數量非常大的公共託管互聯網應用中,打開每個用戶的 連接可能是不可行的。 因此,開發人員通常希望共享所有應用程序當前用戶之間開放連接的「池」。實際上在任何給定時間執行請求的用戶的號碼 通常是活動用戶總數的非常小的百分比,並且在 請求處理期間,數據庫連接是唯一需要的時間是 。應用程序本身登錄到DBMS,並在內部處理任何 用戶帳戶問題。

你可以找到http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/

+0

我已經使用JNDI。請看看 – wib

+1

如果您的資源是** JDBC Datasource **,那麼您使用JNDI引用資源。請閱讀https://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html上的** JDBC數據源**部分 –