[英]Database Connection Pooling in Java Servlets
我正在使用以下方法創建用於Employee Management System的Web應用程序:Apache Tomcat作為HTTP Server,Oracle作為數據庫,Applet用於客戶端編程,而Servlets用於服務器端編程。 我還想使用DBCP來管理與數據庫的連接。
我希望執行查詢的servlet使用客戶端為連接輸入的用戶名和密碼。 但是到目前為止,我已經看到在context.xml
配置資源時必須設置連接池的用戶名和密碼。
有什么方法可以實現並且仍然使用DBCP? 還是我必須為每個請求在doGet()
和doPost()
打開連接?
如評論中所述,通常,限制邏輯是在應用程序端而不是數據庫端完成的。
但是,如果您真的想使用數據庫安全模型,則需要為每個登錄用戶創建單獨的數據源(ConnectionPool),並將其存儲在其會話中。 如果您有許多並發訪問權限,您很快就會發現資源用完了。
例如,我正在使用DataSource,因為它更易於配置,但是您可以只使用任何連接池實現。
在登錄操作中,創建新的數據源(例如,使用apache common: http : //commons.apache.org/proper/commons-dbcp/ ),然后將其插入會話中
BasicDataSource ds = new BasicDataSource();
...
ds.setPassword(userPassword);
ds.setUserName(login);
...
HttpSession session = request.getSession();
session.setAttribute("DBcon",ds);
並在您的其他獲取/帖子中:
HttpSession session = request.getSession();
DataSource ds = (DataSource)session.getAttribute("DBcon");
由於它將成為每個用戶一個數據源,因此請確保使用池的一些低參數,例如size = 3,因為它對於用戶來說應該足夠了。
DataSource::getConnection(String username, String password)
DataSource
接口有一個明確用於您的目的的方法:更改每個連接的名稱和密碼,同時使用所有其他先前設置的選項進行連接: DataSource::getConnection(String username, String password)
java.sql.ConnectionPoolDataSource
接口具有相同的方法getPooledConnection(String user, String password)
。 因此,您的特定連接池實現可能支持此功能。
public javax.sql.DataSource obtainDataSource() {
org.postgresql.ds.PGSimpleDataSource dataSource = new PGSimpleDataSource() ;
dataSource("AcmeInvoices database data source") ;
source.setServerName( "localhost" ) ;
source.setDatabaseName( "invoicing" ) ;
// source.setUser( "Scott" ) ;
// source.setPassword( "tiger" ) ;
return dataSource ; // Returning a reference to the object of this concrete class `PGSimpleDataSource` as an object of the interface `DataSource`.
}
在進行一些數據庫工作時:
Connection conn = myDataSource.getConnection( "Scott" , "tiger" ) ;
… run SQL
conn.close() ; // Or better yet: Use try-with-resources syntax to automatically close the connection.
有關詳細討論,請參閱我的一個答案在一個相關的問題。
請參見有關DataSource
Oracle 教程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.