我正在使用Tomcat 6.0.29,Tomcat 7的连接池和MySQL.测试我的应用程序,它不会重用池中的任何内容,但最终会创建一个新池,最终我无法使用数据库,因为当池的最大活动大小设置时,池中有数百个睡眠连接到20.
见这里参考:
+----+------+-----------------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+--------+---------+------+-------+------------------+
| 2 | root | localhost:51877 | dbname | Sleep | 9 | | NULL |
| 4 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 5 | root | localhost:49213 | dbname | Sleep | 21 | | NULL |
| 6 | root | localhost:53492 | …Run Code Online (Sandbox Code Playgroud) 我有一个Spring应用程序,我相信使用DBCP连接池连接到MySql数据库.我说相信,因为这不是一个我非常强大的领域,如果一切设置正确,我不肯定.我运行应用程序没有问题,一切正常.问题一夜之间发生.该应用程序没有大量使用,一夜之间显然失去了它与MySql的连接.我调查了一下,发现MySql有一个8小时的窗口,然后断开连接或其他什么.我对此很好,但是当用户尝试在早上登录时,他们会收到如下错误:
通信链路故障.最后一个数据包成功收到60,000,000ms前.最后一个数据包在15ms前成功设置.
这就是问题.我需要它们能够在早上重新连接而不会遇到这个问题.我似乎能够解决它的唯一方法是通过弹跳Tomcat服务器.通过查看,似乎DBCP池应该能够以某种方式防止这种情况,但我找不到关于如何配置它的可靠信息来源.我希望这里有人可以为我提供一些见解.这是我当前的配置,全部在Spring xml文件中完成:
APP-data.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.vz.sts.domain" />
<context:component-scan base-package="com.vz.sts.persistence" />
<context:component-scan base-package="com.vz.sts.service" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/app" />
<property name="username" value="root" />
<property name="password" value="admin" />
<property name="initialSize" …Run Code Online (Sandbox Code Playgroud) 我们刚刚从dbcp迁移到tomcat jdbc连接池.我们在加载中尝试了系统并收到以下异常:
java.sql.SQLException: [IA1856] Timeout: Pool empty. Unable to fetch a connection in 1 seconds, none available[size:125; busy:90; idle:0; lastwait:1000].
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:632)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:124)
at com.inneractive.model.mappings.BasicPersistenceEntityMapping.getConnection(BasicPersistenceEntityMapping.java:233)
at com.inneractive.model.mappings.BasicPersistenceEntityMapping.callWithConnection(BasicPersistenceEntityMapping.java:243)
at com.inneractive.model.mappings.PersistenceEntityMapping.get(PersistenceEntityMapping.java:194)
at com.inneractive.model.data.client.ClientUtils.GetClientByExamples(ClientUtils.java:353)
at com.inneractive.client.ExternalAdRingsClientStart.getClientInfoByRequestParametersOrInsert(ExternalAdRingsClientStart.java:1329)
at com.inneractive.client.ExternalAdRingsClientStart.newClientSession(ExternalAdRingsClientStart.java:245)
at com.inneractive.simpleM2M.web.SimpleM2MProtocolBean.generateCampaign(SimpleM2MProtocolBean.java:235)
at com.inneractive.simpleM2M.web.SimpleM2MProtocolBean.generateCampaign(SimpleM2MProtocolBean.java:219)
at com.inneractive.simpleM2M.web.AdsServlet.doGet(AdsServlet.java:175)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:396)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
注意这个:
[size:125; …Run Code Online (Sandbox Code Playgroud) 我正在运行一个多租户网站,我希望减少每个请求创建PostgreSQL连接的开销.Django的CONN_MAX_AGE允许这样做,代价是创建了许多与PostgreSQL的开放空闲连接(8个工作者*20个线程= 160个连接).每个连接10MB,这会消耗大量内存.
主要目的是减少连接时间开销.因此我的问题:
Django 1.6设置:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
....
'PORT': '6432'
'OPTIONS': {'autocommit': True,},
'CONN_MAX_AGE': 300,
}
ATOMIC_REQUESTS = False # default
Run Code Online (Sandbox Code Playgroud)
Postgres的:
max_connections = 100
Run Code Online (Sandbox Code Playgroud)
PgBouncer:
pool_mode = session # Can this be transaction?
max_client_conn = 400 # Should this match postgres max_connections?
default_pool_size = 20
reserve_pool_size = 5
Run Code Online (Sandbox Code Playgroud) 我们正在做一个MySQL的小基准测试,我们希望看看它对我们的数据的执行情况.
该测试的一部分是看多个并发线程在服务器上使用各种查询进行操作时的工作原理.
在MySQL文档(5.0)是不是多线程的客户真的清楚.我应该指出我确实链接了线程安全库(libmysqlclient_r.so)
我正在使用预准备语句并执行read(SELECT)和write(UPDATE,INSERT,DELETE).
mysql_real_connect()返回我打电话时得到的原始数据库句柄mysql_init())mysql_affected_rows返回正确的值而不是与其他线程的调用冲突(互斥/锁可能工作,但感觉不对)我已经浏览了一段时间,并在此过程中咀嚼我的帽子,但无法找到与我的问题完全匹配.
简而言之,我在60秒不活动后获得了极好的堆栈跟踪(org.apache.tomcat.jdbc.pool.ConnectionPool放弃),这是几个服务器端线程的正常行为.
我直接使用Tomcat JDBC连接池(org.apache.tomcat.jdbc.pool.DataSource)
Stack Trace:
Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon
WARNING: Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@1ad2916]:java.lang.Exception
at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111)
at com.getsom.getConnection(DAO.java:1444)
at com.getsom.PreparedConnection.(PreparedConnection.java:48)
at com.getsom.Alarms.run(Alarms.java:492)
我的PoolProperties配置如下:
PoolProperties pp = new PoolProperties();
pp.setUrl( someValidUrl);
pp.setDriverClassName("com.mysql.jdbc.Driver");
pp.setUsername( someUser);
pp.setPassword( somePassword);
pp.setJmxEnabled( true);
pp.setTestWhileIdle( true);
pp.setTestOnBorrow( true);
pp.setValidationQuery( "SELECT 1");
pp.setTestOnReturn( false);
pp.setValidationInterval(30000);
pp.setTimeBetweenEvictionRunsMillis(30000);
pp.setMaxActive(100);
pp.setInitialSize(10);
pp.setMaxWait(10000);
pp.setMinEvictableIdleTimeMillis(30000);
pp.setMinIdle(10);
pp.setLogAbandoned(true);
pp.setRemoveAbandoned(true);
pp.setRemoveAbandonedTimeout(60);
pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
setPoolProperties(pp);
Run Code Online (Sandbox Code Playgroud)
我希望setValidationInterval(30000)可以节省我,因为30s在连接生命周期中并不多.无论如何,问题是:
我错过了什么让这个连接永远存在?
很高兴知道:为什么我在声称连接的函数中超时,尽管它是在30秒之前调用的.
当使用带有Redis的node_redis Node.js模块时,我应该只使用一个连接,因为Redis是单线程进程,还是我应该创建一个连接池来提高性能?
我正在试图找出如何在使用actor系统时最好地处理数据库操作.事实上,当我们尝试不阻止AKKA时,数据库操作正在阻塞.
我在主文档中指出,处理这种情况的一种方法是在路由器后面创建一个actor池,可能在一个单独的executionContext上,它将处理数据库访问.
因此,我有以下问题:
1 - databaseActors是否始终保持连接打开状态?
2 - 它如何与许多数据库提供的连接池一起工作?
3 - 我们应该将两者结合起来,并让DatabaseActors在每次请求时从池请求一个新的连接.如果没有,是不是一直保持连接打开是一件坏事?
4 - 有人可以向我解释微妙的事情,使其成为一种避免线程饥饿的方法.例如,使用Play或spray,请求的处理是异步任务,但是如果该任务需要数据库访问并且我们向DatabaseActor发送请求,那么数据库Actor上的块(如果它发生)不会导致,异步任务中的一个块,导致可能的线程不足?
5 - 100%确定DB ACID属性确保多次读写的安全性,因此在关系之前发生.
6 - 我正在使用也称为三重存储的语义数据库,并在我的请求中大量使用语义推理功能.我还执行了很多写访问,任何建议,关于池和actor编号或专用执行上下文的调整参数?
最好,
中号
我正在使用JNDI来创建tomcat连接池.它在Web应用程序中运行良好.我相信InitialContext是由tomcat服务器提供的.
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("jdbc/testdb");
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从独立的Java程序调用相同的实用程序时,initContext对象为null.如何显式提供Context对象所期望的所有必需属性.
错误:javax.naming.NoInitialContextException:需要在环境或系统属性或applet参数或应用程序资源文件中指定类名:java.naming.factory.initial