Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序服务器JDBC资源的DataSource或ConnectionPoolDataSource_Java_Database_Configuration_Connection Pooling_Application Server - Fatal编程技术网

Java 应用程序服务器JDBC资源的DataSource或ConnectionPoolDataSource

Java 应用程序服务器JDBC资源的DataSource或ConnectionPoolDataSource,java,database,configuration,connection-pooling,application-server,Java,Database,Configuration,Connection Pooling,Application Server,在应用服务器中创建JNDI JDBC连接池时,我总是将类型指定为javax.sql.ConnectionPoolDataSource。我从来没有过多考虑,因为比起非池连接,更喜欢池连接似乎总是很自然的 然而,在查看一些示例()时,我注意到它们指定了javax.sql.DataSource。此外,似乎还有maxIdle和maxWait的设置,给人的印象是这些连接也是池连接。Glassfish还允许使用这些参数,无论选择的数据源类型如何 javax.sql.DataSource是否汇集在应用服务器

在应用服务器中创建JNDI JDBC连接池时,我总是将类型指定为
javax.sql.ConnectionPoolDataSource
。我从来没有过多考虑,因为比起非池连接,更喜欢池连接似乎总是很自然的

然而,在查看一些示例()时,我注意到它们指定了
javax.sql.DataSource
。此外,似乎还有
maxIdle
maxWait
的设置,给人的印象是这些连接也是池连接。Glassfish还允许使用这些参数,无论选择的数据源类型如何

  • javax.sql.DataSource
    是否汇集在应用服务器(或servlet容器)中
  • 选择
    javax.sql.ConnectionPoolDataSource
    优于
    javax.sql.DataSource
    (反之亦然),有哪些优势(如果有的话)

我的理解是,
ConnectionPoolDataSource
的唯一目的是提供对
PooledConnection
的访问,后者通过JDBC驱动程序实现本机池。在这种情况下,应用服务器可以使用此本机接口实现连接池

使用simple
数据源时,appserver使用自己的池而不是本机池


不能说哪种方法最好。

是的,Tomcat在默认情况下对定义为JNDI上下文资源的数据源使用Apache DBCP池

从文件中

注意-默认数据源支持 在Tomcat中,它是基于DBCP的 来自Commons的连接池 项目然而,有可能 使用任何其他需要的连接池 通过实现javax.sql.DataSource 编写自己的自定义资源 工厂,如下所述

挖掘Tomcat6源代码发现它们是通过这种方式获得连接工厂的(如果您不使用上下文的“工厂”属性指定自己的连接工厂):

实现javax.naming.spi.ObjectFactory的org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory负责创建数据源实例:

我看到他们创建了org.apache.tomcat.dbcp.dbcp.BasicDataSource的实例:

奇怪的是,这个类本身没有实现ConnectionPoolDataSource,BasicDataSource内部返回的org.apache.tomcat.dbcp.dbcp.PoolgDataSource也没有实现

因此,我假设当您将数据源配置为javax.sql.ConnectionPoolDataSource时,您还使用了一些自定义的工厂(这只是一个猜测,但我认为在Tomcat中会出现类强制转换异常,因为它们的池并没有真正提供javax.sql.ConnectionPoolDataSource的实例,只有javax.sql.DataSource)


因此,要回答关于特定情况的优点或缺点的问题,您应该将Apache DBCP与数据源工厂中的池机制进行比较,无论您使用哪种机制。

对于包含以下内容的Java文档:

数据源接口由驱动程序供应商实现。有三种类型的实现:

基本实现——生成标准连接对象

连接池实现——生成将自动参与连接池的连接对象。此实现与中间层连接池管理器配合使用

分布式事务实现——生成可用于分布式事务的连接对象,并且几乎总是参与连接池。此实现与中间层事务管理器一起工作,并且几乎总是与连接池管理器一起工作

应用程序程序员不直接使用PooledConnection接口;而是由管理连接池的中间层基础结构使用

当应用程序调用DataSource.getConnection方法时,它会返回一个连接对象如果正在进行连接池,则该连接对象实际上是PooledConnection对象的句柄,PooledConnection对象是一个物理连接

连接池管理器,通常是应用程序服务器,维护PooledConnection对象池。

因此,如果您是一个快乐而正常的程序员,那么最终您只需使用数据源连接类,而从不使用池连接/连接池数据源


如果您正在实现另一种情况的应用服务器…

我从未使用过ConnectionPoolDataSource;它总是Tomcat、WebLogic和JBOSS上的数据源。实际上,我只在Glassfish中配置了ConnectionPoolDataSource,并指定了它的com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource。谢谢所有的好信息!不客气。请投赞成票/表明答案正确(-:这是正确的,但没有回答问题。作为例如
DataSource#getConnection()
的调用者,您是对的:这是调用者与appserver提供的连接池交互的唯一方式。但作为管理员,首先设置连接池(这就是这个问题所要问的),它实际上是完全不确定的。参见。
ObjectFactory factory = (ObjectFactory)Class.forName(System.getProperty("javax.sql.DataSource.Factory", "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory")).newInstance();