JDBC / Connectorj:了解连接池

时间:2011-06-28 00:34:03

标签: java mysql jdbc

我认为我需要更好地理解连接池的概念。我在带有ConnectorJ的java中工作,我在Apache Tomcat服务器上部署我的servlet。我一直在关注文档,所以我的Tomcat context.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="">
  <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
        maxActive="-1" maxIdle="30"
        maxWait="10000" minEvictableIdleTimeMillis="1200000" name="jdbc/MySQLDB"
        removeAbandoned="true" removeAbandonedTimeout="1200"  timeBetweenEvictionRunsMillis="60000"
        type="javax.sql.DataSource" url="jdbc:mysql://my_host"
        username="my_username" password="my_password"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory" /> 
</Context>

我使用推荐的方式从数据源获得连接:

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");
Connection conn = null;

try {
        conn = ds.getConnection();

        // Do query etc.
        // Close connection, statement and result set if applicable
}
catch (SQLException){
    // Handle exception here
}

我的问题是:为什么我必须在context.xml中为我的数据源指定用户和密码。如果我错了,请纠正我,但我认为连接池的重点是重用具有相同连接字符串的连接?

我希望能够处理多个不同的登录(假设servlet接收通过HTTP使用的DB凭据),但是如果我必须为每个可能的连接定义不同的数据源,那么它是否会违背连接汇集点?

3 个答案:

答案 0 :(得分:4)

当您使用DriverManager.getConnection直接打开与数据库的连接时,您将提供用户名和密码以登录该呼叫中的数据库。

使用连接池时,您不是自己直接打开连接;相反,池会打开并管理您的连接。当然,在这种情况下,池需要知道用户名和密码才能登录数据库。

通常,在Java Web应用程序中,您不会为应用程序的每个用户使用不同的数据库登录凭据。对于使用Web应用程序的任何人,您只需拥有应用程序使用的一个用户名和密码。如果Web应用程序的不同用户具有不同的权限,您可以通过为应用程序本身设置登录系统来设置它,但是您用于应用程序的用户名和密码与您用于记录的用户名和密码不同到数据库。

答案 1 :(得分:0)

与数据库的连接通常由不同的用户名和密码控制,而不是用户在网站上进行身份验证的用户名和密码。通常,它只有一个用户(通常是模式名称)。连接池将使用此用户名创建所需数量的数据库连接,应用程序负责从Web用户获取传入凭据并验证它们是否存储在数据库中。

答案 2 :(得分:0)

有几件事:

  1. DataSource API确实提供了getConnection(username, password)方法。无论出于何种原因,Tomcat自身使用的Apache DBCP都没有实现该方法。如果DBCP不能满足您的需求,您可能希望研究其他实现。
  2. 正如其他人所说,每个请求更改数据库凭据是一个相当模糊的用例。也许您应该重新考虑您的设计,以便您的用户身份验证与数据库访问分离。
  3. 更一般地说,池化是一种重用一些足够相似的东西的技术,它们可以多次重复使用。显然,DBCP已经决定“足够相似”不包括可以跨不同数据库凭据重用。我原则上不认为这是对的。