一、开头牢骚
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();
}
}
}
不知道小鱼有没有讲清楚,如果觉得小鱼的文章还不错的话,各位客官看完之后千万不要忘记点赞和评论哦!