1. 导语
Druid德鲁伊是阿里巴巴出品的一个数据库连接池,结合了DBCP、C3P0、PROXOOL等数据库连接池的优点,同时添加了日志监控功能,可以很好的监控D数据库连接池和SQL的执行情况,可以说是市场上目前性价比超高、超好用的数据库连接池。作为国人,我们应为之感到骄傲。
使用连接池,在编码上,仅仅是改变了Java程序连接数据库这一连接部分,之前是JDBC直连数据库,且运行一次程序就连接一次数据库,最重要的,每次连接数据库,就要耗费较多资源,拿钱做比喻的话,就是很烧钱!!!
程序员和资本家们,当然不能这样搞烧钱的事。
你还别说,一群比较有头脑的人,发明了一种东西—数据库连接池。
简而言之,数据库连接池出现的原因,就是为了避免烧钱。
2. 使用数据库连接池好处
但这里还是有必要说一下,数据库连接池的好处:
- 连接资源重用
- 系统的响应速度更快
- 属于一种新的资源分配的手段(以前我们是从数据库服务器直接获取连接实现交互。现在我们只需要从连接池中拿连接,用完了,再放回连接池即可,而不必大费周章的去直接连接数据库)
- 避免服务器(一言不合就)宕机(——“不好了,老板,服务器挂了,已经有很多用户再投诉了!!!” ——“扣你工资!”)
上面已经提到,数据库连接池,相比传统直连数据库的程序编写步骤,仅仅在连接数据库方面有区别。
3. 使用步骤
(1)引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
(2)自己可以根据需要写一个配置文件,这里命名为druid.properties
driverClassName = com.mysql.cj.jdbc.Driver
url=jdbc:mysql://...
username=root
password=root
#初始化时建立物理连接的个数
initialSize=10
#最大连接池数量
maxActive=20
#获取连接时最大等待时间
maxWait=10000
参考地址:
https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
(3)使用连接池操作数据库,这里使用单例模式来创建,只创建一个druid数据库连接池
public class JDBCUtils {
private static JDBCUtils instance;
DataSource dataSource;
static {
instance = new JDBCUtils();
}
public static JDBCUtils getInstance(){
return instance;
}
/*
* 读取配置文件
* */
private JDBCUtils() {
//数据源配置
Properties prop = new Properties();
//读取配置文件
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
try {
//返回的是DataSource
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
/**设置连接*/
public Connection getConnection() throws Exception{
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**关闭资源*/
public static void closeResoure (Connection conn, PreparedStatement ps){
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException throwables) {
//
throwables.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
4、调用方法
(1)增加
public static void addElectricCode(ElectricConsumptionCode eCode) throws Exception {
Connection conn = getInstance().getConnection();
String sql = "insert into mp_device_electric_consumption_code_statistics_1d values(?,?,?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1,eCode.getElectricId());
ps.setObject(2,eCode.getYear());
ps.setObject(3,eCode.getMonth());
ps.setObject(4,eCode.getDateTime());
ps.setObject(5,eCode.getRateType());
ps.setObject(6,eCode.getElectricCode());
ps.setObject(7,eCode.getCreateTime());
ps.execute();
JDBCUtils.closeResoure(conn,ps);
}
(2)查询
public static int selectElectricCodeCount(String electricId, Date date, int rateType) throws Exception {
Connection conn = getInstance().getConnection();
String sql = "select count(*) from mp_device_electric_consumption_code_statistics_1d where electric_id = ? and date_time= ? and rate_type = ?";
PreparedStatement ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1,electricId);
ps.setObject(2,date);
ps.setObject(3,rateType);
ResultSet rs = ps.executeQuery();
int count = 0;
while (rs.next()){
count = rs.getInt(1);
}
JDBCUtils.closeResoure(conn,ps);
return count;
}
(3)更新
public static void updateElectric(String electricId, Date date, int rateType, double electricValue) throws Exception {
Connection conn = getInstance().getConnection();
String sql = "update mp_device_electric_consumption_statistics_1d set electric = ? where electric_id = ? and date_time= ? and rate_type = ?";
PreparedStatement ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1,electricValue);
ps.setObject(2,electricId);
ps.setObject(3,date);
ps.setObject(4,rateType);
ps.execute();
JDBCUtils.closeResoure(conn,ps);
}
参考:
https://blog.csdn.net/QQQZSJ/article/details/107217043?spm=1001.2014.3001.5506