发表于: 2017-10-28 21:55:31

1 720


今天完成的事

【一,准备做springmvc的更改操作】

//以下是一个修改修改学生院学生信息的语句。
@RequestMapping("/updateStudent")
public String updateStudent(HttpServletRequest request, HttpServletResponse response , HttpSession session , Model model){
//下面的语句用来拿到一个ID。
   String idStu=request.getParameter("id");
   //下面涉及了一个查询并且传入语句是string的话那我们进行转型
   Student student= studentService.selectStudentById(Integer.parseInt(idStu));
   //Model 模型中放入了返回给页面的数据
   //model 底层就是用了requst域传递数据,但对request进行了扩展
    model.addAttribute("student", student);
  // request.setAttribute();
   //如果springMVC方法返回一个简单的string字符串,那么springMVC就会认为这个字符串就是页面的名称
   return "updateStudent";

}

但是失败了。因为jsp写不好。。明天再说。。。

【二,准备了一哈小课堂】

讲了一个比较浅显的知识点。。

连接池优化我们的数据库

为什么使用连接池


Connection对象在JDBC使用的时候.使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了.每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.程序初始化的时候,初始化多个连接,将多个连接放入到池中(内存中).每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.

百度是这样说的。


简单理解就是

使用jdbc的时候,每操作一次都需要获取连接(创建)用完之后把连接释放掉了(销毁),通过连接池来优化curd操作。

连接池就像一个大池子一旦初始化就放入很多很多的链接,用的时候你来这个大池子里取,用完之后你再归还给我。这个就是我们的连接池。



作用:

提高项目的性能.

比如双十一的时候我每次只创建一个链接,好几亿人剁手,那服务器可能一定会崩掉。

所以这就体现了连接池的必要性,就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.


连接池的规范。

所有的连接池必须实现一个接 口 javax.sql.DataSource接口


获取连接方法:

Connection getConnection() 

归还连接的方法就是以前的释放资源的方法.调用connection.close();

自定义一个连接池(理解思想)

import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

import com.itheima.utils.JdbcUtils;

/**
* 自制低配连接池
* Mind 
*
*/
public class MyDataSource {
static LinkedList<Connection> pool=new LinkedList<>();
  static{
//初始化的时候 需要放入3个连接
     for (int i = 0; i < 3; i++) {
try {
Connection conn = JdbcUtils.getConnection();
           pool.addLast(conn);
        } catch (SQLException e) {
e.printStackTrace();
        }
}
}

//从连接池中获取连接
  public static Connection getConnection(){
//获取连接的时候需要判断list是否为空
     if(pool.isEmpty()){
//在添加2个连接进去
        for (int i = 0; i < 3; i++) {
try {
Connection conn = JdbcUtils.getConnection();
              pool.addLast(conn);
           } catch (SQLException e) {
e.printStackTrace();
           }
}
}
System.out.println("从池中获取一个连接");
      Connection conn = pool.removeFirst();
      //将conn进行包装
      // ConnectionWarp myConn = new ConnectionWarp(conn);
      ConnectionWarp myConn = new ConnectionWarp(conn,pool);
     return myConn;
  }

//归还连接的方法
  public static void addBack(Connection conn){
//将conn放入到list的最后面即可
     pool.addLast(conn);
     System.out.println("连接已归还");
  }
}

注意,连接池只是一个大池子。。。。。他们里面的链接还是从JDBC里面获取的。。。


常用连接池:

DBCP(理解)(tomcat使用)

   apache组织的不是son公司的,所以我们要导入jar包。 

public class DbcpDemo {
@Test
  //硬编码
  public void f1() throws Exception{
//创建连接池
     BasicDataSource ds = new BasicDataSource();
     
     //配置信息
     ds.setDriverClassName("com.mysql.jdbc.Driver");
     ds.setUrl("jdbc:mysql:///day07");
     ds.setUsername("root");
     ds.setPassword("1234");
     
     Connection conn=ds.getConnection();
     String sql="insert into category values(?,?);";
     PreparedStatement st=conn.prepareStatement(sql);
     
     //设置参数
     st.setString(1, "c011");
     st.setString(2, "饮料");
     
     int i = st.executeUpdate();
     System.out.println(i);
     JdbcUtils.closeResource(conn, st, null);
  }

@Test
  public void f2() throws Exception{
//存放配置文件
     Properties prop = new Properties();
     prop.load(new FileInputStream("src/dbcp.properties"));
     //设置
     //prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
     
     //创建连接池
     DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
     
     Connection conn=ds.getConnection();
     String sql="insert into category values(?,?);";
     PreparedStatement st=conn.prepareStatement(sql);
     
     //设置参数
     st.setString(1, "c012");
     st.setString(2, "饮料1");
     
     int i = st.executeUpdate();
     System.out.println(i);
     JdbcUtils.closeResource(conn, st, null);
  }
}

使用步骤

C3P0(一定要懂!)(spring和hibernate)

一般的数据库链接会用一个取一个用一个取一个,这样容易很臃肿。

有自动回收空闲连接的功能。


2.使用api

public class C3p0Demo {
@Test
  //硬编码
  public void f1() throws Exception{
ComboPooledDataSource ds = new ComboPooledDataSource();
     
     //设置基本参数
     ds.setDriverClass("com.mysql.jdbc.Driver");
     ds.setJdbcUrl("jdbc:mysql:///day07");
     ds.setUser("root");
     ds.setPassword("1234");
     
     Connection conn=ds.getConnection();
     String sql="insert into category values(?,?);";
     PreparedStatement st=conn.prepareStatement(sql);
     
     //设置参数
     st.setString(1, "c013");
     st.setString(2, "毒药");
     
     int i = st.executeUpdate();
     System.out.println(i);
     JdbcUtils.closeResource(conn, st, null);
  }

@Test
  public void f2() throws Exception{
//ComboPooledDataSource ds = new ComboPooledDataSource();
     ComboPooledDataSource ds =new ComboPooledDataSource("itcast12321");//若查找不到命名的配置 使用默认的配置
     Connection conn=ds.getConnection();
     String sql="insert into category values(?,?);";
     PreparedStatement st=conn.prepareStatement(sql);
     
     //设置参数
     st.setString(1, "c124");
     st.setString(2, "解药");
     
     int i = st.executeUpdate();
     System.out.println(i);
     JdbcUtils.closeResource(conn, st, null);
  }
}

配置文件的名称:c3p0.properties 或者 c3p0-config.xml

配置文件的路径:src下

编码只需要一句话

new ComboPooledDataSource()//使用默认的配置

new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默认的配置



 


遇到的问题

500报错。。可以说头一次见了。

解决方法,maven-clean。

在运行,没问题了。。。。我还等着找日志呢。。。玄学。

收获

对连接池进行了一下整理,顺便任务二前进了一丢地

明天要做的事

学习jsp.


返回列表 返回列表
评论

    分享到