JDBC的学习(02)

2023-05-16

关于JDBC的学习(2)

文章目录

    • 关于JDBC的学习(2)
        • Blob类型和批量操作
          • 1、Blob类型操作
          • 2、批量操作
        • 数据库事务
          • 1、事务的概念
          • 2、事务的ACID属性
          • 3、数据库的四种隔离级别
            • 数据库的并发问题
            • 数据库提供的**隔离级别**
          • 4、MySQL设置隔离级别方法
        • DAO概念
          • 1、概念
          • 2、功能实现

Blob类型和批量操作

一定要注意环境:1、java驱动(Driver类) 2、数据库环境

1、Blob类型操作

首先,Blob数据类型是什么?

Blob(Binary large Object),顾名思义 二进制大对象,用来存储大量的二进制和文本数据的一种数据类型。这里以图片为例。

Mysql的4中Blob类型:

TinyBlob-最大255个字节 Blob-最大65个字节 MediumBlob-最大16M LongBlob-最大4G

Blob类型存储的操作流程是什么?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJR8IT2P-1587998597227)(E:\网课学习笔记\学习总结-md文件\JDBC.asset\BLob流程.png)]

上图为读/写一个Blob的输入流。

上传Blob数据类型代码:

public void setBlobType() {
		Connection conn = null;
		PreparedStatement ps = null;
		int flag = 0;
		try {
			//1、建立连接
			conn = JDBCUtils.connectionMysql();
			//2、预编译SQL语句
			String sql = "insert into customers(name, email, birth, photo) values (?, ?, ?, ?)";
			ps = conn.prepareStatement(sql);
			//3、填充占位符
			ps.setObject(1, "张三");
			ps.setObject(2, "zhangsan@163.com");
			ps.setObject(3, "1997-05-30");
			//4、填充流,导入要保存的图片
			InputStream in = new FileInputStream(new File("1.jpg"));
			ps.setBlob(4, in);
//			ps.setBinaryStream(4, in);     这是第二种方法
			//5、提交执行
			flag = ps.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {			
			//6、关闭资源
			JDBCUtils.closeRes(conn, ps, null);
		}
		//7、检测是否成功
		if (flag != 0) {
			System.out.println("添加成功");
		}else {
			System.out.println("添加不成功");
		}
	}

读取Blob代码:(这里实现的是,读取MySQL数据库中的Blob类型的图片,并写入到自己磁盘)

public void getBlobType()  {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		InputStream in = null;
		FileOutputStream fos = null;
		try {
			//1、建立连接
			conn = JDBCUtils.connectionMysql();
			//2、预编译SQL语句
			String sql = "select name, email, birth, photo from customers where id = ?";
			ps = conn.prepareStatement(sql);
			//3、填充占位符
			ps.setObject(1, 24);
			//4、提交操作,获得结果集
			rs = ps.executeQuery();
			
			if(rs.next()) {
				String name = rs.getString(1);
				String email = rs.getString(2);
				Date birth = rs.getDate(3);			
				System.out.println(name + ":" + email + ":" + birth);
			}
			
			//5、获取流,将它保存到本地上
			Blob blob = rs.getBlob(4);
			in = blob.getBinaryStream();
			//in = rs.getBinaryStream("photo");
			byte[] bytes = new byte[1024];
			fos = new FileOutputStream("zhangsan1.jpg");
			int len = 0;
			while ( (len = in.read(bytes))!= -1) {
				fos.write(bytes, 0, len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeRes(conn, ps, rs);			
		}
		//6、释放资源
		try {
			if (in != null) {
				in.close();				
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		try {
			if (fos != null) {
				fos.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

关于JDBC使用PreparedStatement一个重要原因就是,Statement不支持传输Blob类型(MySQL支持)的数据。

总结:关于Blob,个人感觉就像是读写文件一样,在上传和下载过程中,区别就是存取的位置不一样。为了抓紧入门,没有去理解深度的原理。切记一定仔细参阅API文档,很重要。

2、批量操作

应用场景:当我们要大量的重复同一件事时(操作相同,数据不同),如成批插入和更新记录时,我们可以采用Java的批量更新机制。

这里扩展一下执行插入操作的一个过程。

数据库执行操作一般分为两个步骤:1、操作的执行 2、提交(commit)

只有数据库执行提交操作,才算真正的执行操作,并且不能回滚的。

Java的批量更新机制允许多条语句一次性提交数据库进行批量处理。

就像是运送东西一样,我原本只能一次运送一个,有了这个机制,一次就可以运送多个;

主要涉及三个代码:

// 我们这里需要一些循环操作,因为我们传入的SQL语句并不是一次性的,而是我们主动的去让它执行多少次语句。
addBatch(String sql); // sql   要批量执行SQL语句      我们这里需要一些循环操作,因为我们传入的SQL

executeBatch();  // 提交我们已经积累的SQL语句

//当我们提交完成后,需要将缓存的数据清空,在进行“攒”
clearBatch(); //清空缓存的数据

大部分使用的可能是直接从excel中去往数据库写文件。

数据库事务

1、事务的概念

事务是什么?

一组逻辑操作单元。事务其实就是指我们要执行的事情,这其中可能包括一个或多个操作。

事务的处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方
式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

打个比方,就像过河一样,我们要么到河的另一边,要么就要回到河的这一边。不能保持在停留在河中的一种状态。

2、事务的ACID属性
  • 原子性(Atomicity):是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
  • 一致性(Consistent):事务必须使数据库从一个一致性状态变换到另一个一致性状态
  • 隔离性(Isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久行的,接下来的其他操作和数据库故障不应该对其有任何影响。
3、数据库的四种隔离级别
数据库的并发问题
  • 脏读:事务读取到其他事务没有被提交的字段,如果其他事务取消提交,这读到的数据无效。
  • 不可重复读:是指在同一事务中,事务读取数据之后,其他事务修改了数据,然后这个事务再次读取数据,两次读取不一致。
  • 幻读:就是在一个事务读取的数据的时候,另个一事务向其中插入数据,然后这个事务再次读取的时候,就会多出好几个行。
数据库提供的隔离级别
隔离级别描述
READ UNCOMMITED
(读未提交数据)
允许事务读取未被其他事务提交的变更, 不能解决数据库的任意并发问题
READ COMMIT
(读已提交数据)
只能读取已经被其他事务提交的数据,可以避免脏读,不能解决不可重复读和幻杜问题
REPEATABLE READ
(可重复读)
确保事务可以多次从一个字段中读取相同的值,在本事务执行期间,禁止其他事务对该字段的更新操作。可以解决脏读和不可重复读,但是幻读问题无法解决。
SERIALIZABLE
(串行化)
确保事务可以从一个表中读取相同的行,这个事务持续期间,禁止其他事务对该表执行插入,更新,和删除操作,所有并发问题都可以避免,性能低下。

MySQL默认的是REPEATABLE READ,并且MySQL支持以上4中隔离级别

Oracle默认的是READ COMMITED 并且 Oracle只支持 READ COMMITED,SERIALIZABLE,

4、MySQL设置隔离级别方法
  1. 查询当前隔离级别
select @@tx_isolation
  1. 设置当前MySQL连接的隔离级别
set transaction isolation level read committed;
  1. 设置数据库系统全局的隔离级别
set global transaction isolation level read committed;

DAO概念

1、概念

DAO :Data Access Object 数据访问的类和接口,包括了对数据的插入,更新,删除等。数据访问:顾名思义就是与数据库打交道,中间不掺杂任何其他的业务,

2、功能实现

主要实现思想是:

  1. 创建一个BaseDao的类,里面实现通用的增删改查的方法。
  2. 创建一个针对于某个表的接口,定义该表所需要实现的抽象方法、
  3. 创建一个上面接口的实现类,并且继承BaseDao的类。重写接口中的所有方法,就可以使用了。

jdbc.properties

userName=javaweb
password=123456
url=jdbc:mysql://192.168.1.10:3306/jdbc
driverClassName=com.mysql.cj.jdbc.Driver

BaseDao.java

public abstract class BaseDao<T> {
	/**
	 * @throws Exception 
	 * 
	 * @Title: connection_MySql
	 * @Description: TODO 这是建立连接的类
	 * @return void 返回类型
	 * @throws
	 */
	public static Connection connection_MySql() {
		//1、加载配置文件
		InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("jdbc.properties");
		Properties pros = new Properties();
		Connection conn = null;
		try {
			//2、读取配置文件信息
			pros.load(in);
			String className = pros.getProperty("className");
			String url = pros.getProperty("url");
			String user = pros.getProperty("user");
			String password = pros.getProperty("password");
			//3、注册Driver类信息
			Class.forName(className);
			//4、建立连接
			conn = DriverManager.getConnection(url, user, password);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 
	 * @Title: closeRes
	 * @Description: TODO   关闭资源
	 * @param conn
	 * @param ps
	 * @param rs 参数
	 * @return void 返回类型
	 * @throws
	 */
	public static void closeRes(Connection conn, PreparedStatement ps, ResultSet rs) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	/**
	 * 
	 * @Title: update
	 * @Description: TODO 执行增删改的通用方法
	 * @param conn
	 * @param sql
	 * @param args
	 * @return 参数
	 * @return int 返回类型
	 * @throws
	 */
	public static int update(Connection conn, String sql, Object...args) {	
		PreparedStatement ps = null;
		try {
			//1、预编译SQL语句
			ps = conn.prepareStatement(sql);
			//2、填充占位符
			for (int i = 0; i < args.length; i ++) {
				ps.setObject(i + 1, args[i]);
			}
			//3、提交语句获得返回值Long
			int resultCount = ps.executeUpdate();
			return resultCount;
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return 0;
	}
	
	/**
	 * 
	 * @Title: query
	 * @Description: TODO 只能查询一条信息的查询方法
	 * @param <T>
	 * @param clazz
	 * @param conn
	 * @param sql
	 * @param args
	 * @return 参数
	 * @return T 返回类型
	 * @throws
	 * 
	 */
	public static <T> T query(Class<T> clazz,Connection conn, String sql, Object...args) {
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//1、预编译SQL语句
			ps = conn.prepareStatement(sql);
			//2、填充占位符
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			//3、提交查询语句并返回结果集
			rs = ps.executeQuery();
			//4、获得结果集的元数据
			ResultSetMetaData rsmd = rs.getMetaData();
			//5、获取列数和列名
			int columnCount = rsmd.getColumnCount();
			//6、利用反射动态的给javabean类赋值
			if (rs.next()) {
				T resultData = clazz.newInstance();
				for (int i = 0; i < columnCount; i ++) {
					String columnName = rsmd.getColumnLabel(i + 1);
					Object getObjectData = rs.getObject(columnName);
					Field field = clazz.getDeclaredField(columnName);
					field.setAccessible(true);
					field.set(resultData, getObjectData);
				}
				//7、返回javabean类
				return resultData;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeRes(null, ps, rs);
		}
		return null;
	}
	
	/**
	 * 
	 * @Title: queryAll
	 * @Description: TODO  查询所有结果的方法
	 * @param <T>
	 * @param clazz
	 * @param conn
	 * @param sql
	 * @param args
	 * @return
	 * @throws Exception 参数
	 * @return List<T> 返回类型
	 * @throws
	 */
	public static <T> List<T> queryAll(Class<T> clazz, Connection conn, String sql, Object...args) {
		ArrayList<T> list = new ArrayList<T>();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//1、预编译SQL语句
			ps = conn.prepareStatement(sql);
			//2、填充占位符
			for (int i = 0; i < args.length; i ++) {
				ps.setObject(i + 1, args[i]);
			}
			//3、提交语句并返回结果集
			rs = ps.executeQuery();
			//4、获得结果集的元数据
			ResultSetMetaData rsmd = rs.getMetaData();
			//5、获取列数和列名
			int columnCount = rsmd.getColumnCount();
			//6、处理每一条返回语句
			while (rs.next()) {
				T resultData = clazz.newInstance();
				for(int i = 0; i < columnCount; i ++) {
					String columnLabel = rsmd.getColumnLabel(i + 1);
					Object getObjectData = rs.getObject(columnLabel);
					//7、利用反射动态的给javabean类赋值
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(resultData, getObjectData);
				}
				list.add(resultData);
			}
			//8、返回结果的集合
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			closeRes(null, ps, rs);
		}
		return null;
	}
	
	public <E> E getValue(Connection conn,String sql,Object...args){
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(sql);
			for(int i = 0;i < args.length;i++){
				ps.setObject(i + 1, args[i]);
				
			}
			
			rs = ps.executeQuery();
			if(rs.next()){
				return (E) rs.getObject(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.closeRes(null, ps, rs);
			
		}
		return null;
		
	}	
}

CustomersDao.java ---- 针对于Customer表的接口

public interface CustomersDao {
	/**
	 * 
	 * @Title: insert
	 * @Description: TODO 将cust对象添加到数据库中
	 * @param conn
	 * @param cuts 参数
	 * @return void 返回类型
	 * @throws
	 */
	public void insert(Connection conn, Customers cuts);
	/**
	 * 
	 * @Title: deleteById
	 * @Description: TODO 针对指定ID,删除表中的一条记录
	 * @param conn
	 * @param id 参数
	 * @return void 返回类型
	 * @throws
	 */
	public void deleteById(Connection conn, int id);
	/**
	 * 
	 * @Title: update
	 * @Description: TODO 针对内存中的cust对象,去修改数据表中的指定的记录
	 * @param conn
	 * @param cust 参数
	 * @return void 返回类型
	 * @throws
	 */
	public void update(Connection conn, Customers cust);
	/**
	 * 
	 * @Title: getCustomerById
	 * @Description: TODO 针对指定的id查询得到对应的Customer对象
	 * @param conn
	 * @param id 参数
	 * @return void 返回类型
	 * @throws
	 */
	public void getCustomerById(Connection conn, int id);
	/**
	 * 
	 * @Title: getAll
	 * @Description: TODO 查询表中的所有记录构成的集合
	 * @param conn 参数
	 * @return void 返回类型
	 * @throws
	 */
	public void getAll(Connection conn);
	/**
	 * 
	 * @Title: getCount
	 * @Description: TODO 返回数据表中的数据的条目数
	 * @param conn
	 * @return 参数
	 * @return Long 返回类型
	 * @throws
	 */
	public Long getCount(Connection conn);
	/**
	 * 
	 * @Title: getMaxBirth
	 * @Description: TODO 返回数据表中最大的生日
	 * @param conn
	 * @return 参数
	 * @return Date 返回类型
	 * @throws
	 */
	public Date getMaxBirth(Connection conn);
}

CustomersDaoImpl.java

public class CustomersDaoImpl extends BaseDao<Customers> implements CustomersDao {

	@Override
	public void insert(Connection conn, Customers cuts) {
		String sql = "insert into customers(name, email, birth) values(?,?,?)";
		int counts = update(conn, sql, cuts.getName(), cuts.getEmail(), cuts.getBirth());
		if (counts != 0) {
			System.out.println("插入成功");
		}else {
			System.out.println("插入失败");
		}
	}

	@Override
	public void deleteById(Connection conn, int id) {
		String sql = "delete from customers where id = ?";
		int counts = update(conn, sql, id);
		if (counts != 0) {
			System.out.println("删除成功");
		}else {
			System.out.println("删除失败");
		}

	}

	@Override
	public void update(Connection conn, Customers cust) {	
		String sql = "update customers set name = ?, email = ?, birth = ? where id = ?";
		int counts = update(conn, sql, cust.getName(), cust.getEmail(), cust.getBirth(), cust.getId());
		if (counts != 0) {
			System.out.println("更新成功");
		} else {
			System.out.println("更新失败");
		}
	}

	@Override
	public void getCustomerById(Connection conn, int id) {
		String sql = "select id, name, email, birth from customers where id = ?";
		Customers result = query(Customers.class, conn, sql, id);
		if (result != null) {
			System.out.println(result);			
		} else {
			System.out.println("查询为空");
		}
	}

	@Override
	public void getAll(Connection conn) {
		String sql = "select id, name, email, birth from customers";
		List<Customers> result = queryAll(Customers.class, conn, sql);
		result.forEach(System.out :: println);
	}

	@Override
	public Long getCount(Connection conn) {
		String sql = "select count(*) from customers";
		Long value = (long)getValue(conn, sql);
		if (value != 0) {
			System.out.println(value);
		} else {
			System.out.println("查询为空");
		}
		return value;
	}

	@Override
	public Date getMaxBirth(Connection conn) {
		String sql = "select Max(birth) from customers";
		Date date = (Date)getValue(conn, sql);
		System.out.println(date);
		return date;
		
	}

}

以上代码是自己根据提示手敲的,以后希望可静下心来仔细看看代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC的学习(02) 的相关文章

  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 通过向上转换将 Java.sql.date 转换为 Java.util.date 安全吗?

    java sql date 扩展了 java util date 那么通过将 java sql date 转换为 java util date 是否可以在两者之间进行转换 或者有其他方法可以转换它们吗 您不一定需要强制转换 您可以将 SQL
  • 无法打开 JDBC 连接以执行 DDL

    我的 spring beans 出现以下错误 创建名称为 employeeRepositoryDAOImple 的 bean 时出错 通过 setSessionFactory 方法表达的依赖关系未得到满足 参数0 嵌套异常是 org spr
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 后台线程的 JDBC 连接在 Websphere 中关闭访问

    我有一个应用程序在Websphere Application Server 6 0 WAS 内的Websphere Portal Server 中运行 在此应用程序中 对于一个需要很长时间才能完成的特定功能 我将触发一个执行此操作的新线程
  • Oracle 更新/插入卡住、DB CPU 为 100%、并发度高、来自客户端的 SQL*Net 等待消息

    我们有一个 JavaEE 应用程序在 Weblogic 上针对 Oracle 11g DB 运行 使用瘦 JDBC 驱动程序 最近 我们在生产中发生了一系列事件 其中某个表的更新和插入被卡住或花费的时间比正常情况长得多 而且没有明显的原因
  • 如何使用jdbc驱动编写事务?

    我想使用 jdbc 编写一个事务java 我尝试过这个简单的交易 BEGIN TRANSACTION NL GO NL UPDATE table SET col test where id 1010 NL GO NL COMMIT 我尝试过
  • JDBC set_approle

    我正在尝试使用prepareCall 通过 JDBC 连接设置应用程序角色 它似乎工作正常 即语法方面 但 SQL Server 2008 返回此错误 Application roles can only be activated at t
  • 用户“root”@“localhost”的访问被拒绝

    我正在尝试从数据库中获取记录 但我面临这个访问被拒绝的问题 我尝试了 Stack Overflow 上提到的其他解决方案 例如向用户授予权限 但没有任何效果 访问数据库的代码 public void service HttpServletR
  • 当相应的 JTextfield 为空时,如何填充 JTable 中的所有项目

    我正在 Java 项目中设计一个高级搜索选项sqlite在 NetBeans 中 有5种不同JTextfields和 5 列 我想填充JTable具有相应的匹配标准 如果一个JTextfield为空 那么它应该选择该列的所有项目 我使用的查
  • SQL Server 2000 JDBC 驱动程序

    我试图找到 SQL SERVER 2000 JDBC 驱动程序 用于从 SQL SERVER 提取数据 并执行一些用 Java JSF 实现的操作 知道在哪里可以找到司机吗 毫不奇怪 Microsoft com MSDN 停止支持并因此提供
  • Kafka JDBC Sink Connector,批量插入值

    我每秒收到很多消息 通过 http 协议 50000 100000 并希望将它们保存到 PostgreSql 我决定使用 Kafka JDBC Sink 来实现此目的 消息以一条记录保存到数据库 而不是批量保存 我想在 PostgreSQL
  • 将 1GB 文件的内容流式传输到单列下的 sqlite 表

    下面的实现给出了具有 4 GB 堆空间的 1 GB 大小的文件的内存不足错误 Files lines 将返回一个流 但在运行 Collectors joining 时会出现堆错误 我们可以使用 jooq 和 jdbc 保留原始行分隔符来流式
  • 在 jdbc 程序中使用时,通过 SQL 客户端插入表中的记录未显示

    我使用 SQL 客户端和 JDBC 程序将几行插入到我的表 EMP 中 使用 SQL 客户端插入的记录不会显示在 Java 的输出控制台中 我正在使用 Java 8 和 oracle 11g 数据库来插入和读取数据库 除了通过 SQL 客户
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java

随机推荐

  • 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%

    背景 启动是App给用户的第一印象 xff0c 对用户体验至关重要 抖音的业务迭代迅速 xff0c 如果放任不管 xff0c 启动速度会一点点劣化 为此抖音iOS客户端团队做了大量优化工作 xff0c 除了传统的修改业务代码方式 xff0c
  • supervisor安装使用

    supervisord服务进程管理器 一 安装 yum span class token function install span supervisor 二 目录及使用 安装后 1 生成 etc supervisord conf 配置文件
  • laravel引入第三方云平台及使用方法

    一 引入第三方类 1 阿里oss span class token function composer span require jacobcyl ali oss storage 2 1 2 腾讯cos span class token f
  • 在ubuntu上安装多个版本的CUDA,并且可以随时切换

    前言 实验室工作站被多人使用导致需求不同的cuda版本 xff0c 一直没找到一个完全完整靠谱的教程 xff0c 这是我参考几个博客完成测试的全过程记录 xff0c 方便以后操作 xff0c 无任何商业用途 xff0c 如有侵权 xff0c
  • 在CentOS运行APPIMAGE文件时提示AppImages require FUSE to run

    输入如下命令行 xff1a yum enablerepo 61 epel y install fuse sshfs install from EPEL user 61 w h o a m
  • C++中的虚函数详解

    虚函数在运行时绑定 xff0c 即运行时确定执行的函数 所谓的后期绑定就是一个基类中有一个虚函数 xff0c 而派生类中重写了这个函数 xff0c 那么调用的这个虚函数的时候根据类的实例的不同而调用不同的函数 实例化是指在面向对象的编程中
  • Android中的Log输出

    安卓系统的代码量十分庞大 xff0c 无法使用Jlink之类的工具进行单步调试 xff0c 因而日志系统十分有必要 为此 xff0c 安卓开发了Log日志类用于开发者的日常调试使用 Log中配置了五种Log类 xff0c 分别表示打印五类不
  • C++中的模板类

    什么是模板类 xff1a C 43 43 发展到一定层次后 xff0c 必然有部分代码存在仅传参的数据类型不同而内容一致的情况 因此 xff0c C 43 43 为解决此类场景 xff0c 特推出模板类的使用 模板类是一种泛型技术 xff0
  • 【C/C++】指针赋初值问题

    先说结论 xff1a 指针在使用时一定要进行初始化 一 问题来源 问题提示 xff1a null pointer dereference 此问题在编译时无误 xff0c 在运行 时出的问题 xff0c 排查起来非常头疼 一开始没头绪 xff
  • 【Linux应用编程基础】ioctl函数

    一 为什么需要ioctl函数 在裸机开发中 xff0c 应用程序直接作用于寄存器 而在Linux开发中Linux驱动与Linux应用在代码层级上是分开的 xff0c 在实际开发过程中也是分两拨人开发的 xff0c Linux驱动服务于应用
  • 【半音阶口琴】基础汇总

    一 简谱初学习 增时线 xff1a 2 后面的三个杠表示前面音符的续音 减时线 xff1a 121 表示三个音符的时值都减半 附点 xff1a 1 39 2 结合性为先结合减时线 xff0c 再结合附点 xff0c 因此1表示3 4拍 四分
  • 抖音包大小优化-资源优化

    1 概述 随着业务的快速迭代 xff0c 抖音 Android 端的包大小爆发式增长 包大小直接影响到下载转化率 推广成本 运行内存和安装时间等因素 xff0c 因此对 apk 进行瘦身是一件很有必要且收益很大的事情 apk 主要由 dex
  • 【正点原子Linux C应用编程指南】学习里程碑总结

    前言 说实话 xff0c 当阅读正点原子的这篇文档时 xff0c 带着些许失望 xff0c 并不是文档写的不好 xff0c 而是质量明显不如RTOS和裸机部分的编写 xff0c 可能是没有实践过的原因 记得朱有鹏老师之前说过 xff0c 正
  • 【上位机应用开发】Python篇 A部分

    虽是嵌入式方向 xff0c 刚毕业时一直想基于C 开发一款上位机 xff0c 没争取到 xff0c 近期偶然获取到一个用python开发的宝贵机会 xff0c 记录一下 1 用Shell命令行 VS code还是集成开发环境开发的问题 xf
  • 挂载时系统提示未找到fdisk指令

    64 通俗的讲解如何在Ubuntu系统上挂在 在学习的过程中 xff0c 总结了简介的挂在 xff0c 平时一直使用的记事本记载的 xff0c 以后会慢慢记录在上面 Ubuntu14 0 04版本虚拟机挂在U盘如何操作 先让虚拟机读取到物理
  • 微信聊天记录导出

    本文将介绍如何将微信聊天记录导出为结构化数据 所需材料 一部已经root的安卓手机带GPU的Linux电脑 整体流程如下 xff1a 数据库文件提取 使用RE管理器 xff0c 在已经root的安卓手机上 xff0c 找到如下文件 xff1
  • 详解vim插件安装及配置

    前言 vim插件依赖项安装 xff1a dnf install python future dnf install python devel dnf install ncurses dnf install cmake dnf install
  • SubliemText_3配置Java的编译环境

    Sublime Text 3 添加Java环境 最近在学习Java语言 xff0c 因为写一些基础的代码练习 xff0c 而使用sublime编辑器写代码 xff0c 因为每次运行都要在命令行执行 javac 和 java 代码 xff0c
  • JDBC的学习(01)

    关于JDBC的学习 1 JDBC的简介 JDBC Java DataBase Connectivity 是由Sun公司为简化java程序访问数据库而制定的一套面向对象的应用程序的接口 它规定了一套访问数据库的API xff0c 该API对应
  • JDBC的学习(02)

    关于JDBC的学习 xff08 2 xff09 文章目录 关于JDBC的学习 xff08 2 xff09 Blob类型和批量操作1 Blob类型操作2 批量操作 数据库事务1 事务的概念2 事务的ACID属性3 数据库的四种隔离级别数据库的