JdbcUtils 处理多线程并发访问问题 | 学习笔记

简介: 快速学习 JdbcUtils 处理多线程并发访问问题

开发者学堂课程【JDBC 数据库开发进阶JdbcUtils 处理多线程并发访问问题】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/32/detail/694


JdbcUtils 处理多线程并发访问问题


内容简介:

相关代码


相关代码

package cn.itcast.jdbc;

import java.sql.connection;

public class JdbcUtils {

//配置文件的默认配置!要求你必须给出c3p0-config.xml! ! !

private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

//它是事务专用连接!

private static connection con = null;

/**

使用连接池返回一个连接对象

*@return

*@throws SQLException

*/

public static Connection getConnection( ) throws sQLException {

//当con不等于null,说明已经调用过beginTransaction (),表示开启了事务!if( con != null) return con;

return datasource.getconnection ();

}

*使用连接池返回一个连接对象

*@return

*@throws SQLException

*/

public static connection getconnection() throws sQLException {

//当con不等于null,说明已经调用过beginTransaction ( ),表示开启了事务!

if ( con != null) return con;

return datasource.getConnection () ;

}

/**

*返回连接池对象!

*/return

*/

public static Datasource getDatasource () {

return datasource;

}

/**

*开启事务

*1.获取一个connection,设置它的setautoComnrnit (false)

*2.还要保证dao中使用的连接是我们刚刚创建的!

*--------------

*1.创建一个connection,设置为手动提交

*2.把这个connection给dao用!

*3.还要让conitTransaction或rollbackTransaction可以获取到!

*@throws sQLException

*/

public static void beginTransaction()throws sQLException {

if(con != null) throw new sQLException("已经开启了事务,就不要重复开启了!");

/*

*1.给con赋值!

*2.给con设置为手动提交!

*/

con = getconnection( ) ; //给con赋值,表示事务已经开始了con.setAutoCormit (false) ;

}

tl.set (con);//把兰刖线程的连接保仔起米!

}

/**

*提交事务

*1.获取beginTransaction提供的connection,然后调用commit方法/*@throws SQLException

*/

public static void commitTransaction() throws sQLException {

if(con == null) throw new SQLException ("还没有开启事务,不能提交! ");

/*

*1.直接使用con. commit ()

*/

con- commit ();

con.close ();

//把它设置为null,表示事务已经结束了!下次再去调用getConnection ()返回的就不是gon 了son.= null;

}

/**

*提交事务

*1.获取beginTransaction提供的connection,然后调用rollback方法

throws SQLException

*/

public static void rollbackTransaction () throws sQLException {

Connection con =  

if(con == null) throw new sQLException ("还没有开启事务,不能回滚!");

/*

*1.直接使用con.rollback ()

*/

Con.rollback ();

con.-close () ;

con= null;

}

/**

*释放连接

*@param connection

*@throws sQLException

*/

public static void releaseConnection(Connection connection) throws SQLException

Connection con = tl.get ();

/*

*判断它是不是事务专用,如果是,就不关闭!

*如果不是事务专用,那么就要关闭!

*/

//如果con == null,说明现在没有事务,那么connection一定不是事务专用的!

if(con ==null) connection.close () ;

//如果con != null,说明有事务,那么需要判断参数连接是否与con相等,若不等,说明参数连接不

if(con != connection) connection.close() ;

}

package cn.itcast.jdbc;

import java.sql.sQIException;

public class Demo1 {

private AccountDao dao = new AccountDao ( );

@Test

public void serviceMethod ( ) {

try {

JdbcUtils.beginTransaoction( ) ;

dao.update.("zs",-1.00);

if(true) throw new RuntimeException ( ;

dao.update(".ls"...100);

JdbcUtils.oommitTransaction ( ) ;

}catch(Exception e) {

try {

JdbcUtils. rollbackTransaction ( ) ;

catch isOLException e1) {

image.png

image.png

相关文章
|
2月前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
76 0
|
4天前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
14 0
|
1月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
2月前
|
调度
多线程学习笔记
这篇文章是多线程学习笔记,涵盖了线程与进程的概念、多线程实现方式、线程状态、线程同步与不安全示例、死锁问题以及生产者与消费者问题等多线程编程的关键知识点。
多线程学习笔记
|
2月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
1月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
2月前
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
35 0
|
2月前
|
Java 开发者
【编程高手必备】Java多线程编程实战揭秘:解锁高效并发的秘密武器!
【8月更文挑战第22天】Java多线程编程是提升软件性能的关键技术,可通过继承`Thread`类或实现`Runnable`接口创建线程。为确保数据一致性,可采用`synchronized`关键字或`ReentrantLock`进行线程同步。此外,利用`wait()`和`notify()`方法实现线程间通信。预防死锁策略包括避免嵌套锁定、固定锁顺序及设置获取锁的超时。掌握这些技巧能有效增强程序的并发处理能力。
21 2
|
2月前
|
开发框架 Android开发 iOS开发
跨平台开发的双重奏:Xamarin在不同规模项目中的实战表现与成功故事解析
【8月更文挑战第31天】在移动应用开发领域,选择合适的开发框架至关重要。Xamarin作为一款基于.NET的跨平台解决方案,凭借其独特的代码共享和快速迭代能力,赢得了广泛青睐。本文通过两个案例对比展示Xamarin的优势:一是初创公司利用Xamarin.Forms快速开发出适用于Android和iOS的应用;二是大型企业借助Xamarin实现高性能的原生应用体验及稳定的后端支持。无论是资源有限的小型企业还是需求复杂的大公司,Xamarin均能提供高效灵活的解决方案,彰显其在跨平台开发领域的强大实力。
31 0
|
3月前
|
Java 开发者
Java中的多线程与并发控制
【7月更文挑战第31天】在Java的世界中,多线程是提升程序性能和响应能力的关键。本文将通过实际案例,深入探讨Java多线程的创建、同步机制以及并发包的使用,旨在帮助读者理解并掌握如何在Java中高效地实现多线程编程。
42 3