【问题标题】:Problems with Tomcat8 using connection pooling to OracleDBTomcat8 使用与 OracleDB 的连接池的问题
【发布时间】:2019-12-24 17:40:03
【问题描述】:

我们有一个由第三方供应商提供的应用程序,它在 Tomcat 8 和 JDK 8 上运行到带有 ojdbc7.jar 和 xdb6.jar 驱动程序的 Oracle 12 DB。该应用程序有效,但比预期的要慢。在调查时,应用程序似乎配置为使用连接池,但应用程序似乎正在为每个查询创建新连接,而不是使用任何最初创建的到数据库的连接。

很遗憾,我无法访问第 3 方应用的代码。但是,希望能够了解我在 Tomcat 设置中缺少什么来进行池化工作。

我已经尝试通过 Apache 的文档了解较旧的 Oracle 连接,并尝试在 Web 上找到其他选项。

<Resource name="jdbc/DataSource" auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@localhost:1521:XE"
        username="myProxyUser" password="myPassword"
        initialSize="5" maxTotal="100" maxIdle="-1"
        maxWaitMillis="30000"
        validationQuery="select 1 from dual"
        testOnBorrow="true"
        accessToUnderlyingConnectionAllowed = "true"
        connectionProperties="defaultRowPrefetch=100"
        removeAbandoned = "true"
        removeAbandonedTimeout = "30"/>

【问题讨论】:

  • 您确定应用程序将“jdbc/DataSource”用于 JNDI rosolution?检查 web.xml 和 context.xml。参考:tomcat.apache.org/tomcat-8.0-doc/…
  • 在 web.xml 中,我确实看到了下面的摘录。 (*修改了几个字段值) 3rdParyCo Datasource jdbc/DataSource javax.sql.DataSource 容器
  • 在 tomcat context.xml 文件中声明的资源名称需要与您的第 3 方用于从 JNDI 解析数据源的资源名称相同,例如 'DataSource ds = (DataSource) cxt.lookup (“java:/comp/env/jdbc/postgres”);'如果名称是“jdbc/DataSource”,您是否检查过第 3 方文档/web.xml/context.xml?您必须在配置中使用与应用程序期望的名称相同的名称。

标签: java tomcat jdbc connection-pooling


【解决方案1】:

您可以通过定义类型和工厂来指定池

type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

【讨论】:

    【解决方案2】:

    可以查看tomcat docs,主要使用factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

    关于如何为 JNDI 查找配置资源的示例

    <Resource name="jdbc/TestDB"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          testWhileIdle="true"
          testOnBorrow="true"
          testOnReturn="false"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="30000"
          maxActive="100"
          minIdle="10"
          maxWait="10000"
          initialSize="10"
          removeAbandonedTimeout="60"
          removeAbandoned="true"
          logAbandoned="true"
          minEvictableIdleTimeMillis="30000"
          jmxEnabled="true"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
            org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
          username="root"
          password="password"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mysql"/>
    

    【讨论】:

    • 我尝试了您的建议,但修改了 Oracle 连接与 MySql。但没有骰子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2012-09-25
    • 2011-04-23
    相关资源
    最近更新 更多