c3p0连接池的使用
为什么需要使用连接池
在Java学习的初期,当我们需要连接数据库时,往往选择使用jdbc进行连接数据库,但jdbc不能跟数据库保持长时间的连接,只能保持非常短的时间(几百毫秒)。因此如果我们使用jdbc进行数据库连接时,那么程序在运行过程中就会频繁跟数据库建立连接,而且数据库的连接十分耗时,往往都超过了对数据更新、修改、查询的时间,因此我们需要运行连接池来去除这一弊端。
连接池原理
连接池会根据你配置的xml文件初始化多个数据库连接,长时间未使用的连接过期后会自动再建立。当你的程序需要进行数据库连接时,就会从连接池中取出一个空闲连接(仅仅耗时十几毫秒),这样就大大减少了对数据库进行连接的频率,同时提高了程序的运行效率。
连接池使用准备
1、c3p0-config.xml 文件的准备(文件名必须是c3p0-config.xml)
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/student?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
</named-config>
</c3p0-config>
复制使用时记得修改数据库的用户名和密码,并将此文件放在src的目录下。
2、导入jar包。
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
mysql-connector-java-8.0.19.jar
commons-dbutils-1.6.jar
链接:https://pan.baidu.com/s/1aWM7MWkTYhMU4PeqChGRdg
提取码:j8wm
3、连接池的使用
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is
initialized(when the Web application is deployed).
You can initialize servlet context related data here.
*/
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql = "select * from product";
List<Product> productList = queryRunner.query(sql, new BeanListHandler<Product>(Product.class));
//对象的变量名必须要和数据库中要查询的表项名一致
System.out.println(productList);
if (productList != null && productList.size() > 0) {
for (Product product : productList) {
if (product.getC_id() == 1) {
double price = product.getP_Price();
price = price - 100;
System.out.println(product.getP_Name() + "打折促销啦!现在只需" + price);
} else {
double price = product.getP_Price();
price=price-10;
System.out.println(product.getP_Name()+"打折促销啦!现在只需"+price);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}, new Date(), 1000*3);
}
结果:
[promotiom.Product@6a824460, promotiom.Product@541cde92, promotiom.Product@7d33f20f, promotiom.Product@6bc92dce, promotiom.Product@1310d593]
小米8打折促销啦!现在只需1899.0
iPhone8打折促销啦!现在只需5299.0
vivoX23打折促销啦!现在只需3899.0
牛奶打折促销啦!现在只需39.0
牙膏打折促销啦!现在只需9.0
附加:如有误,望指正。谢谢!