标签: jdbc-pool

在将DBCP替换为Tomcat JDBC池时增加负载并降低性能

在DBCP中的连接泄漏和死锁问题之后,我们决定用Tomcat JDBC池替换它.当然,迁移非常简单.

但是在我注意到的生产环境中部署之后,运行两个Tomcats的服务器上的负载从4-4.5增加到5.5.除了改变游泳池之外,我们没有做更多的事情.此外,用JMeter测量的性能下降约5%.

我花了一些时间来调整池参数,但没有可见效果.我贴我目前的配置(来自<GlobalNamingResources>server.xml)以下:

<Resource name="jdbc/xxxxxx"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          initialSize="10"
          maxActive="100"
          minIdle="10"
          maxIdle="50"
          maxWait="10000" 
          testOnBorrow="true"
          testOnReturn="false"
          testOnConnect="false"
          testWhileIdle="false"
          validationQuery="SELECT 1 from dual"
          validationInterval="30000"
          suspectTimeout="60"
          timeBetweenEvictionRunsMillis="30000"
          removeAbandonedTimeout="60"
          removeAbandoned="true"
          logAbandoned="true"
          abandonWhenPercentageFull="50"
          minEvictableIdleTimeMillis="60000"
          jmxEnabled="true"
          username="xxxxx"
          password="xxxxx"
          driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:oci:xxxxx"/>
Run Code Online (Sandbox Code Playgroud)

FairQueue和PoolSweeperEnabled都是真的

在Spring applicationContext-jdbc.xml中我只有:

  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="resourceRef">
      <value>true</value>
    </property>
    <property name="jndiName">
      <value>java:comp/env/jdbc/PortalDB</value>
    </property>
  </bean>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我想,JDBC_pool应该比开箱即用的DBCP快.

performance tomcat load apache-commons-dbcp jdbc-pool

16
推荐指数
1
解决办法
2918
查看次数

尝试在数据库重新启动后重新连接jdbc池数据源

我有一个带有Java后端的Web应用程序,它使用Tomcat jdbc-pool进行数据库连接.这很好用.

但是我在将其导出到其他位置之前尝试万无一失,最近出现了有人重新启动SQL Server数据库服务但没有重新启动Tomcat服务的情况.这导致了一个SQLException:java.sql.SQLException: I/O Error: Connection reset by peer: socket write error直到我重新启动Tomcat,强制jdbc-pool数据源重新连接.

我在Tomcat jdbc-pool文档中寻找某种配置来告诉数据源尝试重新连接但我找不到任何东西.

有没有人知道是否有某种配置,或者我应该在每次请求之前检查这种情况吗?

java tomcat datasource jdbc-pool

15
推荐指数
1
解决办法
3万
查看次数

"Tomcat 7 JDBC连接池"是否适合生产?它与BoneCP相比如何?

我们的网站每天大约获得1M PV,我们肯定会使用Tomcat.

我找不到有关jdbc-pool的更多信息,不确定它是否足够稳定以供生产.有人有经验吗?以及任何配置/调整内容供参考?

正如有人提到的,BoneCP可能是另一种选择.但似乎它已经停止了(太可悲了......).这会是一个更好的选择吗?

顺便说一句,HikariCP太年轻了,我会留意它,因为它是迄今为止我发现的最新/最快的CP.

谢谢你的建议.

java connection-pooling bonecp jdbc-pool hikaricp

12
推荐指数
2
解决办法
1万
查看次数

升级到Tomcat 8时ClassNotFoundException

我最近将我的NetBeans IDE从v7.3升级到v8,突然我的应用程序在连接到DB时在服务器启动时抛出异常.这两个版本的IDE之间的唯一区别是后者使用Tomcat 8.

异常日志:

javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:82)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.istore.core.listeners.AppContextListener.initdb(AppContextListener.java:44)
    at com.istore.core.listeners.AppContextListener.contextInitialized(AppContextListener.java:27)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4738)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5158)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:697)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:579)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:455)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1554)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1428)
    at …
Run Code Online (Sandbox Code Playgroud)

java tomcat netbeans jdbc-pool

8
推荐指数
1
解决办法
3万
查看次数

如何在tomcat dbcp池中跟踪/记录连接,并检测不返回池连接的代码

在大型应用程序的某个地方,有一些代码不会像应该的那样返回到连接池的连接.结果是池快速达到最大连接.

这可以通过将其设置为删除已放弃的连接来解决,但会降低性能.

如何在tomcat dbcp中启用日志记录以显示何时借用和返回连接?

logging tomcat connection-pooling apache-commons-dbcp jdbc-pool

6
推荐指数
1
解决办法
1994
查看次数

如何为负载平衡集群配置 Tomcat JDBC Pool(如 PostgreSQL 主从复制)

假设有一个 PostgreSQL 集群,由一个主节点和两个通过流复制的只读副本组成。

如何配置 Tomcats DBCP 以了解数据库集群内有多个不同的节点,从而将变异语句分配给主节点的连接,并将无副作用语句(负载平衡)分配给任何从节点的连接?

正如 PostgreSQL 的 JDBC 驱动程序文档所述,可以在 JDBC 连接 URL 中声明多个节点: jdbc:postgresql://host1:port1,host2:port2/database

于是就产生了在Tomcats server.xml中配置两个连接池的想法。一个 JNDI 资源用于读/写主数据源,另一个池用于只读副本:jdbc:postgresql://host1:port1/database?targetServerType=master和 用于副本jdbc:postgresql://host1:port1,host2:port2/database?targetServerType=preferSlave&loadBalanceHosts=true

在这种情况下,Tomcat 上运行的应用程序需要知道有两个具有不同语义的数据库连接池,因此需要根据每个 SQL 语句来决定从哪个池请求连接。这似乎是一个不好的模式,因为应用程序依赖于特定的数据库基础设施,并且 JDBC 池应该抽象底层数据库的实现。

Tomcat DBCP 和 PostgreSQL 集群之间的附加抽象层(例如pgpool-II)可以在这种情况下提供帮助吗?(特别是当将来基础设施增长到多个 Tomcat 服务器实例或 PostgreSQL 数据库的高可用性和故障转移要求上升时)

postgresql load-balancing pgpool jdbc-pool tomcat-dbcp

5
推荐指数
0
解决办法
1670
查看次数

Tomcat 错误:java.sql.SQLException:找不到适合 jdbc:sqlserver:// 的驱动程序

我的 Tomcat 有一个很糟糕的问题,很糟糕,因为这个问题我已经放弃了这个项目一个多月了......但我仍然需要解决它并继续这个项目......

所以它给我这个错误:

java.sql.SQLException:找不到适合 jdbc 的驱动程序:sqlserver://isd.ktu.lt:1433;DatabaseName=LN2012_bakDB2 java.lang.NullPointerException

问题是相同的应用程序在桌面版本 Perfectlz 中运行,但是当涉及到应该在服务器上运行的版本(NetBeans 7.1.2 中的 Tomcat 7.0.22.0)时,它只会抛出错误。似乎它没有加载池驱动程序,或者我什至不知道......

好吧,这是负责的部分:

public DatabaseConnection(Parameters params) {                

    // parameters and the output                
    this.gui = params.getGui();

    // activate database pool
    connectionPool = new GenericObjectPool(null);
    connectionFactory = new DriverManagerConnectionFactory(params.getDbAdr(), params.getDbUser(), params.getDbPass());
    poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);
    driver = new PoolingDriver();
    driver.registerPool("GenTreeDatabase", connectionPool);
    //driver.registerPool("jdbc:apache:commons:dbcp:GenTreeDatabase", connectionPool);        

}

public void openConn() {
    if (allowOutput) gui.print("Getting connection to database");
    try {
        con = DriverManager.getConnection("jdbc:apache:commons:dbcp:GenTreeDatabase");
        if (con != null) { …
Run Code Online (Sandbox Code Playgroud)

java tomcat apache-commons-dbcp jdbc-pool

4
推荐指数
1
解决办法
1万
查看次数

带连接池的PreparedStatement池

可能重复:
dbcp中的Prepared语句池

我正在构建一个使用Tomcat的数据库连接池机制进行内部使用的Web应用程序.我也试图汇集准备好的语句,以便应用程序在检索数据时更有效.

根据我的理解,当连接,结果集和语句关闭时,连接将返回到池.如果设置了适当的标志,则也会关闭放弃的连接并将其返回到池中.关闭连接意味着释放所有数据库游标和缓存语句,包括预准备语句.那么准备好的声明汇集到底是什么意思呢?

java tomcat jdbc-pool

2
推荐指数
1
解决办法
2284
查看次数