美文网首页每天写1000字技术干货Java学习笔记
还在用DriverManager获取数据库连接?快用DataSo

还在用DriverManager获取数据库连接?快用DataSo

作者: 王大叔的土世界 | 来源:发表于2016-11-15 10:03 被阅读439次
图片来自网络

一、开头牢骚
DriverManager是我从接触jdbc以来,一直使用的获取数据库连接的类,相当好用。
但是,在学习DataSource之前,我并没有意识到使用DriverManager会给系统带来负担和资源浪费。
因为我并没有意识到,使用DriverManager类来获取的Connection连接,是无法重复利用的。要想重复利用,必须重新创建连接。
而创建连接,又很耗费时间和资源!
所以我喜新厌旧了。
我告诉自己要开始另一段生活,要好好学习、天天向上,要上得厅堂、下得厨房,要当四有青年。
我找到了DataSource!

二、知识点讲解
1.何为数据源?
百度的答案:数据源是指数据库应用程序所使用的数据库或者数据库服务器
我的理解:数据源就是我们在MySQL中创建的每一个数据库,比如你创建了一个bbs的数据库,那么数据源就是这个bbs.

2.何为数据库连接池?
我的理解:就是一个专门用来存放和管理数据库连接对象的东西。

3.为什么要有数据库连接池?
用户每一次请求都要跟数据库建立连接,而数据库创建连接需要消耗相当大的资源,如果有十万个用户,意味着要建立十万个连接,这样子消耗数据库资源太大,也很容易出现错误。而利用连接池我们能够对连接进行管理,在数据库连接池中,有一定数量的数据库连接对象。用户每一次请求连接,都要从数据库连接池中请求,这样子的话,一个连接对象就可以被多次使用。就能够极大的提高数据库资源的利用率。
具体的对比图如下:


图片来自网络,有部分修改

4.DataSource对象代表了什么?
DataSource对象代表了一个数据源,通过DataSource对象,我们可以获取数据库连接。

三、Tomcat7中获取DataSource对象
1.在Tomcat7的conf/server.xml下的<GlobalNamingResources>节点里配置resource

//其中name="jdbc/bbs"可以随意取
//maxActive是连接池中最大激活连接数
<Resource name="jdbc/bbs"
      auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      testWhileIdle="true"
      testOnBorrow="true"
      testOnReturn="false"
      validationInterval="30000"
      timeBetweenEvictionRunsMillis="30000"
      maxActive="30"
      minIdle="5"
      maxWait="10000"
      initialSize="10"
      removeAbandonedTimeout="60"
      removeAbandoned="true"
      logAbandoned="true"
      minEvictableIdleTimeMillis="30000"
      jmxEnabled="true"
      jdbcInterceptors=
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
      username="root"
      password="123"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/bbs"/>

2.在context.xml文件的<Context></Context>节点中添加如下配置:
···
<ResourceLink global="jdbc/bbs" name="jdbc/bbs" type="javax.sql.DataSource"/>
···

3.具体的Java代码

public class DBUtil {
    public static Connection getConn() throws Exception{
        Connection conn = null;
        DataSource ds = null;
        Context ctx = new InitialContext();
        //java:comp/env是固定的,所有的数据库都一样       
        Context ctx1 = (Context)ctx.lookup("java:comp/env");
        Context ctx2 = (Context)ctx1.lookup("jdbc");
        ds = (DataSource)ctx2.lookup("bbs");
        
        if(ds != null){
            conn = ds.getConnection();  
        }
        return conn;
    }
    
    public static void closeConn(Connection conn, PreparedStatement ps, ResultSet rs){
        
            try {
                if(conn != null){
                    conn.close();
                }
                if(rs != null){
                    rs.close();
                }
                if(ps != null){
                    ps.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
}

不知道小鱼有没有讲清楚,如果觉得小鱼的文章还不错的话,各位客官看完之后千万不要忘记点赞和评论哦!

相关文章

网友评论

    本文标题:还在用DriverManager获取数据库连接?快用DataSo

    本文链接:https://www.haomeiwen.com/subject/dqmkpttx.html