我在glassfish服务器上使用open esb.我们有一个与as400数据库一起使用的连接池.
每隔几天我们就会收到此错误:分配连接时出错.原因:正在使用的连接等于max-pool-size和expired max-wait-time.无法分配更多连接
缓解cp的最佳方法是重启服务器.我们还设法设置了另一个具有相同属性的cp.
我的问题是:有没有办法主动"告诉"cp释放所有打开的连接?
干杯,伊兰
我使用Twisted 8.1.0作为套接字服务器引擎.反应堆 - epoll.数据库服务器是MySQL 5.0.67.操作系统 - Ubuntu Linux 8.10 32位
在/etc/mysql/my.cnf:
max_connections = 1000
Run Code Online (Sandbox Code Playgroud)
在源代码中:
adbapi.ConnectionPool("MySQLdb", ..., use_unicode=True, charset='utf8',
cp_min=3, cp_max=700, cp_noisy=False)
Run Code Online (Sandbox Code Playgroud)
但实际上,SHOW PROCESSLIST当应用程序在高负载下运行时,我只能看到200(或更少)打开的连接().这还不够我的应用程序:(
我认为这是线程池的限制.有任何想法吗?
有时我会收到
java.net.SocketException: Too many open files
java.net.Socket.createImpl(Socket.java:397)
java.net.Socket.connect(Socket.java:527)
org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123)
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:597)
Run Code Online (Sandbox Code Playgroud)
我看到了类似的问题java.net.SocketException:太多打开的文件,我也使用apache的httpclient,但似乎答案对我来说不是很有帮助...
有两个答案:
1)做 httpClient.getConnectionManager().shutdown();
2)打电话entity.getContent().close()而不是entity.consumeContent()
但似乎没有一个适合......
1)问题是我正在使用ThreadSafeConnectionManager.它创建一次(在应用程序启动时).因此我们不会关闭(以便连接可重复使用).如果我关闭此管理器 - 所有连接都将关闭.如果我使用它是合适的SingleClientConnectionManager,但我不这样做.我对吗?
2)我发现我也没有关闭流.但是当我开始调试时 - 看来这个getContent()流已经关闭,甚至在调用之前consumeContent().虽然(甚至之后consumeContent)socketInputStream内部的那些getContent()流没有关闭,以及socket.这不好吗?它可能是问题的原因吗?我没有找到如何关闭这个插座的方法!它位于外部输入流的内部,所以我无法得到它.但我在调试模式中看到,此套接字未关闭,以及SocketInputStream.
我们应该如何正常使用ThreadSafeConnectionManager- 它应该只创建一次吗?如果是这样,如何正确关闭这些插座?
我正在设计一个带有C++的分布式服务器/客户端系统,其中许多客户端通过TCP向服务器发送请求,服务器抛出一个线程来处理请求并发回它的响应.在我的用例中,只有有限数量的客户端将访问服务器,我需要非常高的性能.从客户端和服务器发送的数据都很小,但非常频繁.因此,在使用后创建连接并将其拆除是很昂贵的.所以我想使用连接缓存来解决这个问题:一旦创建连接,它将被存储在缓存中供将来使用.(假设客户端的数量不会超出缓存的大小).
我的问题是:
任何答案和建议将不胜感激.或者任何人都可以给我一个连接池或连接缓存的例子?
除了旧的已知事实,即connection.Close()vs connection.Dispose()是相同的 - 除了在关闭的连接上运行时,Close()在已处理的连接上运行引发异常Close()- 是的 - 我还有一个问题:
假设连接池已打开,(默认) - 为什么记住连接状态很重要?
我在这里读到了这个问题,它表明 - 避免打开和关闭连接可以节省性能.
这似乎是逻辑,但问题是连接永远不会被关闭!它只标记为关闭.
即使我在using范围内使用它- dispose只是关闭连接并将其放回池中.
即使我想要,我也不能让它开放(因为我希望其他人使用它).所以我不得不关闭/处理它.
看看Dapper 也实现了这种行为:
public static async Task<IEnumerable<T>> QueryAsync<T>(this...)
{
//...
bool wasClosed = cnn.State == ConnectionState.Closed;
using (var cmd = (DbCommand)command.SetupCommand(cnn, info.ParamReader))
{
try
{
if (wasClosed) await ((DbConnection)cnn).OpenAsync()...
//...
}
finally
{
if (wasClosed) cnn.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,"记忆"在这里实现.
NB,我已经问马克有关相关主题是-为什么短小精悍的样品中,他同时使用 …
最近,我一直在尝试为我们在生产中使用Oracle DB的应用程序之一实现基于HSQLDB的内存数据库.该应用程序使用spring框架.但是,我必须以编程方式实现数据源bean,因为我们使用现有的SQL DDL语句(Oracle查询),因此必须以编程方式删除命名空间之类的构造才能在HSQLDB上运行.
我使用EmbeddedDatabaseBuilder(ResourceLoader)初始化数据库.
现在我的问题是我现在想要使用say c3p0添加连接池.通常我会用
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="HSQLDB driver path" /> (this is just for representation)
<property name="jdbcUrl" value="${xxx.jdbcUrl}" />
<property name="user" value="${xxx.username}" />
<property name="password" value="${xxx.password}" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="3" />
<property name="maxIdleTime" value="20" />
</bean>
Run Code Online (Sandbox Code Playgroud)
但是,我很困惑如何在使用Spring嵌入式数据库时定义它.
免责声明:我真的很喜欢春天.
我正在使用带有hibernate 4的spring framework 3.2,在本地服务器(apache-tomcat v7.0)上长时间空闲时间后发送请求并且数据库位于远程服务器上时,我得到上述异常.经过几个小时的搜索,我发现问题来自连接池.我尝试了多个连接池,但没有找到令人满意的解决方案.bellow是我的spring-data文件中的当前数据源
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"
destroy-method="close">
<property name="connectionCachingEnabled" value="true" />
<property name="URL" value="${app.jdbc.url}" />
<property name="user" value="${app.jdbc.username}" />
<property name="password" value="${app.jdbc.password}" />
<property name="connectionCacheProperties">
<value>
MinLimit:70
MaxLimit:200
InitialLimit:20
ConnectionWaitTimeout:120
InactivityTimeout:180
ValidateConnection:true
</value>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
请指教.
我目前正在使用具有3个主实例的Redis群集模式,我在侦听服务器中使用Jedis(Java客户端),我收到的每个数据创建一个新线程然后线程在redis中进行更新.
我的问题是如何在池配置的多线程中使用Redis Cluster实例.
我正在为Spring Boot应用程序和Postgres DB配置JDBC连接池,以使用HikariCP连接池,并试图找到配置设置的最佳实践,不幸的是,网络上没有关于此主题的太多信息。
我正在为不同的设置准备自己的性能测试,但是希望对您有所帮助。应用程序节点的平均吞吐量约为20 req / sec
我对这些属性的最佳值最感兴趣:
minimumIdle: ?
maximumPoolSize: ?
idleTimeout: ?
maxLifetime: ?
connectionTimeout: ?
Run Code Online (Sandbox Code Playgroud)
知道最适合的值特别好maximumPoolSize
。连接池设置还有许多其他可用的选项,不胜感激关于它们对应用程序性能的影响的任何建议。
此代码的预期行为是一个连接被打开.然后连接返回到连接池并在第二个open()上重用.对?
但是,当我对SQL Server 2005执行此代码时,第二个open()将事务转换为分布式事务.我从这一刻开始看到服务器上的2个连接.而第二个打开()大约需要3-4秒.从这一点开始,只使用了第二个.第一个连接似乎以某种方式被诅咒.
使用SQL Server 2008 R2时,只使用一个连接,如预期的那样.
有任何想法吗?谢谢!
using (var scope = new System.Transactions.TransactionScope())
{
var constring = @"Server=xxx;Integrated Security=true;Connect Timeout=10;";
using (var con = new SqlConnection(constring))
{
con.Open();
}
using (var con = new SqlConnection(constring))
{
con.Open();
}
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)