我正在通过OracleConnectionCacheImpl运行Oracle连接池的问题.当我通过瘦驱动程序连接到我的数据库服务器(Oracle 10g)上的连接池时,一切正常,直到一个未指定的时间,数据库连接被丢弃(可能是由于空闲连接?),我收到一条错误消息:
封闭连接.
刷新页面并重新尝试连接会重新连接数据库,因此它似乎不是网络或数据库的问题.如果池中的连接因任何原因死亡,Oracle连接池是否可以验证其连接并重新连接?
我正在使用Apache Tomcat 6.0.18,Java EE6更新11.
(在Oracle瘦驱动程序中似乎有ping功能.这有帮助,我在哪里可以找到它?)
我最近遇到了这个连接池实现.
http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
我觉得很有意思.
有没有人试过这个?我认为它看起来很棒,除了它不支持自动重试和语句缓存,如c3p0.
有没有人知道它与c3p0相比如何?
直到现在我使用了c3p0,但我发现它在多线程环境中的连接处理存在问题.与应用程序线程数相比,它打开了太多连接.
谢谢.
将NHibernate与分布式事务一起使用时,我们遇到了问题.
请考虑以下代码段:
//
// There is already an ambient distributed transaction
//
using(var scope = new TransactionScope()) {
using(var session = _sessionFactory.OpenSession())
using(session.BeginTransaction()) {
using(var cmd = new SqlCommand(_simpleUpdateQuery, (SqlConnection)session.Connection)) {
cmd.ExecuteNonQuery();
}
session.Save(new SomeEntity());
session.Transaction.Commit();
}
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
有时,当服务器处于极端负载时,我们将看到以下内容:
如果单独使用,应用程序最终(在几秒或几分钟后)将从此条件恢复.
为什么步骤1中没有报告死锁异常?如果我们无法解决这个问题,那么我们如何防止我们的应用程序暂时无法使用?
该问题已在以下环境中重现
我已经创建了一个测试夹具,有时会为我们重现这个问题.它可以在这里找到:http://wikiupload.com/EWJIGAECG9SQDMZ
sql-server nhibernate connection-pooling distributed-transactions
我不确定这是否可行,但我正在寻找一种在连接丢失时重新连接到mysql数据库的方法.所有连接都保存在gevent队列中,但我认为这无关紧要.我敢肯定,如果我花一些时间,我可以想出一种方法来重新连接到数据库.但是我看了一下pymysql代码,我看到Connection类中有一个'ping'方法,我不确定如何使用它.
该方法看起来会在第一次重新连接,但之后又将重新连接标志再次切换为False?我可以使用这种方法,还是有不同的方法来建立连接丢失?即使不是pymysql,人们如何处理,数据库服务器崩溃并且不得不重新建立与mysql服务器的连接?
def ping(self, reconnect=True):
''' Check if the server is alive '''
if self.socket is None:
if reconnect:
self._connect()
reconnect = False
else:
raise Error("Already closed")
try:
self._execute_command(COM_PING, "")
return self._read_ok_packet()
except Exception:
if reconnect:
self._connect()
return self.ping(False)
else:
raise
Run Code Online (Sandbox Code Playgroud) 如果我查询:
select * from pg_stat_activity where application_name ~ 'example-application';
Run Code Online (Sandbox Code Playgroud)
我得到很多行,状态是idle和查询COMMIT.它们持久耐用,不会消失.一段时间后,我的应用程序达到hibernate.c3p0.max_size(池中的最大JDBC连接数)限制并停止使用数据库.
一些应用程序实现细节在其他SO线程中描述: 线程池中的Guice DAO提供程序 - 查询变为"在转换中空闲"
为什么会这样?如何解决这个问题呢?
我讨厌甚至提起这个b/c有这么多的几百页报道这个错误可追溯到7 - 8年......但是,我无法想象这一点.
我在服务器A上运行的报表服务连接到服务器B上的SQL Server 2008 R2.两台服务器都运行Windows Server 2008.报表服务是多线程的,每次在自己的线程上运行多达10个报表.
我的连接字符串如下:
Data Source=ServerB;Initial Catalog=DBName;trusted_connection=YES;Connection Timeout=0;Max Pool Size=500;
Run Code Online (Sandbox Code Playgroud)
如您所见,我已将连接超时设置为0以等待连接,直到其可用,并且最大池大小为500 b/c我想确保池对于我的多线程服务来说不是太小.该错误通常仅在服务启动时显示,并且存在等待处理的报告队列.
显然,要做的第一件事就是寻找泄漏的连接..必须有未关闭的连接导致池填满,对吧?没有 - 看起来像池永远不会填满.
我花了最后几个小时在服务器上运行性能监视器,观看".NET数据提供程序为SqlServer",而NumberOfPooledConnections从未超过20左右.我还在SQL服务器上运行perfmon,观看"SQLServer:General Statistics",UserConnections永远不会超过50.在此期间,我通过手动重新启动服务导致此错误报告2或3次.
我还能找到什么?还有什么会导致这个错误?完整的错误消息是:
System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
Run Code Online (Sandbox Code Playgroud)
谢谢,斯蒂芬
我正在使用Day CQ.我想使用Felix控制台中提供的连接池将一些数据存储在SQL Server数据库中.我可以通过使用在defineObjects标记中定义的SlingScriptHelper类型的"sling"对象从JSP执行此操作
sling.getService(DataSourcePool.class).
Run Code Online (Sandbox Code Playgroud)
但是,我想使用在OSGi包中创建的servlet来处理来自客户端的请求.servlet没有defineObjects标记,因此未定义"sling"对象.我没有看到在servlet中创建有效的SlingScriptHelper对象的方法,但似乎必须可行.
有办法吗?
我正在以适当的方式处理连接.
1.我在我的应用程序中使用"Hibernate"连接池.每当我从池中获得连接时,我都会在完成交易后返回池中.
2.我已经监测数据库,检查连接.我将'空闲连接'时间设置为60秒.我发现没有连接对象运行超过60秒.
我仍然经常收到这个错误.我的Web应用程序正在停止.我必须每天重启tomcat一次.但是,我正在寻找一个永久的解决方案,而无需重新启动tomcat.
任何人都可以解释根本原因吗?所以我可以解决这个问题.
错误日志:
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mchange.v2.c3p0.ComboPooledDataSourceBeanInfo. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
...
...
...
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)
Run Code Online (Sandbox Code Playgroud)
我的hibernate-contect.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" …Run Code Online (Sandbox Code Playgroud) 我想清除基本的3点,
是否在旧会话上开始新的数据库事务会获得新连接并恢复会话?
提交数据库事务是否会断开会话与JDBC连接并将连接返回到池?
从Hibernate Documentation,早期版本的Hibernate需要显式断开连接并重新连接Session.不推荐使用这些方法,因为开始和结束事务具有相同的效果.它们如何产生同样的效果?
session hibernate database-connection jpa connection-pooling
我使用Spring来实现以下目标:
在服务器上,我通过REST接口以XML格式接收数据.我想将数据转换为JSON并将其发布到另一个服务器.我的代码(我删除了一些敏感的类名/ URL以避免雇主的愤怒)看起来像这样:
主要/配置类:
package stateservice;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class App {
Logger log = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
System.out.println("Start!");
SpringApplication.run(StateServiceApplication.class, args);
System.out.println("End!");
}
@Bean
public RestTemplate restTemplate() {
log.trace("restTemplate()");
HttpHost proxy = new HttpHost("proxy_url", 8080);
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(50);
RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy).build();
HttpClientBuilder httpClientBuilder …Run Code Online (Sandbox Code Playgroud) java spring connection-pooling apache-httpclient-4.x spring-boot