浅说JDBC连接

发布于:2023-01-11 ⋅ 阅读:(620) ⋅ 点赞:(0)

目录

1.三大重点

1.1.ORM 框架

1.2.连接池

解决方案在5解决方案

1.3.日志log

2.问题

3.解决方案

3.1   1个连接?  单例模式。

3.2  若干个连接(服务者)。

3.3  使用第三方的连接池组件    C3P0


1.三大重点

1.1.ORM 框架

jdbc取出来的是记录集  resultSet,遍历(同时取字段)

取出来直接就是对象集合。配置(表book  ----------实体类Book)

1.2.连接池

web开发

如果现在同时有 十万个浏览器在访问 网站,是不是就有 十万个连接Connection在内存中?

解决方案在5解决方案

1.3.日志log

jdbc:报错?是否看到了执行的sql语句是什么?

增删改查

classpath:类的查找路径

2.问题

web开发同时有10万个浏览器访问网站,就有10万个连接,内存就会被撑爆

3.解决方案

3.1   1个连接?  单例模式。

public class JDBCUtil {
    static Connection con = null;
    public static Connection getConnection(){
        if (con != null){
            return con;
        }
        else {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/shop?user=root&password=123456");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            return con;
        }
    }
}
public class MyTest {
    public static void main(String[] args) throws Exception{
        Connection con = JDBCUtil.getConnection();
        Connection con2 = JDBCUtil.getConnection();
        System.out.println(con == con2);  //false
        System.out.println(con);
        System.out.println(con2);
    }
}
如何判断连接是否被关闭?

 try {
            if (con != null) {
                if (!con.isClosed()) {
                    return con;
                } else {
                    con = DriverManager.getConnection(URL,USER,PASSWORD);
                    return con;
                }
            } else {
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/shop?user=root&password=123456");
                return con;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return con;
        }

 

3.2  若干个连接(服务者)。

维护——编写连接池类

  • DBpool
private static final String DIRVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/shop?";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";


    static Connection[] cons;  //10个,null
    static int count = 0;
    //静态代码块
    static {
        try {
            System.out.println("加载驱动");
            Class.forName(DIRVER);

            //准备10个连接
            cons = new Connection[10];
            for (int i = 0; i < cons.length; i++) {
                cons[i] = DriverManager.getConnection(URL,USER,PASSWORD);
            }

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

    }
    public static Connection getConnection() {
        count = count % 10 ;
        return cons[count++];

    }

  • 有什么办法可以强制连接的DBPool的方法名是getConnection()
Class DBPool implements DataSource{
		getConnection (){
		
		}
}

3.3  使用第三方的连接池组件    C3P0

new ComboPooledDataSource();



 //use  C3P0,数据源(连接池是数据源),ComboPooledDataSource()
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/shop");
        dataSource.setUser("root");
        dataSource.setPassword("123456");

        Connection con = dataSource.getConnection();

        Statement stmt = con.createStatement();

        ResultSet re = stmt.executeQuery("select * from book");
        while (re.next()){
            System.out.println(re.getString("name"));
        }


网站公告

今日签到

点亮在社区的每一天
去签到