小白我又来了,经历一次去大厂面试,提前进行了web两天的恶补。就想写点什么。
一直比较熟悉的就是利用servlet技术进行开发,在这过程中,虽然使用了三层模式,但是还总是发现哪里不对劲,因为在写数据库过程中,要一直不停的调用MysqlUtils类构造方法中的数据库建立链接方法。之前总看到出c3p0,今天根据自己理解讲下。
传统的数据库操作一直都是:创建数据库驱动driven;建立链接connection;传sql;查;返回结果集result。
在进行操作时,要一直进行这几步骤。要不停的与数据库建立连接。所以,上千万同时访问数据库时,容易使数据库崩溃,造成内存溢出。连接池的作用是充当一个缓冲的作用,你可以预先设定连接池的大小,和它的最大连接数。当需要建立连接时候从里面取,用完放回。
有两种方式:
public class C3P0 {
/**
* 手动配置
*/
@Test
public void demo() {
Connection conn = null;
PreparedStatement pre = null;
ResultSet res = null;
try {
// 创建连接池
ComboPooledDataSource cp = new ComboPooledDataSource();
// 设置参数
cp.setJdbcUrl("jdbc:mysql://localhost:3306/lesson?characterEncoding=utf-8");
cp.setUser("root");
cp.setPassword("123456");
// 设置最大连接数
cp.setMaxPoolSize(20);
// 设置初始化连接池中中有多少连接
cp.setInitialPoolSize(3);
//连接数据库连接池
conn = cp.getConnection();
//写SQL
String sql = "select * from course";
pre = conn.prepareStatement(sql);
res = pre.executeQuery();
while(res.next()) {
int id = res.getInt("cid");
String name = res.getString("cname");
String category = res.getString("cteacher");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
C3P0.cleans(conn, pre, res);
}
}
方法二:
利用xml,放在src下,C3P0包会自动加载c3p0-config.xml
<c3p0-config>
<default-config>
<property name="jdbcUrl">
jdbc:mysql://localhost:3306/lesson?characterEncoding=utf-8
</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 池参数配置 -->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
public class C3P0{
/**
* 配置文件的方式
*/
@Test
public void demo() {
Connection conn = null;
PreparedStatement pre = null;
ResultSet res = null;
try {
// 获得连接
ComboPooledDataSource cp = new ComboPooledDataSource();
conn = cp.getConnection();
String sql = "select * from course";
pre = conn.prepareStatement(sql);
res = pre.executeQuery();
while(res.next()) {
int id = res.getInt("cid");
String name = res.getString("cname");
String category = res.getString("cteacher");
}
} catch (Exception e) {
} finally {
C3P0.cleans(conn, pre, res);
}
}