有没有人有很好的资源来实现Sql连接池静脉中有限资源的共享对象池策略?(即完全实现它是线程安全的).
要跟进@Aaronaught请求澄清,池的使用将用于对外部服务的负载平衡请求.把它放在一个可能更容易立即理解的场景中,而不是直接的场景.我有一个会话对象,其功能ISession
与NHibernate中的对象类似.每个唯一会话管理它与数据库的连接.目前我有一个长时间运行的会话对象,我遇到的问题是我的服务提供商限制我对这个单独会话的使用.
由于他们缺乏将单个会话视为长期服务帐户的期望,他们显然将其视为正在锤击其服务的客户.这让我想到了我的问题,而不是只有一个单独的会话,我会创建一个不同会话池,并将请求分成多个会话的服务,而不是像我以前那样创建一个单一的焦点.
希望该背景提供一些价值,但直接回答您的一些问题:
问:创建的对象是否昂贵?
答:没有对象是有限资源的池
问:他们会被频繁获得/释放吗?
答:是的,可以再次考虑NHibernate ISessions,其中通常在每个页面请求的持续时间内获取和释放1.
问:简单的先来先服务是否足够,或者你需要更聪明的东西,即能防止饥饿吗?
答:一个简单的循环类型分发就足够了,饥饿我认为你的意思是,如果没有可用的会话,呼叫者被阻塞等待发布.这不是真正适用的,因为会话可以由不同的呼叫者共享.我的目标是在多个会话中分配使用情况,而不是单个会话.
我认为这可能与对象池的正常使用有所不同,这就是为什么我最初将这部分留下来并计划仅仅为了调整模式以允许共享对象而不是允许饥饿情况发生.
问:优先事项,懒惰与急切加载等问题如何?
答:没有涉及优先级,为简单起见,假设我将在创建池本身时创建可用对象池.
Java中的无状态bean不会在客户端的两次调用之间保持状态.因此,简而言之,我们可能会将它们视为具有业务方法的对象.每个方法都接受参数并返回结果.调用该方法时,会在执行堆栈中创建一些局部变量.当方法返回时,将从堆栈中删除本地,如果分配了一些临时对象,则无论如何都会对它们进行垃圾回收.
从我的观点来看,它与通过单独的线程调用同一单个实例的方法没有区别.那么为什么容器不能使用bean的一个实例而不是汇集其中的一个?
我正在使用Apache HTTP Client开发Java .
我的问题是关于在生产环境或其他需要考虑性能的环境中使用 Flask 时处理数据库连接的推荐方法。在 Flask 中,g 对象可用于存储事物,并且可以将打开的数据库连接放置在那里,以允许应用程序在同一请求期间的后续数据库查询中重用它们。但是,g 对象不会跨请求持续存在,因此似乎每个新请求都需要一个新的数据库连接(以及随之而来的性能损失)。
我在这件事上发现的最相关的问题是:如何在 python web 服务器中保留数据库连接,但答案只提出了连接池的抽象概念(没有将它与如何在 Flask 中使用它以及它将如何使用它联系起来)跨请求生存)或提出仅与一种特定类型的数据库或特定堆栈相关的解决方案。
所以我的问题是关于在 Flask 上构建的连接到任何类型数据库的应用程序生产时应该采取的一般方法。似乎涉及连接池的事情朝着正确的方向发展,尤其是因为它适用于传统的 Python 应用程序。但我想知道在使用 Flask 时推荐的方法是什么,因为前面提到的跨连接持久性问题,以及生产中的 Flask 应用程序从 WSGI 服务器运行的事实,这可能会增加进一步的复杂性。
编辑:基于推荐烧瓶 sqlalchemy 的评论。假设 Flask sqlalchemy 解决了这个问题,它是否也适用于 Neo4J 或 Flask 应用程序使用的任何任意数据库?许多现有的数据库连接器本身已经支持池化,那么为什么要引入一个额外的依赖项,其主要目的是提供 ORM 功能而不是连接管理?另外,sqlalchemy 如何解决跨请求持久性的基本问题?
在我面临的一次采访中,我被要求实施连接池.所以方法是这样的:
List
或HashMap
ConnectionImpl
getConnection()
方法时,ConnectionPoolingImpl
返回一个连接引用.现在当有人返回connection(releaseConnection(ConnectionImpl O)
)时,如何确保当同一个应用程序再次尝试重用连接对象时,我的实现会引发异常?
可能已将相同的连接对象返回到新应用程序,并且应该能够使用它.
我的观点是在每个Connectionimpl
对象的另一个数组类型的结构中维护一个标志变量,并将该变量设置为有效值.当用户返回连接对象时,我会将其设为无效值.对于我的每个操作ConnectionImpl
,我都必须验证用户是否有有效标志.
你会对这种方法说些什么?
似乎使GAE Channel API具有财务可行性的唯一方法是实现某种池化机制(其中一位高级应用程序引擎产品经理甚至告诉我这一点,当我通过电子邮件向他们发送关于价格过高的价格时)来重用尚未使用的渠道过期.
我一直在集思广益,以实现渠道池,但我认为每种方法都有一些非常严重的缺点.
Servlet的静态内存 - 很好,但是当新VM实例打开和/或客户端从一个VM传递到另一个VM时,会丢弃相当多的开放通道.
Memcache - 至少可以从所有VM全局访问内存,但现在由于不活动和内存压力,可能会丢弃一个非常可行的通道.
后端实例 - 可能性是可靠性方面的最佳选择,但现在运行后端的费用将耗尽首先实现池的所有节省!
是否有更好的地方/方式在虚拟机上实现我缺少的通道池,或者我是否不必要地在这里选择我的选项的缺点?我真的希望有,或者看起来我的应用程序将不得不恢复到轮询(在我的初步指标中看起来略微便宜).
JDBC 3.0规范讨论了连接(和准备语句)池.
我们有几个独立的Java程序(即我们没有使用应用程序服务器),它们一直使用DBCP来提供连接池.我们应该继续使用DBCP,还是可以利用JDBC提供的池并摆脱DBCP?
我们正在使用MySQL(Connector/J)并最终将添加SQL Server支持(jTDS); 我们不太可能支持任何其他数据库.
编辑:请参阅下面有关我尝试消除连接池库的注释.似乎DBCP仍然相关(注意一些评论者推荐C3P0而不是DBCP).
背景:我正在将我的应用程序从npgsql v1移动到npgsql v2.0.9.运行我的应用程序几分钟后,我得到一个System.Exception:从池中获取连接时超时.
网络声称这是由于连接泄漏(打开数据库连接,但没有正确关闭它们).
所以
我正在尝试诊断npgsql中泄漏的postgres连接.
来自各种网络文学; 诊断泄漏连接的一种方法是在npgsql上设置日志记录,并在日志中查找泄漏的连接警告消息.问题是,我没有在任何地方的日志中看到此消息.
我还发现了监视npgsql连接的实用程序,但它不稳定并崩溃.
所以我手动检查代码.对于创建npgsql连接的每个场所,都有一个finally块处理它.对于打开datareader的每个场所,都使用CommandBehavior.CloseConnection(并且处理了datareader).
还有其他地方可以检查或者有人可以推荐一种寻找漏水池连接的方法吗?
我正在使用c3p0作为我的连接池运行Spring/Hibernate连接到MySQL设置.由于某些奇怪的原因,当系统处于负载状态时(当然)它会耗尽连接.
在我们开始达到新的流量水平(超过一百个并发用户)之前,该网站非常稳定.此时DB会熔化(固定CPU).我的第一个动作是在应用程序中通过广泛的缓存和查询优化等来提高性能.
现在它将间歇性地耗尽连接.它似乎甚至不依赖于负载.更多准时,这让我觉得这是一个泄漏,但对于我的生活,我无法弄清楚它将来自何处.
WARN [2011-03-07 17:19:42,409] [TP-Processor38] (JDBCExceptionReporter.java:100) - SQL Error: 0, SQLState: null
ERROR [2011-03-07 17:19:42,409] [TP-Processor38] (JDBCExceptionReporter.java:101) - An attempt by a client to checkout a Connection has timed out.
ERROR [2011-03-07 17:19:42,410] [TP-Processor38] (HttpHeadFilter.java:46) - There was a problem passing thru filter:/is-this-guy-crazy-or-just-a-huge-dancing-with-the-stars-fan
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
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.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
Caused by: java.sql.SQLException: An attempt by a …
Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于从hibernate会话自动重新连接到mysql的问题的帖子.其他人提到增加mysql wait_timeout(不是我最喜欢的),使用autoReconnect = true(不推荐),测试连接等我正在尝试一些选项,但我想问一下是否有人使用tomcat的连接池有坚如磐石的解决方案(不是hibernate的c3po).我正在寻找最具防弹性的jndi设置,即使它们不是最好的性能调整.
非常感谢你,
问候
pooling ×10
java ×4
c# ×2
connection ×2
database ×2
hibernate ×2
c3p0 ×1
channel ×1
channel-api ×1
ejb ×1
flask ×1
httpclient ×1
jdbc ×1
mysql ×1
npgsql ×1
postgresql ×1
python ×1
spring ×1
tomcat ×1