设置游泳池的最佳方法是: -
我认为这是一个不可知的问题,但欢迎对特定数据库/语言的"特征"发表评论.例如,在某些数据库上连接可能比其他数据库更慢或更昂贵.
为了澄清,我不打算从头开始编写池,这个问题更多的是关于如何配置实现池的现有库.
我处理一个SqlConnection对象,但当然它并没有真正关闭.我需要关闭连接以不保持数据库对象的锁定.如何防止闭合连接锁定?
不知道的人对上述信息的解释:
关闭ADO或ADO.NET连接时,实际上并未切断与SQL Server的连接.ADO/ADO.NET基础结构可以保持连接,以防您再次使用它.这些连接在所谓的"连接池"中保持不变.
在没有使用几分钟后,连接将实际关闭.虽然,不是真的.TCP/IP有自己的方法来保持TCP连接打开几分钟(处于" CLOSE_WAIT "状态).如果您要求打开到同一IP:端口的TCP连接,则会执行此操作.如果是这样,它可以使用已经打开的TCP连接.
使用连接池和SQL Server,仍然建立与SQL Server的连接.每个连接都有一个它所在的数据库上下文.只要连接位于该数据库中:它就拥有该数据库上的共享数据库(S-DB)锁.
共享数据库锁只是意味着"请不要删除此数据库."
如何防止它在我的数据库上持有共享锁,同时保持连接池的好处?
我的ad-hoc解决方案现在每次都是开发人员调用Dispose:
connection.Dispose()
Run Code Online (Sandbox Code Playgroud)
将其更改为对全局辅助函数的调用:
Database.DisposeConnection(connection);
Run Code Online (Sandbox Code Playgroud)
它将数据库上下文更改为master:
public static void DisposeConnection(SqlConnection connection)
{
//Stop holding a database lock - in my database at least
ADOHelper.ExecuteNonQuery(connection, "USE master");
connection.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
它解决了我眼前的问题; 关闭的连接没有锁定我的数据库.
但现在我担心连接池会让它的大脑混乱 - 因为我将数据库上下文切换回来.
如果有人不知道,或者不这么认为:
从SDK:
关闭和处置在功能上是等效的.
我是一名学习Haskell的Java程序员.
我在一个小型网络应用程序上工作,该应用程序使用Happstack并通过HDBC与数据库进行通信.
我编写了select和exec函数,我就像这样使用它们:
module Main where
import Control.Exception (throw)
import Database.HDBC
import Database.HDBC.Sqlite3 -- just for this example, I use MySQL in production
main = do
exec "CREATE TABLE IF NOT EXISTS users (name VARCHAR(80) NOT NULL)" []
exec "INSERT INTO users VALUES ('John')" []
exec "INSERT INTO users VALUES ('Rick')" []
rows <- select "SELECT name FROM users" []
let toS x = (fromSql x)::String
let names = map (toS . head) rows
print names …Run Code Online (Sandbox Code Playgroud) 关于在.NET应用程序中管理数据库连接的最佳实践 - 我知道,通常,传递连接对象是不好的.
但是,我有一些特定的好奇心:
1.我有两个业务对象的实例,不同的类,父母 - 孩子关系(孩子是私人的.)以下哪项是最好的?
保持一个私有静态连接打开和共享,由两个对象使用,并保持打开状态直到父级被释放.
保持两个私有静态连接打开,每个对象一个,在处理对象之前不要关闭.
不要保持静态连接; 打开并随后关闭每个需要它的方法的新连接.但是,我的大多数方法只运行1-3个查询,所以这看起来效率低......
我的第二个问题基本上是相同的,但对于一个单一的形式.这里最好的是什么?
在表单的生命周期内保持一个私有静态连接打开并共享.
不要保持静态连接; 打开并随后为需要它的表单中的每个方法关闭一个连接(同样,每个方法只有1-3个查询.)
我使用manage.py命令创建大约200个线程来检查远程主机.我的数据库设置允许我使用120个连接,所以我需要使用某种池.我尝试过使用分离的线程,就像这样
class Pool(Thread):
def __init__(self):
Thread.__init__(self)
self.semaphore = threading.BoundedSemaphore(10)
def give(self, trackers):
self.semaphore.acquire()
data = ... some ORM (not lazy, query triggered here) ...
self.semaphore.release()
return data
Run Code Online (Sandbox Code Playgroud)
我将此对象的实例传递给每个检查线程,但在初始化120个线程后,仍然在Pool对象内部获得"OperationalError:FATAL:抱歉,已经有太多客户端"了.我预计只会打开10个数据库连接,线程将等待免费的信号量插槽.我可以通过注释"release()"来检查信号量的工作原理,在这种情况下,只有10个线程可以工作,其他线程将等到应用程序终止.
据我所知,即使实际调用在不同的线程内,每个线程都会打开与数据库的新连接,但为什么呢?有没有办法只在一个线程内执行所有数据库查询?
是否可以(从ASP.NET应用程序)检查当前正在使用的ADO.NET连接池的连接数以及可用数量(当前未使用)?
我在使用.NET编写的代码中遇到了问题.
问题是在某个地方我有一些狡猾的数据库代码,这意味着一段时间后我得到以下错误:
超时已过期.从池中获取连接之前经过的超时时间.这可能是因为所有池连接都在使用中并且达到了最大池大小.
我知道这是因为某个地方我没有处理过我的一个datareader或类似的东西,这意味着它仍然打开了连接,因此它不会被返回到池中.我在我的代码中发现这种情况时遇到了一些问题.
所以我的问题:
有没有办法查询连接池,以找出它正在使用的连接正在做什么.我只是想找到一种方法来查找正在运行的查询以允许我找到有问题的代码片段.
对于它的价值,我没有权限在相关数据库上运行活动监视器以找出这种方式.
我在Web应用程序中使用Tomcat 7连接池(作为server.xml和context.xml中的Tomcat资源)并且它可以工作.
我的问题是:是否有可能"告诉"/"强制"tomcat在创建后配置连接池?
我问的原因如下:
我正在使用H2并在关机时遇到一些"赛车"问题.
H2只要有连接打开但Tomcat不会释放连接池,所以连接仍保持打开状态.结果我在关机时遇到了各种各样的问题.
我发现我可以发出一个SQL SHUTDOWN命令来关闭H2,但我想探索我案例的所有替代方案.
那么是否可以"告诉"/"强制"tomcat配置连接池(至少在关机时)?
我们的项目有[Hibernate + c3p0 + MySQL]配置.我们遇到以下异常:
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ~[c3p0-0.9.1.2.jar:0.9.1.2]
Wrapped by: java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:276) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
Wrapped by: org.hibernate.exception.GenericJDBCException: Could not open connection
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:52) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:304) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final] …Run Code Online (Sandbox Code Playgroud) 我有一个RestService在三个数据中心的45台不同的机器上运行(每个数据中心15个).我有一个客户端库,用于RestTemplate根据呼叫的来源调用这些机器.如果呼叫来自DC1,那么我的库将调用我在DC1中运行的休息服务,对其他人也是如此.
我的客户端库在三个数据中心的不同机器上运行(不在同一台45台机器上).
我使用RestTemplate有HttpComponentsClientHttpRequestFactory如下图所示:
public class DataProcess {
private RestTemplate restTemplate = new RestTemplate();
private ExecutorService service = Executors.newFixedThreadPool(15);
// singleton class so only one instance
public DataProcess() {
restTemplate.setRequestFactory(clientHttpRequestFactory());
}
public DataResponse getData(DataKey key) {
// do some stuff here which will internally call our RestService
// by using DataKey object and using RestTemplate which I am making below
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)
.setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build(); …Run Code Online (Sandbox Code Playgroud) java spring connection-pooling resttemplate apache-httpclient-4.x