1.JDBC事务:
JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。调用Connection的setAutoCommit(false)可以取消自动提交事务。在所有的SQL语句都成功执行后,调用commit();方法提交事务。在其中某个操作失败或出现异常时,调用rollback();方法回滚事务。
创建一个数据库:
CREATE TABLE ACCOUNT(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL DEFAULT '',
balance DOUBLE NOT NULL DEFAULT 0) CHARACTER SET utf8;
INSERT INTO ACCOUNT VALUES(NULL,'小明',3000);
INSERT INTO ACCOUNT VALUES(NULL,'小红',10000);
SELECT * FROM ACCOUNT;
使用事务:
public static void main(String[] args) { Transaction_ transaction = new Transaction_(); transaction.useTransaction(); } //事务来解决 public void useTransaction() { Connection connection = null; String sql = "update account set balance = balance - 100 where id = 1"; String sql2 = "update account set balance = balance + 100 where id = 2"; PreparedStatement preparedStatement = null; try { connection = JDBCUtils.getConnection(); //在默认情况下,connection是默认自动提交 //将 connection 设置为不自动提交 connection.setAutoCommit(false); //开启事务 preparedStatement = connection.prepareStatement(sql); preparedStatement.executeUpdate(); preparedStatement.executeUpdate(); preparedStatement = connection.prepareStatement(sql2); preparedStatement.executeUpdate(); //提交事务 connection.commit(); } catch (SQLException e) { System.out.println("执行发生了异常,撤销执行的sql"); try { connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { JDBCUtils.close(null, preparedStatement, connection); } }
2.批量处理:
批量处理允许多条语句一次性提交给数据库批量处理。addBatch():添加需要批量处理的SQL语句或参数。executeBatch():执行批量处理语句。clearBatch():清空批处理包的语句。JDBC连接MySQL时,要使用批处理功能,要在url中加参数?rewriteBatchedStatements=true
创建一个数据库:
CREATE TABLE admin2(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) NOT NULL,
PASSWORD VARCHAR(32) NOT NULL);
SELECT COUNT(*) FROM admin2;
DROP TABLE admin2;
使用批量方式:
public static void main(String[] args) throws Exception { Batch_ batch = new Batch_(); batch.batch(); } //使用批量方式添加数据 public void batch() throws Exception { Connection connection = JDBCUtils.getConnection(); String sql = "insert into admin2 values(null,?,?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); System.out.println("开始执行"); long start = System.currentTimeMillis();//开始时间 for (int i = 0; i < 5000; i++) { preparedStatement.setString(1, "jack" + i); preparedStatement.setString(2, "666"); preparedStatement.addBatch(); if ((i + 1) % 1000 == 0) { preparedStatement.executeBatch(); preparedStatement.clearBatch(); } } long end = System.currentTimeMillis();//结束时间 System.out.println("批量方式 耗时=" + (end - start)); JDBCUtils.close(null, preparedStatement, connection); }
3.数据库连接池:
预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。数据库连接池种类:C3P0数据库连接池;DBCP数据库连接池;Proxool数据库连接池;BoneCP数据库连接池;Druid是阿里提供的数据库连接池。