在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快.
我有一个带有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文档中寻找某种配置来告诉数据源尝试重新连接但我找不到任何东西.
有没有人知道是否有某种配置,或者我应该在每次请求之前检查这种情况吗?
我们的网站每天大约获得1M PV,我们肯定会使用Tomcat.
我找不到有关jdbc-pool的更多信息,不确定它是否足够稳定以供生产.有人有经验吗?以及任何配置/调整内容供参考?
正如有人提到的,BoneCP可能是另一种选择.但似乎它已经停止了(太可悲了......).这会是一个更好的选择吗?
顺便说一句,HikariCP太年轻了,我会留意它,因为它是迄今为止我发现的最新/最快的CP.
谢谢你的建议.
我最近将我的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) 在大型应用程序的某个地方,有一些代码不会像应该的那样返回到连接池的连接.结果是池快速达到最大连接.
这可以通过将其设置为删除已放弃的连接来解决,但会降低性能.
如何在tomcat dbcp中启用日志记录以显示何时借用和返回连接?
logging tomcat connection-pooling apache-commons-dbcp jdbc-pool
假设有一个 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 数据库的高可用性和故障转移要求上升时)
我的 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) 可能重复:
dbcp中的Prepared语句池
我正在构建一个使用Tomcat的数据库连接池机制进行内部使用的Web应用程序.我也试图汇集准备好的语句,以便应用程序在检索数据时更有效.
根据我的理解,当连接,结果集和语句关闭时,连接将返回到池.如果设置了适当的标志,则也会关闭放弃的连接并将其返回到池中.关闭连接意味着释放所有数据库游标和缓存语句,包括预准备语句.那么准备好的声明汇集到底是什么意思呢?
jdbc-pool ×8
tomcat ×6
java ×5
bonecp ×1
datasource ×1
hikaricp ×1
load ×1
logging ×1
netbeans ×1
performance ×1
pgpool ×1
postgresql ×1
tomcat-dbcp ×1