重点案例: 事务的应用
无异常 转账成功:
转账卡号不存在:
转账卡号的密码不正确:
要转入的卡号不存在
转账金额大于自己卡内的余额
在转账卡号减完钱之后 转入卡号没有加钱之前 出现异常,因为应用了事务,所以 双发卡内的余额都不应改发生改变,因为事务的回滚
德鲁伊工厂类:
源代码
package day43.t7;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import jdk.internal.util.xml.impl.Input;
import javax.naming.CompositeName;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBPoolUtils {
// 连接池对象
private static DruidDataSource ds;
static {
Properties properties = new Properties();
InputStream is = DBPoolUtils.class.getResourceAsStream("/database.properties");
try {
properties.load(is);
//使用德鲁伊工厂创建一个连接池
// 后面方法得到的是一个DataSource 而我们创建的是DruidDataSource 此类是DataSource的一种子类 ,所以强转
ds =(DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){
try {
if(resultSet!=null){
resultSet.close();
}
if(statement!=null){
statement.close();
}
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
测试代码:
package day43.t7;
import com.alibaba.druid.sql.visitor.functions.Concat;
import java.sql.Connection;
public class TestDruid {
public static void main(String[] args) throws Exception {
for(int i=0;i<40;i++){
Connection connection = DBPoolUtils.getConnection();
System.out.println(i+":"+connection);
connection.close(); // 不是释放资源关闭 而是放回连接池
//此时Connection 存放的是DruidPooledConnection 实现类
//调用的close 不是关闭connection, 而是将connection归还到连接池中
}
}
}
配置文件:
因为配置文件中最大连接数量为30,在测试中 我们循环四十次获取连接,会出现超时等待时间, 5000毫秒: