当前位置: 移动技术网 > IT编程>开发语言>Java > Java JDBC 数据源

Java JDBC 数据源

2019年08月19日  | 移动技术网IT编程  | 我要评论
数据源有2种: 普通数据源 即数据库驱动自带的数据源 连接池 包括数据库驱动自带的连接池,以及DBCP、C3P0等常用的第三方连接池。 数据库驱动自带的数据源 我导入的是Mysql的数据库驱动,mysql驱动提供的自然是mysql数据源,已经默认注册了mysql数据库驱动,我们不必手动注册。如果导入 ...

 

数据源有2种:

  • 普通数据源     即数据库驱动自带的数据源
  • 连接池     包括数据库驱动自带的连接池,以及dbcp、c3p0等常用的第三方连接池。

 

 

数据库驱动自带的数据源

 1 //从properties文件加载数据源配置
 2         properties properties = new properties();
 3         inputstream is = class.forname("test.test").getresourceasstream("/mysqldatasource.properties");
 4         properties.load(is);
 5         string url=properties.getproperty("url");
 6         string user = properties.getproperty("user");
 7         string password = properties.getproperty("password");
 8 
 9         //设置普通数据源,因为使用的是mysqldatasource类,驱动自然只能是mysql的驱动,这个类已经把数据库驱动设置好了,不用我们设置。
10         mysqldatasource mysqldatasource = new mysqldatasource();
11         mysqldatasource.seturl(url);   //还有个方法seturl(),这2个方法完全一样,因为seturl()的函数体就是调用seturl()
12         mysqldatasource.setuser(user);
13         mysqldatasource.setpassword(password);
14 
15         //获取连接,操作数据库
16         connection connection = mysqldatasource.getconnection();
17         string sql = "insert into student_tb (name,age,score) values (?,?,?)";
18         preparedstatement preparedstatement = connection.preparestatement(sql);
19         preparedstatement.setstring(1,"chy");
20         preparedstatement.setint(2,20);
21         preparedstatement.setint(3,100);
22         preparedstatement.executeupdate();
23         preparedstatement.close();
24         connection.close();

 

我导入的是mysql的数据库驱动,mysql驱动提供的自然是mysql数据源,已经默认注册了mysql数据库驱动,我们不必手动注册。如果导入的其他数据库的驱动,提供的自然就是该种数据库的数据源。

 

一般来说,数据库驱动都会提供2种数据源:普通数据源、连接池。

mysql驱动提供的普通数据源是mysqldatasource,连接池是mysqlconnectionpooldatasource,看名字就知道是连接池数据源。

 

 

 

 

数据库驱动自带的连接池

 1 //从properties文件加载数据源配置
 2         properties properties = new properties();
 3         inputstream is = class.forname("test.test").getresourceasstream("/mysqldatasource.properties");
 4         properties.load(is);
 5         string url=properties.getproperty("url");
 6         string user = properties.getproperty("user");
 7         string password = properties.getproperty("password");
 8 
 9         //设置连接池
10         mysqlconnectionpooldatasource pooldatasource = new mysqlconnectionpooldatasource();
11         pooldatasource.seturl(url);
12         pooldatasource.setuser(user);
13         pooldatasource.setpassword(password);
14 
15         //获取连接,操作数据库
16         connection connection = pooldatasource.getconnection();
17         string sql = "insert into student_tb (name,age,score) values (?,?,?)";
18         preparedstatement ps = connection.preparestatement(sql);
19         ps.setstring(1,"chy");
20         ps.setint(2,20);
21         ps.setint(3,99);
22         ps.executeupdate();
23         connection.close();

 

普通数据源采用直连数据库的方式,调用  getconnection() 获取连接时,实际上底层仍是调用  drivermanager.getconnection(url, user, password); 来获取连接;关闭连接时,就是实实在在地关闭连接,释放资源。

连接池是在服务器上创建一个连接池,预先建立一些数据库连接,放在连接池中,调用  getconnection() 获取连接时,只是从连接池中取出一个连接,调用close()关闭连接时,并不是真的关闭连接,是由连接池回收连接,下次还可以接着用。创建数据库连接是很花时间的,使用连接池减少了时间开销。

 

数据源适合需要多次创建数据库连接的应用,如果不使用数据源,一个一个地drivermanager.getconnection(url, user, password);传入url、user、password创建连接,很麻烦。

连接池数据源适合需要创建多个连接的应用。

 

 

 

 

dbcp数据源

dbcp是apache的一个开源项目,tomcat的连接池就是使用dbcp来实现的。

 

使用dbcp需要2个jar包:

  • commons-dbcp.jar   dbcp的核心包,下载压缩包后里面有
  • commons-pool.jar   dbcp的依赖,需要单独去下载

这2个都是在apache上下载,下载的时候要注意对应我们的jdk版本(实际上是对应jdk中jdbc的版本)。

 

此外,还需要2个额外的jar包:

  • commons-logging.jar   日志包
  • 数据库驱动

 

dbcp常用的数据源类是basicdatasource。

 1 //从properties文件加载数据源配置
 2         properties properties = new properties();
 3         inputstream is = class.forname("test.test").getresourceasstream("/datasource.properties");
 4         properties.load(is);
 5         string driverstr = properties.getproperty("driver");
 6         string url=properties.getproperty("url");
 7         string username = properties.getproperty("username");
 8         string password = properties.getproperty("password");
 9 
10         //设置连接池
11         basicdatasource datasource = new basicdatasource();
12         //这些第三方的数据源不知道我们使用的是何种数据库,所以要手动设置数据库驱动
13         datasource.setdriverclassname(driverstr);  //注意是setdriverclassname(),参数才是string
14         /*
15         也可以这样写:
16         java.sql.driver driver = drivermanager.getdriver(driverstr);
17         datasource.setdriver(driver);  //参数是java.sql.driver
18         driver类在多个包下都有,注意不要写错了。
19         建议使用前一种,更简单,不容易出错。
20          */
21         datasource.seturl(url);
22         datasource.setusername(username);  //注意是setusername(),不是setuser()
23         datasource.setpassword(password);
24 
25         //从数据源获取连接获取连接,操作数据库
26         connection connection = datasource.getconnection();
27         string sql = "insert into student_tb (name,age,score) values (?,?,?)";
28         preparedstatement ps = connection.preparestatement(sql);
29         ps.setstring(1,"chy");
30         ps.setint(2,20);
31         ps.setint(3,99);
32         ps.executeupdate();
33         connection.close();

 

可以通过工厂来创建数据源:

basicdatasource datasource= basicdatasourcefactory.createdatasource(properties);   //参数是properties类型

十分简便,但对properties中的key有严格要求,比如说:

setusername()  =>  去掉set,后面部分变为camel写法,username。

如果key写错了,比如写成了user,会报错: access denied for user ''@'localhost' (using password: yes)  ,有时候报的是no。

 

可以给数据源设置一些其他参数,比如:

  datasource.setinitialsize(5);  //设置初始连接数,初始化连接池时会创建5个连接,放到连接池中
        datasource.setminidle(2);  //设置最小空闲连接数,连接池中至少有2个连接是空闲的。idle,闲置的、无所事事。
        datasource.setmaxtotal(20);  //设置最大连接数,连接池中最多可以有20个连接
        //......

 

 

 

 

c3p0数据源

c3p0是mchange的开源项目,相比于dbcp,c3p0有自动回收闲置连接的功能,性能更优。

下载,解压后lib文件夹下有3个jar包,把c3p0.jar、mchange-commons-java.jar这2个jar包添加到项目中,带oracle的那个是oracel才用的。

把数据库驱动添加到项目中。

dbcp是apache的,要添加自家的日志包commons-logging.jar,c3p0则不必添加日志包。

 

c3p0常用的数据源类是combopooleddatasource。

 1 //从properties文件加载数据源配置
 2         properties properties = new properties();
 3         inputstream is = class.forname("test.test2").getresourceasstream("/datasource.properties");
 4         properties.load(is);
 5         string driver = properties.getproperty("driver");
 6         string jdbcurl=properties.getproperty("jdbcurl");
 7         string user = properties.getproperty("user");
 8         string password = properties.getproperty("password");
 9 
10         //配置数据源
11         combopooleddatasource datasource = new combopooleddatasource();
12         datasource.setdriverclass(driver);  //只有这个方法,没有setdriver()
13         datasource.setjdbcurl(jdbcurl);   //注意是setjdbcurl(),和其他数据源不同
14         datasource.setuser(user);
15         datasource.setpassword(password);
16 
17         //从数据源获取连接,操作数据库
18         connection connection = datasource.getconnection();
19         string sql = "insert into student_tb (name,age,score) values (?,?,?)";
20         preparedstatement ps = connection.preparestatement(sql);
21         ps.setstring(1,"chy");
22         ps.setint(2,20);
23         ps.setint(3,99);
24         ps.executeupdate();
25         connection.close();

 

相比于dbcp,c3p0可以设置更多的配置参数,比如:

  datasource.setmaxstatements(10);
    datasource.setmaxstatementsperconnection(10);

 

dbcp不具备自动回收空闲连接的功能,c3p0具备。

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网