- 事务 :
处理事务的两个动作: 提交:commit: 回滚:rollback:
-
事务的ACID属性:
1. 原子性(Atomicity):要么都执行,要么都不执行;
2. 一致性(Consistency)
3. 隔离性(Isolation): 并发执行的事务之间彼此相互独立、互不干扰;
4. 持久性(Durability): 事务提交后,数据是永久性的、不可回滚; -
如何在代码中去处理事务:
1.在JDBC中缺省情况下,事务是自动提交的,控制事务必须先设置事务为手动提交.
connection对象.setAutoCommit(false);
2.手动的提交事务.
connection对象.commit();
3.若出现异常必须回滚事务:
不回滚事务,总余额依然是正确的. 若不回滚事务,不会释放数据库资源.
connection对象.rollback();
-----------------------------------------------------------------------------------
1.在JDBC在事务是默认提交的,在执行一个DML/DDL操作的时候,就已经提交事务了.
2.查询操作没有事务.
3.以后,是正确的,但是数据库表中的数据不变----->事务没提交的问题. -
批量操作(batch):可以采用Java的批量更新机制,允许多条语句一次性提交给数据库批量处理。JDBC的批量处理语句包括下面两个方法:
addBatch(String): 添加需要批量处理的SQL语句或是参数;
executeBatch(): 执行批量处理语句;通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理; : Statement
一个SQL语句的批量传参; : PreparedStatement在JDBC中,MySQL不支持批量操作.
-------------------------------------------------------------------------
Statement 批处理 : 一次性可以执行多条sql语句,需要编译多次。
应用场景:系统初始化 (创建表,创建数据等)
添加sql语句,st.addBatch(sql)
批量处理sql语句,int[] st.executeBatch()
清除缓存: st.clearBatch();
-------------------------------------------------------------------------
PreparedStatement 批处理 : 执行一条sql语句,编译一次,执行sql语句的参数不同。
应用场景:表数据初始化
添加批量参数:ps.addBatch() 添加参数之前,需要ps.setXxx()
执行批处理:int[] ps.executeBatch()
清除缓存:ps.clearBatch();结论:
MySQL服务器既不支持PreparedStatement的性能优化,也不支持JDBC中的批量操作.
但是,在新的JDBC驱动中,我们可以通过设置参数来优化.
url=jdbc:mysql://localhost:3306/jdbcdemo?rewriteBatchedStatements=true -
BLOB是可变的数据类型
--------------------------------------------------------------------------------
TINYBLOB 255个字节
BLOB 65535字节
MEDIUMBLOB 16M
LONGBLOB 4G
--------------------------------------------------------------------------------
MySQL中的TEXT类型,和VARCHAR是一样的, 在Java代码中,都是作为String类型.
--------------------------------------------------------------------------------
TINYTEXT 255个字节
TEXT 65535字节
MEDIUMTEXT 16M
LONGTEXT 4GBLOB 系列和 Text 系列都是可变长的.
-
获取自动生成的主键
Statement:
int executeUpdate(String sql,int autoGeneratedKeys):执行SQL:
参数:autoGeneratedKeys,是否需要返回自动生成的主键.常量值:Statement.RETURN_GENERATED_KEYS
ResultSet getGeneratedKeys():获取自动生成的主键
PreparedStatement:
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) :创建PreparedStatement对象,并指定是否需要返回生成的主键. 参数的常量值:Statement.RETURN_GENERATED_KEYS -
在Java中,连接池使用javax.sql.DataSource接口来表示连接池. DataSource仅仅只是一个接口,由第三方组织提供实现).
常用的DataSource的实现:
DBCP: Spring推荐的
C3P0: Hibernate推荐的
druid: 阿里
1): 获取连接的方式不同
2):释放资源时不同 -
DBCP连接池 DataSource ds= BasicDataSourceFactory.createDataSource(Properties);
拷贝jar:
commons-dbcp-1.3.jar commons-pool-1.5.6.jar .
查阅文档:commons-dbcp-1.3-src\doc\BasicDataSourceExample.java
--------------------------------------
应该把连接信息放到配置文件中去: 配置文件的名词可以任意.
但是配置文件中的key,必须是BasicDataSource对象的属性(setXxx方法决定的属性);
-----------------------------------------------------------------------------------
dbcp.properties
#连接字符串
url=jdbc:mysql://localhost:3306/jdbcdemo
#用户名
username=root
#密码
password=admin
#驱动的类路径
driverClassName=com.mysql.jdbc.Driver
#连接池启动时的初始值
initialSize=5
#连接池的最大值
maxActive=50
#连接池的最大空闲数
maxIdle=20 -
druid (德鲁伊);Java语言领域性能最好的
拷贝jar包
文档 : https://github.com/alibaba/druid/wiki
类似于DBCP连接池. -
德鲁伊失败,MySQL版本太高,转载:https://www.jianshu.com/p/582ae6d91154
jdbc-连接池--MySQL版本太高,连接池失败-待解决
最新推荐文章于 2022-10-14 23:45:00 发布