最近系统突然出现了一个让我无比头痛的问题,系统后台一个劲的报错:数据库发生死锁、数据库服务不存在或者拒绝访问。这几天查了很多地方,关于死锁问题,关于网络问题,可是丝毫没有进展,直到我使用工具查看到web服务器的机子上对于数据库连接的请求出奇的多,达到了了3000多个timewait状态的连接。系统本身除了启动web服务外,还启动了3个线程,我只好就这三个线程一个个的排查,结果发现真的是由于其中一个线程导致的。查看了相关的代码,发现代码里面用到的connection连接不一致,有一处用到了web服务的connection连接,于是修改了相关的connection连接。结果真的都好了。开心那。
对问题总结一下。JDBC Connection 类是非线程安全的 ― 两个线程不能在小粒度级上安全地共享一个 Connection。
经过本次事件我学到,1、多线程编程一定要注意线程安全问题。2、多线程会导致数据库死锁、数据库服务拒绝访问。
ps:以下是这两天让我郁闷的错误信息。
ERROR 8284609 insert_account_reg [HttpProcessor[80][54]] insert_account_reg.java
88 -- java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]Tra
nsaction (Process ID 258) was deadlocked on lock | communication buffer resource
s with another process and has been chosen as the deadlock victim. Rerun the tra
nsaction.
ERROR 48838236 np2interfaceprj.InstructionParse [Thread-4] InstructionParse.java 252 -- once handle intruction guene error
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6879)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7036)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3028)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at cn.com.xinli.tools.dblink.DBPool$2.getConnection(DBPool.java:42)
at cn.com.xinli.tools.dblink.DBPool.getConnection(DBPool.java:78)
at np2interfaceprj.InstructionParse.run(InstructionParse.java:194)
at java.util.TimerThread.mainLoop(Timer.java:432)
at java.util.TimerThread.run(Timer.java:382)
分享到:
相关推荐
对于初学者,这是一个很好的学习资源,可以深入理解Spring Boot的自动配置、Druid的数据源管理和Java的多线程编程。同时,对于有经验的开发者,这个项目也可以作为一个基础,进一步扩展到更复杂的数据库同步和分布式...
本教程将深入探讨如何在Spring Boot环境下实现多数据源操作及分布式事务管理,并加入对多线程的支持。 首先,我们来理解多数据源的概念。在大型系统中,往往需要连接多个数据库,如主库、从库、测试库等。Spring ...
本项目围绕“Java简单分布式架构,多个数据源,线程池多线程访问”这一主题展开,旨在通过利用Java技术栈实现一个高效的分布式系统。 首先,我们关注的是“分布式”这一概念。分布式系统是由多台计算机通过网络连接...
这个切面可以利用ThreadLocal变量来存储当前线程所使用的数据源标识,确保在同一个线程内,对数据库的操作使用相同的连接。具体实现中,需要定义一个Pointcut来指定哪些方法触发数据源切换,以及一个Advice来执行...
总结,通过在PowerBuilder中实现多线程同步查询数据,开发者可以提升应用程序的并发能力和性能,尤其是在处理大规模数据和多个数据库连接的场景下。理解并熟练运用线程同步技术,是提升PowerBuilder应用程序质量的...
在Java Web应用中,Tomcat作为一款广泛应用的Servlet容器,其数据源连接池配置是确保高效、稳定数据库访问的关键步骤。本篇文章将详细介绍如何在Tomcat中配置数据源连接池,以及涉及的相关jar包文件。 首先,理解...
"动态数据源之分库解析1(固定N数据源,切换多数据源)"这个主题正是针对这样的场景,探讨如何在运行时动态地切换和管理多个数据库连接。下面将详细讲解相关知识点。 1. **动态数据源**:动态数据源是在运行时能够...
总的来说,多线程TCP连接测试程序是一个用于验证和评估多线程环境下TCP连接性能的工具。它可以帮助开发者理解并发TCP连接的工作方式,以及如何在实际应用中有效利用多线程技术提高网络服务的处理能力。通过不断实践...
在SpringBoot应用中,多数据源意味着系统能够连接并操作多个不同的数据库。这可能是因为业务需求的不同,如用户数据存储在一个数据库,交易数据存储在另一个数据库。多数据源配置允许我们灵活地管理这些数据。 ...
在多线程环境下,每个TCP连接由一个独立的线程处理,这样可以避免单线程处理多个连接时的阻塞问题,提高服务器的并发处理能力。在标题和描述中提到的"每个socket连接进来然后创建一个线程",就是这种并发处理策略的...
服务器端代码通常会包含上述的多线程和Winsock通信逻辑,而客户端代码则负责建立连接、发送数据并接收服务器的响应。 在客户端方面,我们通常会先调用`connect()`函数连接到服务器,然后同样使用`send()`和`recv()`...
这个抽象类可以根据某种规则(如请求参数、线程变量等)动态选择数据源。你需要继承它并重写`determineCurrentLookupKey`方法来实现数据源的选择逻辑。 3. **事务管理器配置**:在多数据源环境中,需要配置多个事务...
在Spring Boot应用中,多数据源连接是一种常见的需求,尤其在大型系统中,可能需要连接到不同的数据库以实现数据隔离、读写分离或是利用不同类型的数据库特性。本项目提供了实现这一功能的示例,可以直接使用,同时...
在多线程环境下使用MySQL数据库,需要注意以下几点: 1. **线程安全**:由于多个线程可能同时访问数据库,因此必须确保所有数据库操作都是线程安全的。这意味着避免共享资源或在必要时使用锁来同步对共享数据的访问...
在多线程环境下,控制连接通常保持不变,而数据连接可能根据需要创建多个。 4. **FileZilla特点**:FileZilla支持断点续传,能记住会话信息,提供强大的队列管理和传输速度限制功能。它的源代码包含了许多实用的FTP...
在处理网络接收数据时,使用多线程可以避免因为单一线程处理数据而造成的阻塞,使得程序能够同时接收和处理来自多个源的数据包。 其次,UDP(User Datagram Protocol)是一种无连接的传输层协议,它比TCP...
测试部分可能会比较不同并发策略下的性能差异,如单线程、多线程无锁、多线程带锁等。 总结来说,理解和掌握这些知识点对于在C#中高效且安全地实现多线程读写SQLite数据库至关重要。通过合理利用多线程并正确实施...
综上所述,易语言的WebSocket支持多线程连接、代理协议头操作等功能,使得开发者能够在各种网络环境下灵活构建实时通信应用。通过深入理解这些特性,开发者可以充分利用易语言的优势,开发出高效、稳定的网络应用,...
代码会清晰地展示如何建立连接、发送和接收数据,以及如何在服务器端使用多线程处理并发的客户端连接。 多线程在服务器端的作用在于提高服务的并发能力,使得服务器可以同时处理多个客户端的请求,而不至于因为单...
3. **数据源路由**:为了在应用中动态切换数据源,我们可以实现一个`AbstractRoutingDataSource`,它可以根据特定条件(如请求参数、线程本地变量等)选择使用哪个数据源。你需要定义一个方法来决定当前应该使用哪个...