- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 Hibernate 属性来定义连接池大小,以及 LocalSessionFactoryBean
和 DriverManagerDataSource
来创建 org.hibernate.SessionFactory
我观察到 1000 个 TCP 连接打开到数据库服务器,而不是我预期的连接池大小上限 100。
设置连接 Hibernate 池的代码如下所示。请注意最大大小为 100,但是我从我的工作站观察到 1000 个到数据库服务器的连接 - 我在 Windows 机器上使用 TCPView 连接到由 Vagrant (VirtualBox) 管理的 Centos OS VM 上的 MariabDB 实例
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
hibernateProperties.put("hibernate.show_sql", false);
hibernateProperties.put("hibernate.generate_statistics", false);
hibernateProperties.put("hibernate.hbm2ddl.auto", "update");
hibernateProperties.put("hibernate.use_sql_comments", false);
hibernateProperties.put("hibernate.c3p0.min_size", 10);
hibernateProperties.put("hibernate.c3p0.max_size", 100);
hibernateProperties.put("hibernate.c3p0.timeout", 1500);
hibernateProperties.put("hibernate.c3p0.max_statements", 5000);
hibernateProperties.put("hibernate.c3p0.idle_test_period", 60);
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setHibernateProperties(hibernateProperties);
localSessionFactoryBean.setMappingResources("job.persistence.xml");
我希望看到这些连接在 100 时达到最大值并被重新用于以后的循环执行,但我观察到超过 1000 个连接在 TIME_WAIT 中等待了大约一分钟,然后才关闭。以下是 TCPView 的输出示例:
[System Process] 0 TCP localhost 62794 192.168.98.102 3306 TIME_WAIT
[System Process] 0 TCP localhost 62796 192.168.98.102 3306 TIME_WAIT
[System Process] 0 TCP localhost 62797 192.168.98.102 3306 TIME_WAIT
[System Process] 0 TCP localhost 62795 192.168.98.102 3306 TIME_WAIT
[System Process] 0 TCP localhost 62798 192.168.98.102 3306 TIME_WAIT
[System Process] 0 TCP localhost 62801 192.168.98.102 3306 TIME_WAIT
我显然做错了什么,但不确定是什么。我正在使用 Spring 来管理提供数据访问逻辑的 DAO。 DAO 注册为原型(prototype) Spring 作用域,而 Singleton SessionFactory
像这样注入(inject)到 DAO 中:
@Bean(name="jobDao")
@Scope(SpringBeanScope.Prototype)
public JobDao jobDao(SessionFactory jobSessionFactory) { //...}
在 DAO 中,我调用 sessionFactory.getCurrentSession()
来访问数据库 session 。以下是通用 DAO 基础的摘录,演示了这一点:
protected Session currentSession() {
return sessionFactory.getCurrentSession();
}
@Transactional
@Override
public void Add(TEntity entity) {
currentSession().save(entity);
}
有谁知道当连接池限制为 100 时为什么会打开这么多 TCP 连接?
更新
由于此问题出现在 Windows 开发机器上,我将一个小型 .NET 控制台应用程序放在一起,该应用程序使用并行 for 循环来执行一个简单的 SQL 选择语句,最大线程数为 64,每次都创建一个新连接:
public void Test()
{
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 64;
Parallel.For(0,
1000,
options,
(i, state) =>
{
ExecuteSql();
});
}
private void ExecuteSql()
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, new SqlConnection(connectionString));
DataSet orders = new DataSet();
adapter.Fill(orders, "Order");
Console.WriteLine("Thread {0} returned {1} rows", Thread.CurrentThread.ManagedThreadId, orders.Tables[0].Rows.Count);
}
TCPView 结果如下所示,这是我希望在连接池解决方案中看到的结果,即TCP 连接被重用
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61316 dev-database01 ms-sql-s ESTABLISHED 1 88 776 2,684,495 43,800 16
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61317 dev-database01 ms-sql-s ESTABLISHED 1 88 507 1,998,709 6,326 1
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61318 dev-database01 ms-sql-s ESTABLISHED 2 176 862 3,081,722 49,640 19
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61319 dev-database01 ms-sql-s ESTABLISHED 2 176 952 3,128,657 14,600 9
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61320 dev-database01 ms-sql-s ESTABLISHED 2 176 1,149 3,569,440 25,747 8
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61321 dev-database01 ms-sql-s ESTABLISHED 2 176 1,166 3,788,974
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61322 dev-database01 ms-sql-s ESTABLISHED 2 176 884 3,197,392 8,713 2
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61323 dev-database01 ms-sql-s ESTABLISHED 2 176 535 1,816,150
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61324 dev-database01 ms-sql-s ESTABLISHED 2 176 631 2,197,973
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61327 dev-database01 ms-sql-s ESTABLISHED 2 176 1,037 3,344,226 18,980 5
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61328 dev-database01 ms-sql-s ESTABLISHED 3 264 1,271 4,057,097 30,660 13
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61331 dev-database01 ms-sql-s ESTABLISHED 2 176 780 2,639,988 8,760 2
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61333 dev-database01 ms-sql-s ESTABLISHED 2 176 1,041 3,352,777 31,248 12
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61334 dev-database01 ms-sql-s ESTABLISHED 6 995 729 2,387,668
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61335 dev-database01 ms-sql-s ESTABLISHED 6 995 601 1,917,537 23,937 6
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61336 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61339 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61340 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61342 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61343 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61344 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61345 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61346 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61356 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61357 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61358 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61359 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61362 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61363 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61364 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61365 dev-database01 ms-sql-s ESTABLISHED
DatabaseTcpPortTester.vshost.exe 5036 TCP localhost 61369 dev-database01 ms-sql-s ESTABLISHED
[System Process] 0 TCP localhost 61395 dev-database01 epmap TIME_WAIT
最佳答案
在 netstat 输出中,它们都处于 TIME_WAIT
状态,指示实际关闭之前 TCP 套接字的状态。这并不意味着数据库连接处于 Activity 状态,只是 TCP 处于套接字关闭过程中。
其中有多少处于ESTABLISHED
状态?这将告诉您在那个时间点打开的数据库连接的确切数量。
您可以引用以下链接了解不同的 TCP 套接字状态。 https://en.wikipedia.org/wiki/Transmission_Control_Protocol
关于Java 连接池不限制打开到数据库服务器的 TCP 连接数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986075/
最近,我们将专用 SQL 池部署到生产中的 Synapse 工作区。在开发中,我们可以访问无服务器 SQL 池和专用 SQL 池。但是,在生产中,我们可以访问无服务器 SQL 池,但无法访问专用 SQ
假设您从一个项目公开 WCF 服务,并使用“添加服务引用”(在本例中为 Framework 3.5 WPF 应用程序)在另一个项目中使用它。 当您重新实例化 ClientBase 派生代理时,Clie
我有一个函数,它使用 multiprocessing.Pool 并行处理一个数据集中的所有数据。 from multiprocessing import Pool ... def func():
我正在尝试使用进程对象在 python 中使用工作池。每个 worker (一个进程)进行一些初始化(花费大量时间),传递一系列作业(理想情况下使用 map()),并返回一些东西。除此之外,不需要任何
我是软件工程师,最近我构建了我的 Linux 机器,想探索更多系统管理员类型的任务。我已经探索并阅读了很多关于 ZFS 的内容,但我越来越困惑,因为每篇文章对它的描述都不一样。 Everything
我有 zfs 池: $ sudo zpool status lxd pool: lxd state: ONLINE scan: none requested config: NAME
我有一个基于 Actor 的项目,对于其中的一部分,我必须使用一些接收消息的 Actor ,然后一个 Actor 分别分配给每个请求,每个 Actor 负责执行其消息请求,所以我需要类似线程的东西我的
我已经使用 QEMU 模拟器成功地将 FreeBSD 安装到原始图像文件中。我已经使用 ZFS 文件系统 (ZFS POOL) 格式化了图像文件。 使用下面的命令我已经成功地挂载了准备好由 zpool
我正在使用 multiprocessor.Pool并行处理一些文件。该代码等待接收文件,然后使用 Pool.apply_async 将该文件发送给工作人员。 ,然后处理文件。 这段代码应该一直在运行,
我正在使用带有光滑的 Bonecp 数据源。并发现池包含关闭的连接所以我总是遇到这个异常 java.sql.SQLException: Connection is closed! at com
我有apartment gem的 Multi-Tenancy Rails应用程序,我可以使用apartment-sidekiq在每个工作程序中成功切换数据库租户。但是,sidekiq worker 正
ZFS 池可能由数据集(文件系统、快照等)或卷组成。 ZFS 卷就像 block 设备,但我不明白池和文件系统之间的区别。当我通过 zpool create pool1 sda sdb sdc 创建
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我在tomcat中有一个jdbc池,用于建立数据库连接。我在使用后没有显式关闭连接对象。我的“maxActive”参数设置为100。应用程序运行了一段时间,但随后失败进行数据库查询。它会等待无限时间来
阅读 PostgreSQL 文档 here我读了以下内容: As well, connections requested for users other than the default config
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我正在读取一个大的 URL 文件并向服务发出请求。该请求由返回 ListenableFuture 的客户端执行。现在我想保留一个 ListenableFuture 池,例如最多同时执行 N 个 Fut
我想使用队列来保存结果,因为我希望消费者(串行而不是并行)在工作人员产生结果时处理工作人员的结果。 现在,我想知道为什么以下程序挂起。 import multiprocessing as mp imp
我正在开发一个单页应用程序,目前正在构建一个 JQuery、ajax 函数,以便我的所有调用都能通过。 对于一个典型的页面,我可能有 3 个 ajax 调用。我的想法是,如果用户互联网出去将这些 aj
我有一个单位类及其一些子类(弓箭手、剑客等)。我怎样才能创建一个回收所有单元类型子类的池? 最佳答案 这是不可能的,因为池只能包含一种特定类型的对象。否则你可能会遇到这样的情况: Pool unitP
我是一名优秀的程序员,十分优秀!