当前位置: 首页 > 知识库问答 >
问题:

JavaServlet中的数据库连接池

南门意蕴
2023-03-14

我正在为员工管理系统创建一个web应用程序,使用ApacheTomcat作为HTTP服务器,Oracle作为数据库,applet用于客户端编程,servlet用于服务器端编程。我还想使用DBCP来管理与数据库的连接。

我希望执行查询的servlet使用客户端为连接输入的用户名和密码。但是到目前为止,我看到在context.xml中配置资源时必须设置连接池的用户名和密码。

有没有什么方法可以实现这一点并且仍然使用DBCP?或者我必须为每个请求在doGet()doPost()中打开连接?

共有2个答案

龚远
2023-03-14

DataSource接口有一个专门用于您目的的方法:在使用之前设置的所有其他连接选项时,更改每个连接的名称和密码:DataSource::getConnection​(字符串用户名、字符串密码)

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教程。

李胤
2023-03-14

正如注释中提到的,通常情况下,限制逻辑是在应用程序端而不是数据库端完成的。

但是如果你真的想使用DB安全模型,那么你需要为每个登录用户创建单独的数据源(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);

在你的其他get/post中:

HttpSession session = request.getSession();
DataSource ds = (DataSource)session.getAttribute("DBcon");

因为每个用户将有一个数据源,所以请确保使用池的一些较低参数,例如size=3,因为对于一个用户来说它应该足够了。

 类似资料:
  • 连接数据库 在能够对MongDB进行操作之前,需要使用BuguFramework创建一个数据库连接,代码如下: BuguConnection conn = BuguFramework.getInstance().createConnection(); conn.connect("192.168.0.100", 27017, "mydb", "username", "password"); 也可以

  • 一、全局配置定义 return array( 'DB_TYPE' => 'mysql', 'DB_HOST' => '127.0.0.1', 'DB_NAME' => 'thinkcmf', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_PORT' => '3306', 'DB_PREFIX' =>

  • ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。数据库抽象访问层基于PDO方式,目前内置包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。 如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。 配置文件

  • 本文向大家介绍Python中的Oracle数据库连接,包括了Python中的Oracle数据库连接的使用技巧和注意事项,需要的朋友参考一下 Python可以使用名为cx_Oracle的python软件包连接到oracle。Oracle是著名且广泛使用的数据库之一,而python的数据处理功能可以很好地利用这种连接性。在本文中,我们将看到如何连接到oracle数据库和查询数据库。 安装cx_Orac

  • 有两种方法连接数据库: 自动连接 “自动连接” 特性将在每一个页面加载时自动实例化数据库类。要启用“自动连接”, 可在 application/config/autoload.php 中的 library 数组里添加 database: $autoload['libraries'] = array('database'); 手动连接 如果你只有一部分页面需要数据库连接,你可以在那些有需要的函数里

  • 本文向大家介绍java连接mysql数据库 java连接sql server数据库,包括了java连接mysql数据库 java连接sql server数据库的使用技巧和注意事项,需要的朋友参考一下 在java的应用中,我们经常会对数据库进行必要的操作,下来我们就了解一下如何用java连接mysql数据库 以及java连接sql server数据库 一、mysql 二、sql server 以上就