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是阿里提供的数据库连接池。
本文介绍了JDBC事务的使用,包括如何开启和提交事务,以及在发生异常时如何回滚。同时,展示了批量处理在数据库操作中的优势,通过示例演示了如何执行批量SQL语句以提高效率。最后,讨论了数据库连接池的概念,解释了其在管理数据库连接中的作用,并列举了几种常见的连接池实现,如C3P0和Druid,以实现更高效的资源利用。
1872

被折叠的 条评论
为什么被折叠?



