欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java JDBC 数据源

程序员文章站 2022-04-18 18:27:21
数据源有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有自动回收闲置连接的功能,性能更优。

Java JDBC  数据源

下载,解压后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具备。